From 1acb0e509b4f3cd1a6316074110b3cdb1f786a41 Mon Sep 17 00:00:00 2001 From: Stephan Kulow Date: Mon, 24 Feb 2014 11:49:46 +0100 Subject: [PATCH] don't remove prj meta when freezing - Preserve title and description of the frozen prj (issue 1585) - add a small stagingapi wrapper for makeurl, makes the code easier to read - url = makeurl(self.apiurl, ... + url = self.makeurl(... - don't freeze AGGR (issue 1611) --- osc-staging.py | 3 ++- osclib/freeze_command.py | 39 +++++++++++++++++++++++---------------- osclib/stagingapi.py | 37 ++++++++++++++++++++++--------------- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/osc-staging.py b/osc-staging.py index 396189c7..62ecad96 100644 --- a/osc-staging.py +++ b/osc-staging.py @@ -198,7 +198,8 @@ def do_staging(self, subcmd, opts, *args): self._staging_submit_devel(project, opts) elif cmd in ['freeze']: import osclib.freeze_command - osclib.freeze_command.FreezeCommand(opts.apiurl).perform(api.prj_from_letter(args[1])) + for prj in args[1:]: + osclib.freeze_command.FreezeCommand(api).perform(api.prj_from_letter(prj)) elif cmd in ['accept']: import osclib.accept_command osclib.accept_command.AcceptCommand(api).perform(api.prj_from_letter(args[1])) diff --git a/osclib/freeze_command.py b/osclib/freeze_command.py index 60a4fb6b..80669f55 100644 --- a/osclib/freeze_command.py +++ b/osclib/freeze_command.py @@ -5,11 +5,11 @@ import time class FreezeCommand: - def __init__(self, apiurl): - self.apiurl = apiurl + def __init__(self, api): + self.api = api def set_links(self): - url = makeurl(self.apiurl, ['source', self.prj, '_meta']) + url = self.api.makeurl(['source', self.prj, '_meta']) f = http_GET(url) root = ET.parse(f).getroot() sources = dict() @@ -21,16 +21,23 @@ class FreezeCommand: self.projectlinks.append(link.get('project')) def set_bootstrap_copy(self): - url = makeurl(self.apiurl, ['source', self.prj, '_meta']) - meta = self.prj_meta_for_bootstrap_copy(self.prj) - http_PUT(url, data=meta) + url = self.api.makeurl(['source', self.prj, '_meta']) + + f = http_GET(url) + oldmeta = ET.parse(f).getroot() + + meta = ET.fromstring(self.prj_meta_for_bootstrap_copy(self.prj)) + meta.find('title').text = oldmeta.find('title').text + meta.find('description').text = oldmeta.find('description').text + + http_PUT(url, data=ET.tostring(meta)) def create_bootstrap_aggregate(self): self.create_bootstrap_aggregate_meta() self.create_bootstrap_aggregate_file() def bootstrap_packages(self): - url = makeurl(self.apiurl, ['source', 'openSUSE:Factory:Rings:0-Bootstrap']) + url = self.api.makeurl(['source', 'openSUSE:Factory:Rings:0-Bootstrap']) f = http_GET(url) root = ET.parse(f).getroot() l = list() @@ -42,7 +49,7 @@ class FreezeCommand: return l def create_bootstrap_aggregate_file(self): - url = makeurl(self.apiurl, ['source', self.prj, 'bootstrap-copy', '_aggregate']) + url = self.api.makeurl(['source', self.prj, 'bootstrap-copy', '_aggregate']) root = ET.Element('aggregatelist') a = ET.SubElement(root, 'aggregate', { 'project': "openSUSE:Factory:Rings:0-Bootstrap" } ) @@ -58,7 +65,7 @@ class FreezeCommand: http_PUT(url, data=ET.tostring(root)) def create_bootstrap_aggregate_meta(self): - url = makeurl(self.apiurl, ['source', self.prj, 'bootstrap-copy', '_meta']) + url = self.api.makeurl(['source', self.prj, 'bootstrap-copy', '_meta']) root = ET.Element('package', { 'project': self.prj, 'name': 'bootstrap-copy' }) ET.SubElement(root, 'title') @@ -72,7 +79,7 @@ class FreezeCommand: http_PUT(url, data=ET.tostring(root)) def build_switch_bootstrap_copy(self, state): - url = makeurl(self.apiurl, ['source', self.prj, 'bootstrap-copy', '_meta']) + url = self.api.makeurl(['source', self.prj, 'bootstrap-copy', '_meta']) pkgmeta = ET.parse(http_GET(url)).getroot() for f in pkgmeta.find('build'): @@ -82,17 +89,15 @@ class FreezeCommand: http_PUT(url, data=ET.tostring(pkgmeta)) def verify_bootstrap_copy_code(self, code): - url = makeurl(self.apiurl, ['build', self.prj, '_result'], { 'package': 'bootstrap-copy' }) + url = self.api.makeurl(['build', self.prj, '_result'], { 'package': 'bootstrap-copy' }) root = ET.parse(http_GET(url)).getroot() for result in root.findall('result'): if result.get('repository') == 'bootstrap_copy': if not result.get('code') in ['published', 'unpublished']: - print(ET.tostring(result)) return False if result.find('status').get('code') != code: - print(ET.tostring(result)) return False return True @@ -159,11 +164,11 @@ class FreezeCommand: fl = ET.SubElement(flink, 'frozenlink', { 'project': lprj } ) sources = self.receive_sources(lprj, sources, fl) - url = makeurl(self.apiurl, ['source', self.prj, '_project', '_frozenlinks'], { 'meta': '1' } ) + url = self.api.makeurl(['source', self.prj, '_project', '_frozenlinks'], { 'meta': '1' } ) http_PUT(url, data=ET.tostring(flink)) def receive_sources(self, prj, sources, flink): - url = makeurl(self.apiurl, ['source', prj], { 'view': 'info', 'nofilename': '1' } ) + url = self.api.makeurl(['source', prj], { 'view': 'info', 'nofilename': '1' } ) f = http_GET(url) root = ET.parse(f).getroot() @@ -181,12 +186,14 @@ class FreezeCommand: for linked in si.findall('linked'): if linked.get('project') in self.projectlinks: # take the unexpanded md5 from Factory link - url = makeurl(self.apiurl, ['source', 'openSUSE:Factory', package], { 'view': 'info', 'nofilename': '1' }) + url = self.api.makeurl(['source', 'openSUSE:Factory', package], { 'view': 'info', 'nofilename': '1' }) #print(package, linked.get('package'), linked.get('project')) f = http_GET(url) proot = ET.parse(f).getroot() ET.SubElement(flink, 'package', { 'name': package, 'srcmd5': proot.get('lsrcmd5'), 'vrev': si.get('vrev') }) return package + if package in ['rpmlint-mini-AGGR']: + return package # we should not freeze aggregates ET.SubElement(flink, 'package', { 'name': package, 'srcmd5': si.get('srcmd5'), 'vrev': si.get('vrev') }) return package diff --git a/osclib/stagingapi.py b/osclib/stagingapi.py index 9f2c5265..57e7f56c 100644 --- a/osclib/stagingapi.py +++ b/osclib/stagingapi.py @@ -41,6 +41,13 @@ class StagingAPI(object): self.ring_packages = self._generate_ring_packages() + def makeurl(self, l, query=[]): + """ + Wrapper around osc's makeurl passing our apiurl + :return url made for l and query + """ + return makeurl(self.apiurl, l, query) + def _generate_ring_packages(self): """ Generate dictionary with names of the rings @@ -50,7 +57,7 @@ class StagingAPI(object): ret = {} for prj in self.rings: - url = makeurl(self.apiurl, ['source', prj]) + url = self.makeurl( ['source', prj]) root = http_GET(url) for entry in ET.parse(root).getroot().findall('entry'): ret[entry.attrib['name']] = prj @@ -68,7 +75,7 @@ class StagingAPI(object): package_info = {} - url = makeurl(self.apiurl, ['source', project, pkgname]) + url = self.makeurl( ['source', project, pkgname]) content = http_GET(url) root = ET.parse(content).getroot().find('linkinfo') package_info['srcmd5'] = root.attrib['srcmd5'] @@ -110,7 +117,7 @@ class StagingAPI(object): projects = [] - url = makeurl(self.apiurl, ['search', 'project', + url = self.makeurl( ['search', 'project', 'id?match=starts-with(@name,\'openSUSE:Factory:Staging:\')']) projxml = http_GET(url) root = ET.parse(projxml).getroot() @@ -139,7 +146,7 @@ class StagingAPI(object): if by_user: query['by_user'] = by_user if by_project: query['by_project'] = by_project - url = makeurl(self.apiurl, ['request', str(request_id)], query=query) + url = self.makeurl( ['request', str(request_id)], query=query) f = http_POST(url, data=message) root = ET.parse(f).getroot() return root.attrib.get('code', '500') @@ -187,7 +194,7 @@ class StagingAPI(object): # xpath query, using the -m, -r, -s options where = "@by_group='factory-staging'+and+@state='new'" - url = makeurl(self.apiurl, ['search','request'], "match=state/@name='review'+and+review["+where+"]") + url = self.makeurl( ['search','request'], "match=state/@name='review'+and+review["+where+"]") f = http_GET(url) root = ET.parse(f).getroot() @@ -354,7 +361,7 @@ class StagingAPI(object): ET.SubElement(elm, 'disable') dst_meta = ET.tostring(root) - url = makeurl(self.apiurl, ['source', project, package, '_meta'] ) + url = self.makeurl( ['source', project, package, '_meta'] ) http_PUT(url, data=dst_meta) def check_one_request(self, request, project): @@ -365,7 +372,7 @@ class StagingAPI(object): :param request_id: request id to check """ - f = http_GET(makeurl(self.apiurl, ['request', str(request)])) + f = http_GET(self.makeurl( ['request', str(request)])) root = ET.parse(f).getroot() # relevant info for printing @@ -445,7 +452,7 @@ class StagingAPI(object): Checks the openqa state of the project :param project: project to check """ - u = makeurl(self.apiurl, ['build', project, 'images', 'x86_64', 'Test-DVD-x86_64']) + u = self.makeurl( ['build', project, 'images', 'x86_64', 'Test-DVD-x86_64']) f = http_GET(u) root = ET.parse(f).getroot() @@ -491,7 +498,7 @@ class StagingAPI(object): :param project: project to check """ # Get build results - u = makeurl(self.apiurl, ['build', project, '_result']) + u = self.makeurl( ['build', project, '_result']) f = http_GET(u) root = ET.parse(f).getroot() @@ -578,7 +585,7 @@ class StagingAPI(object): # create build disabled package self.create_package_container(project, tar_pkg, disable_build=True) # now trigger wipebinaries to emulate a delete - url = makeurl(self.apiurl, ['build', project], { 'cmd': 'wipe', 'package': tar_pkg } ) + url = self.makeurl( ['build', project], { 'cmd': 'wipe', 'package': tar_pkg } ) http_POST(url) return tar_pkg @@ -601,7 +608,7 @@ class StagingAPI(object): self.create_package_container(project, tar_pkg, disable_build=disable_build) # expand the revision to a md5 - url = makeurl(self.apiurl, ['source', src_prj, src_pkg], { 'rev': src_rev, 'expand': 1 }) + url = self.makeurl( ['source', src_prj, src_pkg], { 'rev': src_rev, 'expand': 1 }) f = http_GET(url) root = ET.parse(f).getroot() src_rev = root.attrib['srcmd5'] @@ -611,7 +618,7 @@ class StagingAPI(object): root = ET.Element('link', package=src_pkg, project=src_prj, rev=src_rev) if src_vrev: root.attrib['vrev'] = src_vrev - url = makeurl(self.apiurl, ['source', project, tar_pkg, '_link']) + url = self.makeurl( ['source', project, tar_pkg, '_link']) http_PUT(url, data=ET.tostring(root)) return tar_pkg @@ -623,7 +630,7 @@ class StagingAPI(object): def list_requests_in_prj(self, project): where = "@by_project='%s'+and+@state='new'" % project - url = makeurl(self.apiurl, ['search','request', 'id'], "match=state/@name='review'+and+review["+where+"]") + url = self.makeurl( ['search','request', 'id'], "match=state/@name='review'+and+review["+where+"]") f = http_GET(url) root = ET.parse(f).getroot() list = [] @@ -659,7 +666,7 @@ class StagingAPI(object): if len(query) == 0: raise oscerr.WrongArgs("We need a group or a project") query['cmd'] = 'addreview' - url = makeurl(self.apiurl, ['request', str(request_id)], query) + url = self.makeurl( ['request', str(request_id)], query) http_POST(url, data=msg) def set_review(self, request_id, project, state='accepted'): @@ -679,7 +686,7 @@ class StagingAPI(object): change_review_state(self.apiurl, str(request_id), state, by_project=project, message='Reviewed by staging project "{}" with result: "{}"'.format(project, state) ) def build_switch_prj(self, prj, state): - url = makeurl(self.apiurl, ['source', prj, '_meta']) + url = self.makeurl( ['source', prj, '_meta']) prjmeta = ET.parse(http_GET(url)).getroot() foundone = False