From b260a602643e29b4bd7da73e41b549a583bf5740 Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Tue, 3 Jul 2018 10:27:55 +0800 Subject: [PATCH] repo-review: Add abandon command line option This commit adds `--abandon` comand line option to abandon several change lists. Test: repo-review.py -g [url] [query] --abandon '[reason]' Change-Id: I5360e95a284a2d3e77a66d52ea01cec7872b9334 --- tools/repo_pull/gerrit.py | 24 +++++++++++ tools/repo_pull/repo_review.py | 78 ++++++++++++++++++++++------------ 2 files changed, 75 insertions(+), 27 deletions(-) diff --git a/tools/repo_pull/gerrit.py b/tools/repo_pull/gerrit.py index 185edd0e6..a3da3bbf3 100755 --- a/tools/repo_pull/gerrit.py +++ b/tools/repo_pull/gerrit.py @@ -165,6 +165,30 @@ def set_review(url_opener, gerrit_url, change_id, labels, message): response_file.close() +def abandon(url_opener, gerrit_url, change_id, message): + """Abandon a change list.""" + + url = '{}/a/changes/{}/abandon'.format(gerrit_url, change_id) + + data = {} + if message: + data['message'] = message + data = json.dumps(data).encode('utf-8') + + headers = { + 'Content-Type': 'application/json; charset=UTF-8', + } + + request = Request(url, data, headers) + response_file = url_opener.open(request) + try: + res_code = response_file.getcode() + res_json = _decode_xssi_json(response_file.read()) + return (res_code, res_json) + finally: + response_file.close() + + def get_patch(url_opener, gerrit_url, change_id, revision_id='current'): """Download the patch file.""" diff --git a/tools/repo_pull/repo_review.py b/tools/repo_pull/repo_review.py index 5da1227ea..d60e82f58 100755 --- a/tools/repo_pull/repo_review.py +++ b/tools/repo_pull/repo_review.py @@ -30,14 +30,14 @@ try: except ImportError: from urllib2 import HTTPError # PY2 -from gerrit import create_url_opener_from_args, query_change_lists, set_review +from gerrit import ( + create_url_opener_from_args, query_change_lists, set_review, abandon) def _get_labels_from_args(args): """Collect and check labels from args.""" if not args.label: - print('error: --label must be specified', file=sys.stderr) - sys.exit(1) + return None labels = {} for (name, value) in args.label: try: @@ -98,6 +98,8 @@ def _parse_args(): help='Labels to be added') parser.add_argument('-m', '--message', help='Review message') + parser.add_argument('--abandon', help='Abandon a CL with a message') + return parser.parse_args() @@ -105,11 +107,37 @@ _SEP_SPLIT = '=' * 79 _SEP = '-' * 79 +def _report_error(change, res_code, res_json): + """Print the error message""" + change_id = change['change_id'] + project = change['project'] + revision_sha1 = change['current_revision'] + revision = change['revisions'][revision_sha1] + subject = revision['commit']['subject'] + + print(_SEP_SPLIT, file=sys.stderr) + print('Project:', project, file=sys.stderr) + print('Change-Id:', change_id, file=sys.stderr) + print('Subject:', subject, file=sys.stderr) + print('HTTP status code:', res_code, file=sys.stderr) + if res_json: + print(_SEP, file=sys.stderr) + json.dump(res_json, sys.stderr, indent=4, + separators=(', ', ': ')) + print(file=sys.stderr) + print(_SEP_SPLIT, file=sys.stderr) + + def main(): """Set review labels to selected change lists""" args = _parse_args() + # Check the command line options + if args.label is None and args.message is None and args.abandon is None: + print('error: Either --label, --message, or --abandon must be ', + 'specified', file=sys.stderr) + # Convert label arguments labels = _get_labels_from_args(args) @@ -132,33 +160,29 @@ def main(): # Post review votes has_error = False for change in change_lists: - try: - res_code, res_json = set_review( - url_opener, args.gerrit, change['id'], labels, args.message) - except HTTPError as error: - res_code = error.code - res_json = None + if args.label or args.message: + try: + res_code, res_json = set_review( + url_opener, args.gerrit, change['id'], labels, args.message) + except HTTPError as error: + res_code = error.code + res_json = None - if res_code != 200: - has_error = True + if res_code != 200: + has_error = True + _report_error(change, res_code, res_json) - change_id = change['change_id'] - project = change['project'] - revision_sha1 = change['current_revision'] - revision = change['revisions'][revision_sha1] - subject = revision['commit']['subject'] + if args.abandon: + try: + res_code, res_json = abandon( + url_opener, args.gerrit, change['id'], args.abandon) + except HTTPError as error: + res_code = error.code + res_json = None - print(_SEP_SPLIT, file=sys.stderr) - print('Project:', project, file=sys.stderr) - print('Change-Id:', change_id, file=sys.stderr) - print('Subject:', subject, file=sys.stderr) - print('HTTP status code:', res_code, file=sys.stderr) - if res_json: - print(_SEP, file=sys.stderr) - json.dump(res_json, sys.stderr, indent=4, - separators=(', ', ': ')) - print(file=sys.stderr) - print(_SEP_SPLIT, file=sys.stderr) + if res_code != 200: + has_error = True + _report_error(change, res_code, res_json) if has_error: sys.exit(1)