repo-review: Add set/delete topic and set hashtags

Test: ./repo_review.py --set-topic test [query]
Test: ./repo_review.py --delete-topic [query]
Test: ./repo_review.py --add-hashtag test [query]
Test: ./repo_review.py --remove-hashtag test [query]
Change-Id: Ie7a1b82022d81850754543366202892c437f7968
This commit is contained in:
Logan Chien
2018-09-07 11:47:37 +08:00
parent e1f29c1ee0
commit 2da2f27813
2 changed files with 93 additions and 20 deletions

View File

@@ -182,6 +182,42 @@ def abandon(url_opener, gerrit_url, change_id, message):
return _make_json_post_request(url_opener, url, data)
def set_topic(url_opener, gerrit_url, change_id, name):
"""Set the topic name."""
url = '{}/a/changes/{}/topic'.format(gerrit_url, change_id)
data = {'topic': name}
return _make_json_post_request(url_opener, url, data, method='PUT')
def delete_topic(url_opener, gerrit_url, change_id):
"""Delete the topic name."""
url = '{}/a/changes/{}/topic'.format(gerrit_url, change_id)
request = Request(url)
request.get_method = lambda: 'DELETE'
response_file = url_opener.open(request)
try:
return (response_file.getcode(), response_file.read())
finally:
response_file.close()
def set_hashtags(url_opener, gerrit_url, change_id, add_tags=None,
remove_tags=None):
"""Add or remove hash tags."""
url = '{}/a/changes/{}/hashtags'.format(gerrit_url, change_id)
data = {}
if add_tags:
data['add'] = add_tags
if remove_tags:
data['remove'] = remove_tags
return _make_json_post_request(url_opener, url, data)
def get_patch(url_opener, gerrit_url, change_id, revision_id='current'):
"""Download the patch file."""

View File

@@ -31,7 +31,8 @@ except ImportError:
from urllib2 import HTTPError # PY2
from gerrit import (
create_url_opener_from_args, query_change_lists, set_review, abandon)
abandon, create_url_opener_from_args, delete_topic, query_change_lists,
set_hashtags, set_review, set_topic)
def _get_labels_from_args(args):
@@ -100,15 +101,41 @@ def _parse_args():
parser.add_argument('--abandon', help='Abandon a CL with a message')
parser.add_argument('--add-hashtag', action='append', help='Add hashtag')
parser.add_argument('--remove-hashtag', action='append',
help='Remove hashtag')
parser.add_argument('--delete-hashtag', action='append',
help='Remove hashtag', dest='remove_hashtag')
parser.add_argument('--set-topic', help='Set topic name')
parser.add_argument('--delete-topic', action='store_true',
help='Delete topic name')
parser.add_argument('--remove-topic', action='store_true',
help='Delete topic name', dest='delete_topic')
return parser.parse_args()
def _has_task(args):
"""Determine whether a task has been specified in the arguments."""
if args.label is not None or args.message is not None:
return True
if args.abandon is not None:
return True
if args.add_hashtag or args.remove_hashtag:
return True
if args.set_topic or args.delete_topic:
return True
return False
_SEP_SPLIT = '=' * 79
_SEP = '-' * 79
def _report_error(change, res_code, res_json):
def _print_error(change, res_code, res_json):
"""Print the error message"""
change_id = change['change_id']
project = change['project']
revision_sha1 = change['current_revision']
@@ -128,32 +155,32 @@ def _report_error(change, res_code, res_json):
print(_SEP_SPLIT, file=sys.stderr)
def _process(change, func, *args, **kwargs):
"""Process a Gerrit request."""
expected_http_code = kwargs.get('expected_http_code', 200)
def _do_task(change, func, *args, **kwargs):
"""Process a task and report errors when necessary."""
try:
res_code, res_json = func(*args)
except HTTPError as error:
res_code = error.code
res_json = None
if res_code != expected_http_code:
_report_error(change, res_code, res_json)
return False
if res_code != kwargs.get('expected_http_code', 200):
_print_error(change, res_code, res_json)
return True
errors = kwargs.get('errors')
if errors is not None:
errors['num_errors'] += 1
def main():
"""Set review labels to selected change lists"""
# Parse and check the command line options
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 ',
if not _has_task(args):
print('error: Either --label, --message, --abandon, --add-hashtag, '
'--remove-hashtag, --set-topic, or --delete-topic must be ',
'specified', file=sys.stderr)
sys.exit(1)
# Convert label arguments
labels = _get_labels_from_args(args)
@@ -175,16 +202,26 @@ def main():
_confirm('Do you want to continue?')
# Post review votes
has_error = False
errors = {'num_errors': 0}
for change in change_lists:
if args.label or args.message:
_process(change, set_review, url_opener, args.gerrit, change['id'],
labels, args.message)
_do_task(change, set_review, url_opener, args.gerrit, change['id'],
labels, args.message, errors=errors)
if args.add_hashtag or args.remove_hashtag:
_do_task(change, set_hashtags, url_opener, args.gerrit,
change['id'], args.add_hashtag, args.remove_hashtag,
errors=errors)
if args.set_topic:
_do_task(change, set_topic, url_opener, args.gerrit, change['id'],
args.set_topic, errors=errors)
if args.delete_topic:
_do_task(change, delete_topic, url_opener, args.gerrit,
change['id'], expected_http_code=204, errors=errors)
if args.abandon:
_process(change, abandon, url_opener, args.gerrit, change['id'],
args.abandon)
_do_task(change, abandon, url_opener, args.gerrit, change['id'],
args.abandon, errors=errors)
if has_error:
if errors['num_errors']:
sys.exit(1)