def CMDmovechanges(parser, args): parser.add_option('-p', '--param', dest='params', action='append', help='repeatable query parameter, format: -p key=value') parser.add_option('--destination_branch', dest='destination_branch', help='where to move changes to') (opt, args) = parser.parse_args(args) assert opt.destination_branch, "--destination_branch not defined" for p in opt.params: assert '=' in p, '--param is key=value, not "%s"' % p host = urlparse.urlparse(opt.host).netloc limit = 100 while True: result = gerrit_util.QueryChanges( host, list(tuple(p.split('=', 1)) for p in opt.params), limit=limit, ) for change in result: gerrit_util.MoveChange(host, change['id'], opt.destination_branch) if len(result) < limit: break logging.info("Done")
def CMDchanges(parser, args): parser.add_option('-p', '--param', dest='params', action='append', help='repeatable query parameter, format: -p key=value') parser.add_option('-o', '--o-param', dest='o_params', action='append', help='gerrit output parameters, e.g. ALL_REVISIONS') parser.add_option('--limit', dest='limit', type=int, help='maximum number of results to return') parser.add_option('--start', dest='start', type=int, help='how many changes to skip ' '(starting with the most recent)') (opt, args) = parser.parse_args(args) for p in opt.params: assert '=' in p, '--param is key=value, not "%s"' % p result = gerrit_util.QueryChanges( urlparse.urlparse(opt.host).netloc, list(tuple(p.split('=', 1)) for p in opt.params), start=opt.start, # Default: None limit=opt.limit, # Default: None o_params=opt.o_params, # Default: None ) logging.info('Change query returned %d changes.', len(result)) write_result(result, opt)
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")
def testQueryChanges(self, mockJsonResponse, mockCreateHttpConn): gerrit_util.QueryChanges('host', [('key', 'val'), ('foo', 'bar')], 'first param', limit=500, o_params=['PARAM_A', 'PARAM_B'], start='start') mockCreateHttpConn.assert_called_once_with( 'host', ('changes/?q=first%20param+key:val+foo:bar' '&start=start' '&n=500' '&o=PARAM_A' '&o=PARAM_B'))
def query(self, query: List[Tuple[str, str]]) -> List[Change]: """Query a Gerrit server for changes matching query terms. Args: query: A list of key:value pairs for search parameters, as documented here (e.g. ('is', 'owner') for a parameter 'is:owner'): https://gerrit-review.googlesource.com/Documentation/user-search.html#search-operators Returns: JSON """ return [Change.from_json(x) for x in gerrit_util.QueryChanges( self.host, query, o_params=GerritServer.DEFAULT_PARAMS)]
def CMDmass_abandon(parser, args): """Mass abandon changes 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' """ 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")