Fix the aggregate packages are always broken state.
authorZhuoX Li <zhuox.li@intel.com>
Fri, 21 Nov 2014 10:50:48 +0000 (18:50 +0800)
committerZhuoX Li <zhuox.li@intel.com>
Mon, 29 Dec 2014 02:18:27 +0000 (10:18 +0800)
In a prerelease project (not related to aggregate packages),
the aggregate packages linked from the main project are always
in broken state.Keep the meta of aggregate packages are the same
as the main project to solve it.

Change-Id: Iad5e7365150701fa832ed0b3f2de2d47c8acd927
Fixes: #2188

common/buildservice.py
job_submit.py

index 2935c08..6f270bf 100644 (file)
@@ -347,6 +347,20 @@ class BuildService(OSC):
                                  self.apiurl, False)
         self.core_http(core.http_PUT, url, data=''.join(config))
 
+    def copy_package_meta(self, obs_source_project, package, \
+                            obs_target_project):
+        """
+        Copy xml metadata of target package to
+        the meta of source package
+        """
+        meta_xml = self.get_meta(obs_target_project, package)
+        xml_root = ElementTree.fromstringlist(meta_xml)
+        project_name = xml_root.attrib.get('project')
+        if project_name != obs_source_project:
+            xml_root.attrib['project'] = obs_source_project
+            self.set_meta(ElementTree.tostring(xml_root), \
+                            obs_source_project, package)
+
     def get_package_meta(self, project, package):
         """
         get_package_meta(project, package) -> string
index d333287..f9a413a 100755 (executable)
@@ -90,6 +90,27 @@ def change_release_name(build, project, git_tag):
     # set project config
     build.set_project_config(project, config)
 
+def set_aggregate_package_meta(build, obs_source_prj, obs_target_prj):
+    """Set package metadata that include 'aggregate' from obs_source_prj.
+       Keep the metadata of aggregate packages are the same as
+       the obs_target_prj project
+    """
+    for package in build.get_package_list(obs_target_prj):
+        if 'aggregate' in package:
+            # get real project name in metadata of the package
+            realprj = build.get_package_real_project_name(obs_source_prj, \
+                                                            package)
+            # If real project name is not equal obs_source_prj,
+            # should branch the package from obs_target_prj to
+            # obs_source_prj, and copy the package metadata
+            # of obs_target_prj to obs_source_prj
+            if realprj != obs_source_prj:
+                print "branch package %s from %s" % (package, realprj)
+                build.branch_pkg(realprj, package, \
+                                   target_project = obs_source_prj)
+                # copy package  metadata of obs_source_prj to realprj
+                build.copy_package_meta(obs_source_prj, package, realprj)
+
 def create_project(git_url, git_project, git_tag, git_revision, build,
                    obs_target_prj, obs_project, submitter, package):
     """Create prerelease OBS project and upload sources for the build."""
@@ -132,6 +153,8 @@ def create_project(git_url, git_project, git_tag, git_revision, build,
         raise LocalError(err)
 
     build.link_project(obs_project, src=obs_target_prj, linktype="localdep")
+    #change the aggregate package metadata of obs_project
+    set_aggregate_package_meta(build, obs_project, obs_target_prj)
 
 def main(build_type):
     """