Chage type from list to dict for mapping objects 26/117626/1
authorhyokeun <hyokeun.jeon@samsung.com>
Tue, 7 Mar 2017 02:35:36 +0000 (11:35 +0900)
committerhyokeun <hyokeun.jeon@samsung.com>
Tue, 7 Mar 2017 02:36:30 +0000 (11:36 +0900)
1. Type change
2. Spec file check routine merge

Change-Id: I253846124c5717711e92c38f3d138723697226c5

common/mapping.py
job_submit.py
job_submitobs.py

index a65d01a..007c45f 100644 (file)
@@ -44,18 +44,27 @@ class Mapping(object):
     @staticmethod
     def __encode_to_ascii(source):
         """ encode unicode list element to ascii """
-        dest = []
-        for i in source:
-            if type(i) == unicode:
-                dest.append(i.encode('ascii'))
-            else:
-                dest.append(i)
+        if type(source) == list:
+            dest = []
+            for i in source:
+                if type(i) == unicode:
+                    dest.append(i.encode('ascii'))
+                else:
+                    dest.append(i)
+        elif type(source) == dict:
+            dest = {}
+            for i in source:
+                if type(source[i]) == unicode:
+                    dest[i] = source[i].encode('ascii')
+                else:
+                    dest[i] = source[i]
         return dest
 
     def __get_mapping(self, obj, branch=None):
         """ get OBS target project under one object(project or path) """
 
         mapping = []
+        key_list = ['OBS_project', 'OBS_staging_project', 'OBS_package', 'OBS_use_specname']
 
         if obj.submission == 'N':
             # <project name="public/tools/ext4-utils" submission="N"/>
@@ -67,19 +76,20 @@ class Mapping(object):
                     if brch.submission == 'N':
                         return None
                     else:
-                        mapping.append(self.__encode_to_ascii(\
-                                [brch.OBS_project,
-                                 brch.OBS_staging_project,
-                                 brch.OBS_package]))
+                        brch_dict = {}
+                        for key in key_list:
+                            brch_dict[key] = brch.__getitem__(key)
+                        mapping.append(self.__encode_to_ascii(brch_dict))
         else:
             for brch in obj.branch:
                 if brch.submission == 'N':
                     continue
                 else:
-                    mapping.append(self.__encode_to_ascii(\
-                            [brch.OBS_project,
-                             brch.OBS_staging_project,
-                             brch.OBS_package]))
+                    brch_dict = {}
+                    for key in key_list:
+                        brch_dict[key] = brch.__getitem__(key) or None
+                    mapping.append(self.__encode_to_ascii(brch_dict))
+
         return mapping
 
     def get_submit_mapping(self, project, branch=None):
@@ -167,31 +177,42 @@ class MappingV2(object):
     @staticmethod
     def __encode_to_ascii(source):
         """ encode unicode list element to ascii """
-        dest = []
-        for i in source:
-            if type(i) == unicode:
-                dest.append(i.encode('ascii'))
-            else:
-                dest.append(i)
+        if type(source) == list:
+            dest = []
+            for i in source:
+                if type(i) == unicode:
+                    dest.append(i.encode('ascii'))
+                else:
+                    dest.append(i)
+        elif type(source) == dict:
+            dest = {}
+            for i in source:
+                if type(source[i]) == unicode:
+                    dest[i] = source[i].encode('ascii')
+                else:
+                    dest[i] = source[i]
         return dest
 
-    def get_submit_mapping(self, project, branch=None, include_config=False):
+    def get_submit_mapping(self, project, branch=None):
         """Get submit mapping though project or branch"""
         mapping = []
-        config_enabled = True
 
         if self.mapping_obj.configure:
             # if configure.enable is false then return []
             if self.mapping_obj.configure.enable == 'false':
                 config_enabled = False
 
-        if config_enabled and self.mapping_obj.branch:
+        if self.mapping_obj.branch:
             for brch in self.mapping_obj.branch:
                 for prj in brch.project:
                     if (prj.name == project or prj.name == '/' + project) and ( branch in brch.name.split(",") ):
-                        item = self.__encode_to_ascii([brch.OBS_project, brch.OBS_staging_project, prj.OBS_package])
-                        if include_config:
-                            item.append(self.mapping_obj.configure)
+                        item = {}
+                        item['OBS_project'] = brch.OBS_project
+                        item['OBS_staging_project'] = brch.OBS_staging_project
+                        item['OBS_package'] = prj.OBS_package
+                        item['OBS_use_specname'] = self.mapping_obj.configure.OBS_use_specname
+                        item = self.__encode_to_ascii(item)
+                        item['config'] = self.mapping_obj.configure
                         mapping.append(item)
 
         return mapping
@@ -233,8 +254,7 @@ class MappingV2(object):
         return branchs
 
 def git_obs_map(gerrit_prj, gerrit_branch=None, gitcache=None, \
-                gerrit_hostname=None, gerrit_username=None, gerrit_sshport=None, \
-                include_config=False):
+                gerrit_hostname=None, gerrit_username=None, gerrit_sshport=None):
     """
     Find an OBS project[s correspondent to Gerrit project and branch
     by parsing git-obs-mapping.xml.
@@ -284,8 +304,7 @@ def git_obs_map(gerrit_prj, gerrit_branch=None, gitcache=None, \
     for file in mapping_v2_file_lists:
         mymapping_v2 = MappingV2(file)
         obs_prjs.extend(mymapping_v2.get_submit_mapping(gerrit_prj,
-                                                        gerrit_branch,
-                                                        include_config=include_config))
+                                                        gerrit_branch))
 
     # remove overlapped items
     obs_prjs = remove_overlaps(obs_prjs)
index 89279de..a6c13a2 100755 (executable)
@@ -219,20 +219,12 @@ def check_tag_format(git, mygerrit, event, tag, mappingbranchs):
 
     return True
 
-def find_specfile(prj_dir, packaging_dir, tag, event, tagger, pkg_name=None):
+def find_specfile(prj_dir, packaging_dir, tag, event, tagger, pkg_name=None, debug_prj_name=None):
     """search specfile under packaging directory"""
 
     msg = ''
 
-    if pkg_name:
-        spec = '%s/%s/%s.spec' % (prj_dir, packaging_dir, pkg_name)
-        if not os.path.isfile(spec):
-            msg = "The tag %s pushed, but backend service can not find %s \n"\
-                    "under packaging directory, which is caused by mistake \n"\
-                    "OBS_PACKAGE parameter in scm/git-obs-mapping project. \n"\
-                    "Please correct it or contact system administrator for \n"\
-                    "more details." % (tag, os.path.basename(spec))
-    else:
+    if True:
         specs = utils.find_spec('%s/%s' % (prj_dir, packaging_dir))
         if not specs:
             # no spec exist under packaging, use default name
@@ -242,10 +234,17 @@ def find_specfile(prj_dir, packaging_dir, tag, event, tagger, pkg_name=None):
         elif len(specs) == 1:
             # only one spec exist under packaging
             spec = specs[0]
+            print 'Single spec. Use %s' % os.path.basename(spec)
         else:
             # multiple specs exist under packaging, use default name
-            spec = '%s/%s/%s.spec' % (prj_dir, packaging_dir, \
-                    os.path.basename(event['project']))
+            spec = None
+            if pkg_name:
+                spec = '%s/%s/%s.spec' % (prj_dir, packaging_dir, pkg_name)
+                print 'Multiple specs. Try %s' % os.path.basename(spec)
+            if spec is None or not os.path.isfile(spec):
+                spec = '%s/%s/%s.spec' % (prj_dir, packaging_dir, \
+                        os.path.basename(event['project']))
+                print 'Multiple specs with no pkg_name.spec. Try %s' % os.path.basename(spec)
             if not os.path.isfile(spec):
                 msg = "The tag %s pushed, but packaging directory contains \n"\
                         "multiply spec files, backend service can not decide \n"\
@@ -255,6 +254,8 @@ def find_specfile(prj_dir, packaging_dir, tag, event, tagger, pkg_name=None):
                         "administrator for more details." % tag
 
     if msg:
+        if debug_prj_name is not None:
+            msg = "TARGET_PROJECT: %s\n%s" % (debug_prj_name, msg)
         print msg
         send_mail(TITLE_FAILED % (tag, event['project']), msg, tagger)
         return None
@@ -603,7 +604,7 @@ def main(build_type):
     tagger = mygit.get_tag(tag)
 
     # get list of target projects from git-obs-mapping
-    obs_target_prjs = git_obs_map(os.getenv("GERRIT_PROJECT"), git_branch, include_config=True)
+    obs_target_prjs = git_obs_map(os.getenv("GERRIT_PROJECT"), git_branch)
     build = BuildService(obs_api, obs_user, obs_passwd)
 
     # prepare submit_info
@@ -620,10 +621,13 @@ def main(build_type):
 
     for item in obs_target_prjs:
         enable_build = True
-        obs_target_prj, obs_stg_prj, obs_pkg = item[0:3]
-        if len(item) >= 4 and item[3].build == 'no':
+        obs_target_prj = item['OBS_project']
+        obs_stg_prj = item['OBS_staging_project']
+        obs_pkg = item['OBS_package']
+        if 'config' in item and item['config'] is not None and item['config'].build == 'no':
             print 'Set disable build for %s' % (obs_target_prj)
             enable_build = False
+
         url = 'ssh://%s:%s' % (os.getenv('GERRIT_HOSTNAME'),
                                os.getenv('GERRIT_SSHPORT'))
         # get package name from xml files.
@@ -654,7 +658,8 @@ def main(build_type):
                         submitter += ' <%s>' % gerrit_account_email
 
                 # search specfile under packaging directory
-                #specfile = find_specfile(prjdir, packagingdir, tag, event, tagger, obs_pkg)
+                #specfile = find_specfile(prjdir, packagingdir, tag, event, tagger, obs_pkg,\
+                #                         debug_prj_name=obs_target_prj)
                 #if not specfile:
                 #    continue
 
index a915990..fb5981b 100755 (executable)
@@ -397,7 +397,9 @@ def main():
     # generate tarball and submit to obs
     for target in obstargets:
         mygit.clean(directories=True, force=True)
-        (obs_dst_prj, obs_stg_prj, obs_pkg) = target
+        obs_dst_prj = target['OBS_project']
+        obs_stg_prj = target['OBS_staging_project']
+        obs_pkg = target['OBS_package']
         if not obs_dst_prj:
             continue