Commit e1a98941 authored by Josip Sokcevic's avatar Josip Sokcevic Committed by LUCI CQ

Add mass-abandon to gerrit_client.py

mass-abandon allows users to mass abandon CLs based on search query.
Owner is always specified (either "me" or user defined via -p).

R=gavinmak@google.com, thakis@chromium.org

Change-Id: I789a3a1f3af22867ebbbc50c35b60486206ff403
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/2811005Reviewed-by: 's avatarGavin Mak <gavinmak@google.com>
Commit-Queue: Josip Sokcevic <sokcevic@google.com>
parent 3f562c04
......@@ -225,6 +225,75 @@ def CMDabandon(parser, args):
write_result(result, opt)
@subcommand.usage('''Mass abandon changes
Mass abandon abandons CLs that match search criteria provided by user. Before
any change is actually abandoned, user is presented with a list of CLs that
will be affected if user confirms. User can skip confirmation by passing --force
parameter.
The script can abandon up to 100 CLs per invocation.
Examples:
gerrit_client.py mass-abandon --host https://HOST -p 'project=repo2'
gerrit_client.py mass-abandon --host https://HOST -p 'message=testing'
gerrit_client.py mass-abandon --host https://HOST -p 'is=wip' -p 'age:1y'
''')
def CMDmass_abandon(parser, args):
parser.add_option('-p',
'--param',
dest='params',
action='append',
default=[],
help='repeatable query parameter, format: -p key=value')
parser.add_option('-m', '--message', default='', help='reason for abandoning')
parser.add_option('-f',
'--force',
action='store_true',
help='Don\'t prompt for confirmation')
opt, args = parser.parse_args(args)
for p in opt.params:
assert '=' in p, '--param is key=value, not "%s"' % p
search_query = list(tuple(p.split('=', 1)) for p in opt.params)
if not any(t for t in search_query if t[0] == 'owner'):
# owner should always be present when abandoning changes
search_query.append(('owner', 'me'))
search_query.append(('status', 'open'))
logging.info("Searching for: %s" % search_query)
host = urlparse.urlparse(opt.host).netloc
result = gerrit_util.QueryChanges(
host,
search_query,
# abandon at most 100 changes as not all Gerrit instances support
# unlimited results.
limit=100,
)
if len(result) == 0:
logging.warn("Nothing to abandon")
return
logging.warn("%s CLs match search query: " % len(result))
for change in result:
logging.warn("[ID: %d] %s" % (change['_number'], change['subject']))
if not opt.force:
q = raw_input(
'Do you want to move forward with abandoning? [y to confirm] ').strip()
if q not in ['y', 'Y']:
logging.warn("Aborting...")
return
for change in result:
logging.warning("Abandoning: %s" % change['subject'])
gerrit_util.AbandonChange(host, change['id'], opt.message)
logging.warning("Done")
class OptionParser(optparse.OptionParser):
"""Creates the option parse and add --verbose support."""
def __init__(self, *args, **kwargs):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment