diff --git a/osc-staging.py b/osc-staging.py index 912abbea..e741f841 100644 --- a/osc-staging.py +++ b/osc-staging.py @@ -26,6 +26,7 @@ from osc import oscerr _plugin_dir = os.path.expanduser('~/.osc-plugins') sys.path.append(_plugin_dir) from osclib.accept_command import AcceptCommand +from osclib.adi_command import AdiCommand from osclib.check_command import CheckCommand from osclib.cleanup_rings import CleanupRings from osclib.conf import Config @@ -35,7 +36,6 @@ from osclib.obslock import OBSLock from osclib.select_command import SelectCommand from osclib.stagingapi import StagingAPI from osclib.unselect_command import UnselectCommand -from osclib.adi_command import AdiCommand OSC_STAGING_VERSION = '0.0.1' @@ -168,7 +168,7 @@ def do_staging(self, subcmd, opts, *args): api.mark_additional_packages(tprj, [opts.add]) else: SelectCommand(api, tprj).perform(args[2:], opts.move, - opts.from_, opts.no_freeze) + opts.from_, opts.no_freeze) elif cmd == 'cleanup_rings': CleanupRings(api).perform() elif cmd == 'list': diff --git a/osclib/checkrepo.py b/osclib/checkrepo.py index 4980c20c..389e115e 100644 --- a/osclib/checkrepo.py +++ b/osclib/checkrepo.py @@ -296,16 +296,13 @@ class CheckRepo(object): def _last_build_success(self, src_project, tgt_project, src_package, rev): """Return the last build success XML document from OBS.""" xml = '' - try: - url = makeurl(self.apiurl, - ('build', src_project, - '_result?lastsuccess&package=%s&pathproject=%s&srcmd5=%s' % ( - quote_plus(src_package), - quote_plus(tgt_project), - rev))) - xml = http_GET(url).read() - except urllib2.HTTPError, e: - print('ERROR in URL %s [%s]' % (url, e)) + url = makeurl(self.apiurl, + ('build', src_project, + '_result?lastsuccess&package=%s&pathproject=%s&srcmd5=%s' % ( + quote_plus(src_package), + quote_plus(tgt_project), + rev))) + xml = http_GET(url).read() return xml @memoize() @@ -487,8 +484,9 @@ class CheckRepo(object): rq.updated = True continue - if (spec_info['project'] != rq.src_project - or spec_info['package'] != rq.src_package) and not rq.updated: + is_src_diff = (spec_info['project'] != rq.src_project or + spec_info['package'] != rq.src_package) + if is_src_diff and not rq.updated: msg = '%s/%s should _link to %s/%s' % (rq.src_project, spec, rq.src_project, @@ -535,17 +533,18 @@ class CheckRepo(object): """ repos_to_check = [] - root_xml = self.last_build_success(request.shadow_src_project, - request.tgt_project, - request.src_package, - request.verifymd5) - - if root_xml: - root = ET.fromstring(root_xml) - else: - print ' - The request is not built agains this project' - return repos_to_check + try: + root_xml = self.last_build_success(request.shadow_src_project, + request.tgt_project, + request.src_package, + request.verifymd5) + except urllib2.HTTPError as e: + if 300 <= e.code <= 499: + print ' - The request is not built agains this project' + return repos_to_check + raise e + root = ET.fromstring(root_xml) for repo in root.findall('repository'): intel_archs = [a for a in repo.findall('arch') if a.attrib['arch'] in ('i586', 'x86_64')] @@ -716,7 +715,17 @@ class CheckRepo(object): # If the request do not build properly in both Intel platforms, # return False. - repos_to_check = self.repositories_to_check(request) + try: + repos_to_check = self.repositories_to_check(request) + except urllib2.HTTPError as e: + if 500 <= e.code <= 599: + print ' - Temporal error in OBS: %s %s' % (e.code, e.msg) + else: + print ' - Unknown error in OBS: %s %s' % (e.code, e.msg) + # Ignore this request until OBS error dissapears + request.updated = True + return False + if not repos_to_check: msg = 'Missing i586 and x86_64 in the repo list' print ' - %s' % msg diff --git a/osclib/freeze_command.py b/osclib/freeze_command.py index f91ec5de..4fa6383d 100644 --- a/osclib/freeze_command.py +++ b/osclib/freeze_command.py @@ -122,6 +122,8 @@ class FreezeCommand(object): self.freeze_prjlinks() + build_status = self.api.get_flag_in_prj(prj, flag='build') + # If there is not a bootstrap repository, there is not # anything more to do. if not self.is_bootstrap(): @@ -149,6 +151,9 @@ class FreezeCommand(object): for arch in ['x86_64', 'ppc64le']: self.update_product_version(prj + ':DVD', 'Test-DVD-' + arch, arch, version) + # Set the original build status for the project + self.api.build_switch_prj(prj, build_status) + def update_product_version(self, project, product, arch, version): if not self.api.item_exists(project, product): return None diff --git a/osclib/memoize.py b/osclib/memoize.py index fb3b6019..f56be30b 100644 --- a/osclib/memoize.py +++ b/osclib/memoize.py @@ -40,7 +40,7 @@ except ImportError: CACHEDIR = save_cache_path('opensuse-repo-checker') -def memoize(ttl=None, session=False, is_method=False): +def memoize(ttl=None, session=False, add_invalidate=False): """Decorator function to implement a persistent cache. >>> @memoize() @@ -172,7 +172,7 @@ def memoize(ttl=None, session=False, is_method=False): def total_seconds(td): return (td.microseconds + (td.seconds + td.days * 24 * 3600.) * 10**6) / 10**6 now = datetime.now() - if is_method: + if add_invalidate: _self = args[0] _add_invalidate_method(_self) key = _key((args[1:], kwargs)) diff --git a/osclib/stagingapi.py b/osclib/stagingapi.py index fc72242a..234bc42c 100644 --- a/osclib/stagingapi.py +++ b/osclib/stagingapi.py @@ -422,7 +422,7 @@ class StagingAPI(object): # self.accept_non_ring_request(rq) self.update_superseded_request(rq) - @memoize(ttl=60, session=True, is_method=True) + @memoize(ttl=60, session=True, add_invalidate=True) def get_prj_pseudometa(self, project): """ Gets project data from YAML in project description @@ -879,6 +879,17 @@ class StagingAPI(object): self.do_change_review_state(request_id, state, by_project=project, message=msg) + def get_flag_in_prj(self, project, flag='build', repository=None, arch=None): + """Return the flag value in a project.""" + url = self.makeurl(['source', project, '_meta']) + root = ET.parse(http_GET(url)).getroot() + section = root.find(flag) + for status in section: + is_repository = status.get('repository', None) == repository + is_arch = status.get('arch', None) == arch + if is_repository and is_arch: + return status.tag + def switch_flag_in_prj(self, project, flag='build', state='disable', repository=None, arch=None): url = self.makeurl(['source', project, '_meta']) prjmeta = ET.parse(http_GET(url)).getroot()