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