diff --git a/NEWS b/NEWS index 60428b4f..4597ffa4 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,5 @@ 0.122 - - option to download server side generated _service:* files on update - - support for running source services locally. Happens by default on source update - and build. - added missing code for 'osc sr -l [ID]' - allow osc cat with one parameter, if it is a url. - make osc getpac really get the package (instead of branch only)! @@ -10,6 +7,15 @@ - added default project to new getpac and bco subcommand. .oscrc:getpac_default_project = OpenSUSE:Factory (not added to branch subcommand, to not interfere with its syntax.) - add support for generic python-keyring lib, supports KWallet, Gnome keyring, MacOS and Windows. + # + # Features which require OBS 1.7 + # + - option to download server side generated _service:* files on update + - support for running source services locally. Happens by default on source update + and build. + - support modification flages on creation of submit request + (for auto update or clean up packages or to avoid it, when submit request got accepted) + - show request ids from package source logs 0.121.1 - fixed creation of new ~/.oscrc files diff --git a/osc/commandline.py b/osc/commandline.py index 2b427a0b..35dd1953 100755 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -501,6 +501,12 @@ class Osc(cmdln.Cmdln): @cmdln.option('--nodevelproject', action='store_true', help='do not follow a defined devel project ' \ '(primary project where a package is developed)') + @cmdln.option('--cleanup', action='store_true', + help='remove package if submission gets accepted (default for home::branch projects)') + @cmdln.option('--no-cleanup', action='store_true', + help='never remove source package on accept, but update its content') + @cmdln.option('--no-update', action='store_true', + help='never touch source package on accept (will break source links)') @cmdln.option('-d', '--diff', action='store_true', help='show diff only instead of creating the actual request') @cmdln.option('-l', '--list', action='store_true', @@ -534,6 +540,15 @@ class Osc(cmdln.Cmdln): opts.days = conf.config['request_list_days'] return self.do_request('list', opts, *args) + flags = None + # we should check here for home::branch and default to update, but that would require OBS 1.7 server + if opts.cleanup: + flags = "cleanup" + elif opts.no_cleanup: + flags = "update" + elif opts.no_update: + flags = "noupdate" + args = slash_split(args) # remove this block later again @@ -633,7 +648,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. result = create_submit_request(apiurl, src_project, src_package, dst_project, dst_package, - opts.message, orev=opts.revision) + opts.message, orev=opts.revision, flags=flags) if repl == 'y': for req in myreqs: change_request_state(apiurl, str(req.reqid), 'revoked', diff --git a/osc/core.py b/osc/core.py index 399a892c..de601af5 100755 --- a/osc/core.py +++ b/osc/core.py @@ -1411,11 +1411,12 @@ class RequestState: class Action: """represents an action""" - def __init__(self, type, src_project, src_package, src_rev, dst_project, dst_package): + def __init__(self, type, src_project, src_package, src_rev, src_modifier, dst_project, dst_package): self.type = type self.src_project = src_project self.src_package = src_package self.src_rev = src_rev + self.src_modifier = src_modifier self.dst_project = dst_project self.dst_package = dst_package @@ -1442,17 +1443,18 @@ class Request: for action in actions: type = action.get('type', 'submit') try: - src_prj = src_pkg = src_rev = dst_prj = dst_pkg = None + src_prj = src_pkg = src_rev = dst_prj = dst_pkg = src_modifier = None if action.findall('source'): n = action.find('source') src_prj = n.get('project', None) src_pkg = n.get('package', None) src_rev = n.get('rev', None) + src_modifier = n.get('modifier', None) if action.findall('target'): n = action.find('target') dst_prj = n.get('project', None) dst_pkg = n.get('package', None) - self.add_action(type, src_prj, src_pkg, src_rev, dst_prj, dst_pkg) + self.add_action(type, src_prj, src_pkg, src_rev, src_modifier, dst_prj, dst_pkg) except: msg = 'invalid request format:\n%s' % ET.tostring(root) raise oscerr.APIError(msg) @@ -1486,8 +1488,8 @@ class Request: except: pass - def add_action(self, type, src_prj, src_pkg, src_rev, dst_prj, dst_pkg): - self.actions.append(Action(type, src_prj, src_pkg, src_rev, + def add_action(self, type, src_prj, src_pkg, src_rev, src_modifier, dst_prj, dst_pkg): + self.actions.append(Action(type, src_prj, src_pkg, src_rev, src_modifier, dst_prj, dst_pkg) ) @@ -1532,7 +1534,10 @@ class Request: r="" if action.src_rev: r="(r%s)" % (action.src_rev) - action_list=action_list+" %s/%s%s -> %s" % ( action.src_project, action.src_package, r, action.dst_project ) + m="" + if action.src_modifier: + m="(%s)" % (action.src_modifier) + action_list=action_list+" %s/%s%s%s -> %s" % ( action.src_project, action.src_package, r, m, action.dst_project ) if action.dst_package: action_list=action_list+"/%s" % ( action.dst_package ) elif action.type=="delete": @@ -2337,14 +2342,18 @@ def create_change_devel_request(apiurl, def create_submit_request(apiurl, src_project, src_package, dst_project, dst_package, - message, orev=None): + message, orev=None, flags=None): import cgi + modifier="" + if flags: + modifier="""modifier="%s" """ % (flags) + # XXX: keep the old template for now in order to work with old obs instances xml = """\ - + @@ -2353,6 +2362,7 @@ def create_submit_request(apiurl, """ % (src_project, src_package, orev or show_upstream_rev(apiurl, src_project, src_package), + modifier, dst_project, dst_package, cgi.escape(message or '')) @@ -2821,7 +2831,6 @@ def make_dir(apiurl, project, package, pathname=None, prj_dir=None): def checkout_package(apiurl, project, package, revision=None, pathname=None, prj_obj=None, expand_link=False, prj_dir=None, service_files=None): - try: # the project we're in might be deleted. # that'll throw an error then. @@ -3459,24 +3468,29 @@ def get_commitlog(apiurl, prj, package, revision, format = 'text'): comment = node.find('comment').text.encode(locale.getpreferredencoding(), 'replace') except: comment = '' + try: + requestid = node.find('requestid').text.encode(locale.getpreferredencoding(), 'replace') + except: + requestid = "" t = time.localtime(int(node.find('time').text)) t = time.strftime('%Y-%m-%d %H:%M:%S', t) if format == 'csv': - s = '%s|%s|%s|%s|%s|%s' % (rev, user, t, srcmd5, version, - comment.replace('\\', '\\\\').replace('\n', '\\n').replace('|', '\\|')) + s = '%s|%s|%s|%s|%s|%s|%s' % (rev, user, t, srcmd5, version, + comment.replace('\\', '\\\\').replace('\n', '\\n').replace('|', '\\|'), requestid) r.append(s) elif format == 'xml': r.append('' % (rev, srcmd5)) r.append('%s' % user) r.append('%s' % t) + r.append('%s' % requestid) r.append('%s' % comment.replace('&', '&').replace('<', '>').replace('>', '<')) r.append('') else: s = '-' * 76 + \ - '\nr%s | %s | %s | %s | %s\n' % (rev, user, t, srcmd5, version) + \ + '\nr%s | %s | %s | %s | %s | %s\n' % (rev, user, t, srcmd5, version, requestid) + \ '\n' + comment r.append(s)