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
This commit is contained in:
@@ -165,6 +165,30 @@ def set_review(url_opener, gerrit_url, change_id, labels, message):
|
|||||||
response_file.close()
|
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'):
|
def get_patch(url_opener, gerrit_url, change_id, revision_id='current'):
|
||||||
"""Download the patch file."""
|
"""Download the patch file."""
|
||||||
|
|
||||||
|
|||||||
@@ -30,14 +30,14 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
from urllib2 import HTTPError # PY2
|
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):
|
def _get_labels_from_args(args):
|
||||||
"""Collect and check labels from args."""
|
"""Collect and check labels from args."""
|
||||||
if not args.label:
|
if not args.label:
|
||||||
print('error: --label must be specified', file=sys.stderr)
|
return None
|
||||||
sys.exit(1)
|
|
||||||
labels = {}
|
labels = {}
|
||||||
for (name, value) in args.label:
|
for (name, value) in args.label:
|
||||||
try:
|
try:
|
||||||
@@ -98,6 +98,8 @@ def _parse_args():
|
|||||||
help='Labels to be added')
|
help='Labels to be added')
|
||||||
parser.add_argument('-m', '--message', help='Review message')
|
parser.add_argument('-m', '--message', help='Review message')
|
||||||
|
|
||||||
|
parser.add_argument('--abandon', help='Abandon a CL with a message')
|
||||||
|
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
@@ -105,11 +107,37 @@ _SEP_SPLIT = '=' * 79
|
|||||||
_SEP = '-' * 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():
|
def main():
|
||||||
"""Set review labels to selected change lists"""
|
"""Set review labels to selected change lists"""
|
||||||
|
|
||||||
args = _parse_args()
|
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
|
# Convert label arguments
|
||||||
labels = _get_labels_from_args(args)
|
labels = _get_labels_from_args(args)
|
||||||
|
|
||||||
@@ -132,6 +160,7 @@ def main():
|
|||||||
# Post review votes
|
# Post review votes
|
||||||
has_error = False
|
has_error = False
|
||||||
for change in change_lists:
|
for change in change_lists:
|
||||||
|
if args.label or args.message:
|
||||||
try:
|
try:
|
||||||
res_code, res_json = set_review(
|
res_code, res_json = set_review(
|
||||||
url_opener, args.gerrit, change['id'], labels, args.message)
|
url_opener, args.gerrit, change['id'], labels, args.message)
|
||||||
@@ -141,24 +170,19 @@ def main():
|
|||||||
|
|
||||||
if res_code != 200:
|
if res_code != 200:
|
||||||
has_error = True
|
has_error = True
|
||||||
|
_report_error(change, res_code, res_json)
|
||||||
|
|
||||||
change_id = change['change_id']
|
if args.abandon:
|
||||||
project = change['project']
|
try:
|
||||||
revision_sha1 = change['current_revision']
|
res_code, res_json = abandon(
|
||||||
revision = change['revisions'][revision_sha1]
|
url_opener, args.gerrit, change['id'], args.abandon)
|
||||||
subject = revision['commit']['subject']
|
except HTTPError as error:
|
||||||
|
res_code = error.code
|
||||||
|
res_json = None
|
||||||
|
|
||||||
print(_SEP_SPLIT, file=sys.stderr)
|
if res_code != 200:
|
||||||
print('Project:', project, file=sys.stderr)
|
has_error = True
|
||||||
print('Change-Id:', change_id, file=sys.stderr)
|
_report_error(change, res_code, res_json)
|
||||||
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 has_error:
|
if has_error:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user