diff --git a/osc/commandline.py b/osc/commandline.py index eb5c02d5..a172d850 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -3932,6 +3932,8 @@ Please submit there instead, or use --nodevelproject to force direct submission. help='do not fail if the source or target project/package does not exist on the server') @cmdln.option('-u', '--unexpand', action='store_true', help='diff unexpanded version if sources are linked') + @cmdln.option('--xml', action='store_true', + help='show diff as xml (only for issues diff)') def do_rdiff(self, subcmd, opts, *args): """${cmd_name}: Server-side "pretty" diff of two packages @@ -4009,9 +4011,10 @@ Please submit there instead, or use --nodevelproject to force direct submission. new_project, new_package, rev2, not opts.plain, opts.missingok, meta=opts.meta, expand=not opts.unexpand, - onlyissues=opts.issues_only) + onlyissues=opts.issues_only, + xml=opts.xml) if opts.issues_only: - print(rdiff) + print(decode_it(rdiff)) else: run_pager(rdiff) diff --git a/osc/core.py b/osc/core.py index 05ae3f19..53864adc 100644 --- a/osc/core.py +++ b/osc/core.py @@ -4822,7 +4822,7 @@ def get_source_file_diff(dir, filename, rev, oldfilename = None, olddir = None, def server_diff(apiurl, old_project, old_package, old_revision, new_project, new_package, new_revision, - unified=False, missingok=False, meta=False, expand=True, onlyissues=False, full=True): + unified=False, missingok=False, meta=False, expand=True, onlyissues=False, full=True, xml=False): query = {'cmd': 'diff'} if expand: query['expand'] = 1 @@ -4850,24 +4850,34 @@ def server_diff(apiurl, u = makeurl(apiurl, ['source', new_project, new_package], query=query) f = http_POST(u) - if onlyissues: - issue_list = [] + if onlyissues and not xml: + del_issue_list = [] + add_issue_list = [] + chn_issue_list = [] root = ET.fromstring(f.read()) node = root.find('issues') for issuenode in node.findall('issue'): - issue_list.append(issuenode.get('label')) - return '\n'.join(issue_list) + if issuenode.get('state') == 'deleted': + del_issue_list.append(issuenode.get('label')) + elif issuenode.get('state') == 'added': + add_issue_list.append(issuenode.get('label')) + else: + chn_issue_list.append(issuenode.get('label')) + string = 'added:\n----------\n' + '\n'.join(add_issue_list) + \ + '\n\nchanged:\n----------\n' + '\n'.join(chn_issue_list) + \ + '\n\ndeleted:\n----------\n' + '\n'.join(del_issue_list) + return string return f.read() def server_diff_noex(apiurl, old_project, old_package, old_revision, new_project, new_package, new_revision, - unified=False, missingok=False, meta=False, expand=True, onlyissues=False): + unified=False, missingok=False, meta=False, expand=True, onlyissues=False, xml=False): try: return server_diff(apiurl, old_project, old_package, old_revision, new_project, new_package, new_revision, - unified, missingok, meta, expand, onlyissues) + unified, missingok, meta, expand, onlyissues, True, xml) except HTTPError as e: msg = None body = None