diff --git a/NEWS b/NEWS index 7f5e71d1..258d1524 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ # Features which requires OBS 2.3 # - support dryrun of branching to preview the expected result. "osc sm" is doing this now by default. + - maintenance requests accept package lists as source and target incidents to be merged in 0.133 - add --meta option also to "list", "cat" and "less" commands diff --git a/osc/commandline.py b/osc/commandline.py index 40658211..6d9190aa 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -2617,6 +2617,10 @@ Please submit there instead, or use --nodevelproject to force direct submission. help='specify message TEXT') @cmdln.option('--no-cleanup', action='store_true', help='do not remove source project on accept') + @cmdln.option('--incident', metavar='INCIDENT', + help='specify incident number to merge in') + @cmdln.option('--incident-project', metavar='INCIDENT_PROJECT', + help='specify incident project to merge in') def do_maintenancerequest(self, subcmd, opts, *args): """${cmd_name}: Create a request for starting a maintenance incident. @@ -2628,7 +2632,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. the "patchinfo" command how add the required maintenance update information. usage: - osc maintenancerequest [ SOURCEPROJECT [ TARGETPROJECT ] ] + osc maintenancerequest [ SOURCEPROJECT [ SOURCEPACKAGES ] ] ${cmd_option_list} """ @@ -2638,22 +2642,21 @@ Please submit there instead, or use --nodevelproject to force direct submission. if opts.attribute: maintenance_attribute = opts.attribute - source_project = target_project = opt_sourceupdate = None + source_project = source_packages = target_project = opt_sourceupdate = None if not opts.no_cleanup: opt_sourceupdate = 'cleanup' - if len(args) > 2: - raise oscerr.WrongArgs('Too many arguments.') - if len(args) == 0 and is_project_dir(os.curdir): source_project = store_read_project(os.curdir) elif len(args) == 0: raise oscerr.WrongArgs('Too few arguments.') if len(args) > 0: source_project = args[0] - if len(args) > 1: - target_project = args[1] + source_packages = args[1:] + + if opts.incident_project: + target_project = opts.incident_project else: xpath = 'attribute/@name = \'%s\'' % maintenance_attribute res = search(apiurl, project_id=xpath) @@ -2662,12 +2665,14 @@ Please submit there instead, or use --nodevelproject to force direct submission. if project is None: sys.exit('Unable to find defined OBS:MaintenanceProject project on server.') target_project = project.get('name') + if opts.incident: + target_project += ":" + opts.incident print 'Using target project \'%s\'' % target_project if not opts.message: opts.message = edit_message() - r = create_maintenance_request(apiurl, source_project, target_project, opt_sourceupdate, opts.message) + r = create_maintenance_request(apiurl, source_project, source_packages, target_project, opt_sourceupdate, opts.message) print r.reqid diff --git a/osc/core.py b/osc/core.py index 2f30ca2c..aceaeccb 100644 --- a/osc/core.py +++ b/osc/core.py @@ -2196,7 +2196,7 @@ class Action: 'add_role': ('tgt_project', 'tgt_package', 'person_name', 'person_role', 'group_name', 'group_role'), 'set_bugowner': ('tgt_project', 'tgt_package', 'person_name'), # obsoleted by add_role 'maintenance_release': ('src_project', 'src_package', 'src_rev', 'tgt_project', 'tgt_package', 'person_name'), - 'maintenance_incident': ('src_project', 'tgt_project', 'person_name', 'opt_sourceupdate'), + 'maintenance_incident': ('src_project', 'src_package', 'src_rev', 'tgt_project', 'person_name', 'opt_sourceupdate'), 'delete': ('tgt_project', 'tgt_package'), 'change_devel': ('src_project', 'src_package', 'tgt_project', 'tgt_package')} # attribute prefix to element name map (only needed for abbreviated attributes) @@ -3418,10 +3418,14 @@ def create_release_request(apiurl, src_project, message=''): return r # create a maintenance incident per request -def create_maintenance_request(apiurl, src_project, tgt_project, opt_sourceupdate, message=''): +def create_maintenance_request(apiurl, src_project, src_packages, tgt_project, opt_sourceupdate, message=''): import cgi r = Request() - r.add_action('maintenance_incident', src_project=src_project, tgt_project=tgt_project, opt_sourceupdate = opt_sourceupdate) + if src_packages: + for p in src_packages: + r.add_action('maintenance_incident', src_project=src_project, src_package=p, tgt_project=tgt_project, opt_sourceupdate = opt_sourceupdate) + else: + r.add_action('maintenance_incident', src_project=src_project, tgt_project=tgt_project, opt_sourceupdate = opt_sourceupdate) # XXX: clarify why we need the unicode(...) stuff r.description = cgi.escape(unicode(message, 'utf8')) r.create(apiurl)