Commit 917e7038 authored by Lorenz Huedepohl's avatar Lorenz Huedepohl
Browse files

New and easier mpcdf_sync_projects command

parent 44fbdf5b
Pipeline #67045 passed with stage
in 15 seconds
......@@ -11,89 +11,104 @@ import osc.cmdln
@osc.cmdln.option('-a', '--all', action="store_true",
help="Update all packages in the target repository, not only new ones")
@osc.cmdln.option('-f', '--from', default="software",
help="Source project")
@osc.cmdln.option('-t', '--to',
help="Just sync with this single destination project")
def do_mpcdf_sync_projects(self, subcmd, opts, *args):
"""${cmd_name}: Push all packages from a project to another
Branch all missing packages from one project into a target project
"""${cmd_name}: Branch all/missing packages from a project to another and sync their metadata
Usage:
osc mpcdf_push FROM_PROJECT TO_PROJECT
osc mpcdf_push FROM_PROJECT PACKAGE TO_PROJECT
osc mpcdf_sync_projects
osc mpcdf_sync_projects PACKAGE
osc mpcdf_sync_projects --all-packages
Examples:
- Update the software:SLE_12_SP3:skylake project
#> osc mpcdf_sync_projects software software:SLE_12_SP3:skylake
- Sync all new packages from software into all software: sub-projects
#> osc mpcdf_sync_projects
- Sync the package foobar_1_2 into all software: sub-projects
#> osc mpcdf_sync_projects foobar_1_2
- Sync all packages from software to software:SLE_12_SP3:skylake
#> osc mpcdf_sync_projects --all-packages --to software:SLE_12_SP3:skylake
${cmd_option_list}
"""
if len(args) < 2:
raise osc.oscerr.WrongArgs("Not enough arguments")
elif len(args) == 2:
from_project, to_project = args
package = None
elif len(args) == 3:
from_project, package, to_project = args
else:
package = None
if len(args) > 1:
raise osc.oscerr.WrongArgs("Too many arguments")
elif len(args) == 1 and opts.all:
raise osc.oscerr.WrongArgs('Cannot specify `--all` and PACKAGE')
elif len(args) == 1:
package, = args
api_url = self.get_api_url()
to_packages = osc.core.meta_get_packagelist(api_url, to_project)
if package is None:
from_packages = osc.core.meta_get_packagelist(api_url, from_project)
if not opts.all:
from_packages = list(sorted(set(from_packages) - set(to_packages)))
elif opts.all:
raise osc.oscerr.WrongArgs('Cannot specify `--all` and PACKAGE')
from_project = getattr(opts, "from") if getattr(opts, "from") else "software"
if opts.to:
to_projects = [opts.to]
else:
from_packages = [package]
project_attributes = ["MPCDF:compiler_modules", "MPCDF:cuda_modules", "MPCDF:mpi_modules"]
package_attributes = ["MPCDF:enable_repositories"] + project_attributes
for attribute in project_attributes:
try:
mpcdf_common.get_attribute(api_url, to_project, None, attribute)
except Exception:
attr = mpcdf_common.get_attribute(api_url, from_project, None, attribute)
print("Setting attribute", attribute)
mpcdf_common.set_attribute(api_url, to_project, None, attr)
for orig_package in from_packages:
if orig_package not in to_packages:
filelist = osc.core.meta_get_filelist(api_url, from_project, orig_package)
if "_link" in filelist:
print("Not branching package {0}, is a link".format(orig_package))
else:
print("Branching package {0}".format(orig_package))
exists, targetprj, targetpkg, srcprj, srcpkg = \
osc.core.branch_pkg(api_url, from_project, orig_package, target_project=to_project, nodevelproject=True)
to_projects = filter(lambda s: s.startswith("software:") and not (s == "software:dist" or s == "software:images"), osc.core.meta_get_project_list(api_url))
for to_project in to_projects:
print("Syncing {0} with {1}".format(to_project, from_project))
to_packages = osc.core.meta_get_packagelist(api_url, to_project)
if package is None:
from_packages = osc.core.meta_get_packagelist(api_url, from_project)
if not opts.all:
from_packages = list(sorted(set(from_packages) - set(to_packages)))
else:
print("Not branching package {0}, already present in target".format(orig_package))
from_packages = [package]
project_attributes = ["MPCDF:compiler_modules", "MPCDF:cuda_modules", "MPCDF:mpi_modules"]
package_attributes = ["MPCDF:enable_repositories"] + project_attributes
for attribute in package_attributes:
for attribute in project_attributes:
try:
attr = mpcdf_common.get_attribute(api_url, from_project, orig_package, attribute)
except mpcdf_common.UnsetAttributeException:
if mpcdf_common.has_attribute(api_url, to_project, orig_package, attribute):
mpcdf_common.remove_attribute(api_url, to_project, orig_package, attribute)
continue
mpcdf_common.set_attribute(api_url, to_project, orig_package, attr)
if package is None and opts.all:
# Check if distribution is already set in to_project
to_prj_meta = mpcdf_common.project_meta(api_url, to_project)
sys_repo = to_prj_meta.find('./repository[@name="System"]')
if sys_repo is None:
distribution = mpcdf_common.project_meta(api_url, from_project).find('./repository[@name="System"]/path[@project="distributions"]').get("repository")
else:
distribution = sys_repo.find('./path[@project="distributions"]').get("repository")
mpcdf_common.get_attribute(api_url, to_project, None, attribute)
except Exception:
attr = mpcdf_common.get_attribute(api_url, from_project, None, attribute)
print("Setting attribute", attribute)
mpcdf_common.set_attribute(api_url, to_project, None, attr)
print("Creating repository configuration")
mpcdf_common.mpcdf_setup_repositories(api_url, to_project, distribution)
else:
for orig_package in from_packages:
if not mpcdf_common.mpcdf_enable_repositories(api_url, to_project, orig_package):
print("ATTENTION: Not changing unmanaged package {0}".format(orig_package))
if orig_package not in to_packages:
filelist = osc.core.meta_get_filelist(api_url, from_project, orig_package)
if "_link" in filelist:
print("Not branching package {0}, is a link".format(orig_package))
else:
print("Branching package {0}".format(orig_package))
exists, targetprj, targetpkg, srcprj, srcpkg = \
osc.core.branch_pkg(api_url, from_project, orig_package, target_project=to_project, nodevelproject=True)
else:
print("Not branching package {0}, already present in target".format(orig_package))
for attribute in package_attributes:
try:
attr = mpcdf_common.get_attribute(api_url, from_project, orig_package, attribute)
except mpcdf_common.UnsetAttributeException:
if mpcdf_common.has_attribute(api_url, to_project, orig_package, attribute):
mpcdf_common.remove_attribute(api_url, to_project, orig_package, attribute)
continue
mpcdf_common.set_attribute(api_url, to_project, orig_package, attr)
if package is None and opts.all:
# Check if distribution is already set in to_project
to_prj_meta = mpcdf_common.project_meta(api_url, to_project)
sys_repo = to_prj_meta.find('./repository[@name="System"]')
if sys_repo is None:
distribution = mpcdf_common.project_meta(api_url, from_project).find('./repository[@name="System"]/path[@project="distributions"]').get("repository")
else:
distribution = sys_repo.find('./path[@project="distributions"]').get("repository")
print("Creating repository configuration")
mpcdf_common.mpcdf_setup_repositories(api_url, to_project, distribution)
else:
for orig_package in from_packages:
if not mpcdf_common.mpcdf_enable_repositories(api_url, to_project, orig_package):
print("ATTENTION: Not changing unmanaged package {0}".format(orig_package))
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment