From e22c165ab0f111eedc913379bcb2fa22a5f3b7cd Mon Sep 17 00:00:00 2001 From: hyokeun Date: Tue, 7 Mar 2017 11:35:36 +0900 Subject: [PATCH] Chage type from list to dict for mapping objects 1. Type change 2. Spec file check routine merge Change-Id: I253846124c5717711e92c38f3d138723697226c5 --- common/mapping.py | 79 ++++++++++++++++++++++++++++++++++--------------------- job_submit.py | 37 +++++++++++++++----------- job_submitobs.py | 4 ++- 3 files changed, 73 insertions(+), 47 deletions(-) diff --git a/common/mapping.py b/common/mapping.py index a65d01a..007c45f 100644 --- a/common/mapping.py +++ b/common/mapping.py @@ -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': # @@ -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) diff --git a/job_submit.py b/job_submit.py index 89279de..a6c13a2 100755 --- a/job_submit.py +++ b/job_submit.py @@ -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 diff --git a/job_submitobs.py b/job_submitobs.py index a915990..fb5981b 100755 --- a/job_submitobs.py +++ b/job_submitobs.py @@ -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 -- 2.7.4