From 9261518954d300c206e092f113473023779b8e01 Mon Sep 17 00:00:00 2001 From: Alberto Planas Date: Mon, 18 Aug 2014 17:18:00 +0200 Subject: [PATCH] Implement the openSUSE:XX.X:Devel workflow. --- osc-check_repo.py | 3 +++ osc-check_source.py | 43 +++++++++++++++++++++++++++++++++++-------- osclib/checkrepo.py | 40 +++++++++++++++++++++++++++++++--------- 3 files changed, 69 insertions(+), 17 deletions(-) diff --git a/osc-check_repo.py b/osc-check_repo.py index 9a99c4b6..37d7d393 100644 --- a/osc-check_repo.py +++ b/osc-check_repo.py @@ -343,6 +343,7 @@ def _check_repo_group(self, id_, requests): msg = 'Builds for repo %s' % rq.goodrepo print 'ACCEPTED', msg self.checkrepo.change_review_state(rq.request_id, 'accepted', message=msg) + self.checkrepo.remove_link_if_shadow_devel(rq) rq.updated = True updated[rq.request_id] = 1 @@ -389,6 +390,8 @@ def do_check_repo(self, subcmd, opts, *args): msg = 'skip review' print 'ACCEPTED', msg self.checkrepo.change_review_state(id_, 'accepted', message=msg) + _request = self.checkrepo.get_request(id_, internal=True) + self.checkrepo.remove_link_if_shadow_devel(_request) return prjs = [arg for arg in args if not arg.isdigit()] diff --git a/osc-check_source.py b/osc-check_source.py index 03ca722b..837d51ac 100644 --- a/osc-check_source.py +++ b/osc-check_source.py @@ -17,9 +17,13 @@ from xml.etree import cElementTree as ET from osc.core import checkout_package from osc.core import http_GET from osc.core import http_POST +# from osc.core import link_pac from osc.core import makeurl +# from osc.core import show_upstream_rev_vrev from osc import cmdln +from osclib.stagingapi import StagingAPI + # For a description of this decorator, visit # http://www.imdb.com/title/tt0067756/ @@ -140,6 +144,15 @@ def _checker_accept_request(self, opts, id_, msg, diff=10000): print("accepted " + msg) +class FakeAction(object): + def __init__(self, src_project, src_package, tgt_project, tgt_package, src_rev): + self.src_project = src_project + self.src_package = src_package + self.tgt_project = tgt_project + self.tgt_package = tgt_package + self.src_rev = src_rev + + def _checker_one_request(self, rq, opts): if (opts.verbose): ET.dump(rq) @@ -183,6 +196,24 @@ def _checker_one_request(self, rq, opts): print ("\n%s %s/%s -> %s/%s" % (subm_id, prj, pkg, tprj, tpkg)) + + # Check if the package comes from openSUSE:Factory and + # have a release target (like openSUSE:13.2) + if prj == 'openSUSE:Factory' and tprj == 'openSUSE:%s' % self.api.opensuse: + fake_devel_prj = 'openSUSE:%s:Devel' % self.api.opensuse + + # _rev, _vrev = show_upstream_rev_vrev(opts.apiurl, prj, pkg, revision=rev, expand=True) + # assert _rev == rev, 'Revision is not the same' + # link_pac(src_project=prj, src_package=pkg, + # dst_project=fake_devel_prj, dst_package=tpkg, + # force=True, + # rev=_rev, vrev=_vrev) + + act = FakeAction(pkg, prj, tprj, tpkg, rev) + self.api.submit_to_prj(act, fake_devel_prj) + self._checker_accept_request(opts, id_, 'The request is linked to %s' % fake_devel_prj, diff=0) + continue + dpkg = self._checker_check_devel_package(opts, tprj, tpkg) # white list self._devel_projects['X11:Bumblebee/'] = 'x2go' @@ -294,10 +325,6 @@ def _checker_check_devel_package(self, opts, project, package): key = "%s/%s" % (project, package) if key in self._devel_projects: return self._devel_projects[key] - if project == 'openSUSE:13.2': - if opts.verbose: - print 'no devel project for %s found in %s, retry using Factory projects' % (package, project) - return self._checker_check_devel_package(opts, 'openSUSE:Factory', package) @cmdln.option('-v', '--verbose', action='store_true', help="verbose output") @@ -315,10 +342,10 @@ def do_check_source(self, subcmd, opts, *args): """ self._devel_projects = {} - self.opensuse = opts.project - opts.apiurl = self.get_api_url() + self.api = StagingAPI(opts.apiurl, opts.project) + if len(args) and args[0] == 'skip': for id_ in args[1:]: self._checker_accept_request(opts, id_, 'skip review') @@ -330,7 +357,7 @@ def do_check_source(self, subcmd, opts, *args): if not ids: review = "@by_group='factory-auto'+and+@state='new'" - target = "@project='openSUSE:{}'".format(self.opensuse) + target = "@project='openSUSE:{}'".format(self.api.opensuse) url = makeurl(opts.apiurl, ('search', 'request'), "match=state/@name='review'+and+review[%s]+and+target[%s]" % (review, target)) root = ET.parse(http_GET(url)).getroot() @@ -338,7 +365,7 @@ def do_check_source(self, subcmd, opts, *args): self._checker_one_request(rq, opts) else: # we have a list, use them. - for id_ in ids.keys(): + for id_ in ids: url = makeurl(opts.apiurl, ('request', id_)) f = http_GET(url) xml = ET.parse(f) diff --git a/osclib/checkrepo.py b/osclib/checkrepo.py index f937e981..a7558cd7 100644 --- a/osclib/checkrepo.py +++ b/osclib/checkrepo.py @@ -61,10 +61,19 @@ class Request(object): self.is_partially_cached = False self.action_type = 'submit' # assume default self.downloads = [] + self.is_shadow_devel = False if element: self.load(element) + # Detect if the request comes from Factory to a openSUSE + # release, and adjust the source and target projects + _is_product = re.match(r'openSUSE:\d{2}.\d', self.tgt_project) + if self.src_project == 'openSUSE:Factory' and _is_product: + self.is_shadow_devel = True + self.org_src_project, self.src_project = self.src_project, '%s:Devel' % self.tgt_project + self.org_src_package, self.src_package = self.src_package, self.tgt_package + def load(self, element): """Load a node from a ElementTree request XML element.""" self.request_id = int(element.get('id')) @@ -89,14 +98,16 @@ class Request(object): self.missings = [] def str_compact(self): - return '#[%s](%s)' % (self.request_id, self.src_package) + return '#[%s](%s)%s' % (self.request_id, self.src_package, + ' Shadow' if self.is_shadow_devel else '') def __repr__(self): - return '#[%s] %s/%s -> %s/%s' % (self.request_id, - self.src_project, - self.src_package, - self.tgt_project, - self.tgt_package) + return '#[%s] %s/%s -> %s/%s%s' % (self.request_id, + self.src_project, + self.src_package, + self.tgt_project, + self.tgt_package, + ' Shadow' if self.is_shadow_devel else '') class CheckRepo(object): @@ -177,12 +188,14 @@ class CheckRepo(object): print('ERROR in URL %s [%s]' % (url, e)) return code - def get_request(self, request_id): - """Get a request XML onject.""" + def get_request(self, request_id, internal=False): + """Get a request XML or internal object.""" request = None try: url = makeurl(self.apiurl, ('request', str(request_id))) request = ET.parse(http_GET(url)).getroot() + if internal: + request = Request(element=request) except urllib2.HTTPError, e: print('ERROR in URL %s [%s]' % (url, e)) return request @@ -419,7 +432,7 @@ class CheckRepo(object): except KeyError as e: # This exception happends some times when there is an # 'error' attribute in the package information XML - rq.error = "There is an error in the SPEC file." % (rq.src_project, spec) + rq.error = 'There is an error in the SPEC file for (%s, %s).' % (rq.src_project, spec) rq.updated = True continue @@ -856,3 +869,12 @@ class CheckRepo(object): # print " - WARNING: Can't found list of packages (RPM) for %s in %s (%s, %s)" % ( # package, project, repository, arch) return files + + def remove_link_if_shadow_devel(self, request): + """If the request is a shadow_devel (the reference is to a request + that is a link from the product to Factory), remove the link + to transform it as a normal request. + + """ + if request.is_shadow_devel: + self.staging.delete_to_prj(request, request.src_project)