From 3656e9af926b99e567d1ad4d7c70e09c0eb4e979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=BCdepohl?= <lorenz.huedepohl@rzg.mpg.de> Date: Thu, 22 Nov 2018 10:22:17 +0100 Subject: [PATCH] Refactor mpcdf_sync_projects into common function --- mpcdf_common.py | 69 ++++++++++++++++++++++++++++++++++++++++++ mpcdf_sync_projects.py | 62 ++----------------------------------- 2 files changed, 71 insertions(+), 60 deletions(-) diff --git a/mpcdf_common.py b/mpcdf_common.py index e761ac6..96d459d 100644 --- a/mpcdf_common.py +++ b/mpcdf_common.py @@ -447,3 +447,72 @@ def set_as_branch(api_url, my_project, my_package, main_project, main_package): rev = pac.latest_rev(expand=True) pac.update(rev) return True + + +def sync_projects(api_url, package=None, from_project="software", to_projects=None, redo_all=False): + if package is not None and redo_all: + raise osc.oscerr.WrongArgs('Cannot specify `redo_all` and package') + + if to_projects is None: + 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 redo_all: + from_packages = list(sorted(set(from_packages) - set(to_packages))) + 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: + get_attribute(api_url, to_project, None, attribute) + except Exception: + attr = get_attribute(api_url, from_project, None, attribute) + print("Setting attribute", attribute) + 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) + else: + print("Not branching package {0}, already present in target".format(orig_package)) + + for attribute in package_attributes: + try: + attr = get_attribute(api_url, from_project, orig_package, attribute) + except UnsetAttributeException: + if has_attribute(api_url, to_project, orig_package, attribute): + remove_attribute(api_url, to_project, orig_package, attribute) + continue + set_attribute(api_url, to_project, orig_package, attr) + + if package is None and redo_all: + # Check if distribution is already set in to_project + to_prj_meta = project_meta(api_url, to_project) + sys_repo = to_prj_meta.find('./repository[@name="System"]') + if sys_repo is None: + distribution = 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_setup_repositories(api_url, to_project, distribution) + else: + for orig_package in from_packages: + if not mpcdf_enable_repositories(api_url, to_project, orig_package): + print("ATTENTION: Not changing unmanaged package {0}".format(orig_package)) diff --git a/mpcdf_sync_projects.py b/mpcdf_sync_projects.py index 24470e6..734c3df 100644 --- a/mpcdf_sync_projects.py +++ b/mpcdf_sync_projects.py @@ -51,64 +51,6 @@ def do_mpcdf_sync_projects(self, subcmd, opts, *args): if opts.to: to_projects = [opts.to] else: - 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)) + to_projects = None - 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: - 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) - 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)) + mpcdf_common.sync_projects(api_url, package, from_project=from_project, to_projects=to_projects, redo_all=opts.all) -- GitLab