Skip to content
Snippets Groups Projects
mpcdf_setup_software_project.py 3.21 KiB
from __future__ import print_function

import osc
import osc.conf
import osc.core
import osc.cmdln

import mpcdf_common


@osc.cmdln.option('-n', '--dry-run', action="store_true",
                  help="Do not actually run anything but output the resulting XML configuration")
@osc.cmdln.option('-i', '--ignore-repo', action="append", default=[], metavar="REPO",
                  help="Do not enable for repository REPO")
@osc.cmdln.alias("mpcdf_setup_software")
def do_mpcdf_setup_software_project(self, subcmd, opts, *args):
    """${cmd_name}: Set-up the 'software' project

    This creates the 'prjconf' for the 'software' project and
    enables the repositories for packages set to build for
    'system'

    Usage:
        osc ${cmd_name}

    ${cmd_option_list}

    """

    if len(args) != 0:
        raise osc.oscerr.WrongArgs("Too many arguments")

    api_url = self.get_api_url()

    prjconf = list(map(mpcdf_common.decode_it, osc.core.show_project_conf(api_url, "software")))
    start_marker = "# Autogenerated by osc mpcdf_setup_software_project, do not edit till end of section\n"
    end_marker = "# End of autogenerated section\n"

    try:
        start = prjconf.index(start_marker)
        end = prjconf.index(end_marker)
    except ValueError:
        start = None
        end = len(prjconf)

    prjconf_head = "".join(prjconf[:start])
    prjconf_tail = "".join(prjconf[end + 1:])
    prjconf = [start_marker]

    prjconf.append("Constraint: sandbox lxc")
    prjconf.append("Constraint: hostlabel sandybridge")
    prjconf.append("")
    prjconf.append(r"PublishFilter: ^.*\.src\.rpm$")
    prjconf.append("")
    prjconf.append("Preinstall: mpcdf")
    prjconf.append("Runscripts: mpcdf")
    prjconf.append("Preinstall: mpcdf_modules")
    prjconf.append("Preinstall: brp_mpcdf_modules")
    prjconf.append("")
    prjconf.append("Macros:")
    prjconf.append("%have_mpcdf_compiler 0")
    prjconf.append("%have_mpcdf_mpi 0")
    prjconf.append("%have_mpcdf_cuda 0")
    prjconf.append(":Macros")

    software_meta = mpcdf_common.project_meta(api_url, "software")

    distributions = sorted(repo.get("name") for repo in software_meta.findall('./repository'))
    for distribution in distributions:
        extra_tags = mpcdf_common.dist_prjconf_tags(distribution)
        extra_macros = mpcdf_common.dist_prjconf_macros(distribution)

        if len(extra_tags) > 0 or len(extra_macros) > 0:
            prjconf.append("")
            prjconf.append("%if \"%_repository\" == \"{0}\"".format(distribution))
            prjconf.append(extra_tags)
            prjconf.append("")
            prjconf.append("Macros:")
            prjconf.append(extra_macros)
            prjconf.append(":Macros")
            prjconf.append("%endif")

    prjconf.append(end_marker)
    prjconf = prjconf_head + "\n".join(prjconf) + prjconf_tail

    if opts.dry_run:
        print("osc meta prjconf software -F - <<EOF\n{0}\nEOF\n".format(prjconf))
    else:
        osc.core.edit_meta("prjconf", "software", data=prjconf, apiurl=api_url)

        if opts.ignore_repo:
            ignore_repos = opts.ignore_repo
        else:
            ignore_repos = ()

        mpcdf_common.mpcdf_enable_repositories_for_all_packages(api_url, "software", ignore_repos=ignore_repos)