Merge "Extend gerrit query to handle all changes in a topic." am: 8c58225807 am: 7264da3b42 am: 3dab1f72f7
Original change: https://android-review.googlesource.com/c/platform/development/+/1828152 Change-Id: I432d79f65beb5e05aef05b41d1b82cfaf12f330f
This commit is contained in:
@@ -171,13 +171,31 @@ def _decode_xssi_json(data):
|
|||||||
return json.loads(data)
|
return json.loads(data)
|
||||||
|
|
||||||
|
|
||||||
def query_change_lists(url_opener, gerrit, query_string, limits):
|
def _query_change_lists(url_opener, gerrit, query_string, start, count):
|
||||||
"""Query change lists."""
|
"""Query change lists from the Gerrit server with a single request.
|
||||||
|
|
||||||
|
This function performs a single query of the Gerrit server based on the
|
||||||
|
input parameters for a list of changes. The server may return less than
|
||||||
|
the number of changes requested. The caller should check the last record
|
||||||
|
returned for the _more_changes attribute to determine if more changes are
|
||||||
|
available and perform additional queries adjusting the start index.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
url_opener: URL opener for request
|
||||||
|
gerrit: Gerrit server URL
|
||||||
|
query_string: Gerrit query string to select changes
|
||||||
|
start: Number of changes to be skipped from the beginning
|
||||||
|
count: Maximum number of changes to return
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of changes
|
||||||
|
"""
|
||||||
data = [
|
data = [
|
||||||
('q', query_string),
|
('q', query_string),
|
||||||
('o', 'CURRENT_REVISION'),
|
('o', 'CURRENT_REVISION'),
|
||||||
('o', 'CURRENT_COMMIT'),
|
('o', 'CURRENT_COMMIT'),
|
||||||
('n', str(limits)),
|
('start', str(start)),
|
||||||
|
('n', str(count)),
|
||||||
]
|
]
|
||||||
url = gerrit + '/a/changes/?' + urlencode(data)
|
url = gerrit + '/a/changes/?' + urlencode(data)
|
||||||
|
|
||||||
@@ -187,6 +205,40 @@ def query_change_lists(url_opener, gerrit, query_string, limits):
|
|||||||
finally:
|
finally:
|
||||||
response_file.close()
|
response_file.close()
|
||||||
|
|
||||||
|
def query_change_lists(url_opener, gerrit, query_string, start, count):
|
||||||
|
"""Query change lists from the Gerrit server.
|
||||||
|
|
||||||
|
This function queries the Gerrit server based on the input parameters for a
|
||||||
|
list of changes. This function handles querying the server multiple times
|
||||||
|
if necessary and combining the results that are returned to the caller.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
url_opener: URL opener for request
|
||||||
|
gerrit: Gerrit server URL
|
||||||
|
query_string: Gerrit query string to select changes
|
||||||
|
start: Number of changes to be skipped from the beginning
|
||||||
|
count: Maximum number of changes to return
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of changes
|
||||||
|
"""
|
||||||
|
changes = []
|
||||||
|
while len(changes) < count:
|
||||||
|
chunk = _query_change_lists(url_opener, gerrit, query_string,
|
||||||
|
start + len(changes), count - len(changes))
|
||||||
|
if not chunk:
|
||||||
|
break
|
||||||
|
|
||||||
|
changes += chunk
|
||||||
|
|
||||||
|
# The last change object contains a _more_changes attribute if the
|
||||||
|
# number of changes exceeds the query parameter or the internal server
|
||||||
|
# limit. Stop iteration if `_more_changes` attribute doesn't exist.
|
||||||
|
if '_more_changes' not in chunk[-1]:
|
||||||
|
break
|
||||||
|
|
||||||
|
return changes
|
||||||
|
|
||||||
|
|
||||||
def _make_json_post_request(url_opener, url, data, method='POST'):
|
def _make_json_post_request(url_opener, url, data, method='POST'):
|
||||||
"""Open an URL request and decode its response.
|
"""Open an URL request and decode its response.
|
||||||
@@ -361,8 +413,13 @@ def _parse_args():
|
|||||||
parser.add_argument('--gitcookies',
|
parser.add_argument('--gitcookies',
|
||||||
default=os.path.expanduser('~/.gitcookies'),
|
default=os.path.expanduser('~/.gitcookies'),
|
||||||
help='Gerrit cookie file')
|
help='Gerrit cookie file')
|
||||||
parser.add_argument('--limits', default=1000,
|
parser.add_argument('--limits', default=1000, type=int,
|
||||||
help='Max number of change lists')
|
help='Max number of change lists')
|
||||||
|
parser.add_argument('--start', default=0, type=int,
|
||||||
|
help='Skip first N changes in query')
|
||||||
|
parser.add_argument('--format', default='json',
|
||||||
|
choices=['json', 'oneline'],
|
||||||
|
help='Print format')
|
||||||
|
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
@@ -383,11 +440,23 @@ def main():
|
|||||||
# Query change lists
|
# Query change lists
|
||||||
url_opener = create_url_opener_from_args(args)
|
url_opener = create_url_opener_from_args(args)
|
||||||
change_lists = query_change_lists(
|
change_lists = query_change_lists(
|
||||||
url_opener, args.gerrit, args.query, args.limits)
|
url_opener, args.gerrit, args.query, args.start, args.limits)
|
||||||
|
|
||||||
# Print the result
|
# Print the result
|
||||||
json.dump(change_lists, sys.stdout, indent=4, separators=(', ', ': '))
|
if args.format == 'json':
|
||||||
print() # Print the end-of-line
|
json.dump(change_lists, sys.stdout, indent=4, separators=(', ', ': '))
|
||||||
|
print() # Print the end-of-line
|
||||||
|
elif args.format == 'oneline':
|
||||||
|
for i, change in enumerate(change_lists):
|
||||||
|
print('{i:<8} {number:<16} {status:<20} ' \
|
||||||
|
'{change_id:<60} {project:<120} ' \
|
||||||
|
'{subject}'.format(i=i,
|
||||||
|
project=change['project'],
|
||||||
|
change_id=change['change_id'],
|
||||||
|
status=change['status'],
|
||||||
|
number=change['_number'],
|
||||||
|
subject=change['subject']))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -40,8 +40,10 @@ def _parse_args():
|
|||||||
parser.add_argument('--gitcookies',
|
parser.add_argument('--gitcookies',
|
||||||
default=os.path.expanduser('~/.gitcookies'),
|
default=os.path.expanduser('~/.gitcookies'),
|
||||||
help='Gerrit cookie file')
|
help='Gerrit cookie file')
|
||||||
parser.add_argument('--limits', default=1000,
|
parser.add_argument('--limits', default=1000, type=int,
|
||||||
help='Max number of change lists')
|
help='Max number of change lists')
|
||||||
|
parser.add_argument('--start', default=0, type=int,
|
||||||
|
help='Skip first N changes in query')
|
||||||
|
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
@@ -63,7 +65,7 @@ def main():
|
|||||||
# Query change lists
|
# Query change lists
|
||||||
url_opener = create_url_opener_from_args(args)
|
url_opener = create_url_opener_from_args(args)
|
||||||
change_lists = query_change_lists(
|
change_lists = query_change_lists(
|
||||||
url_opener, args.gerrit, args.query, args.limits)
|
url_opener, args.gerrit, args.query, args.start, args.limits)
|
||||||
|
|
||||||
# Download patch files
|
# Download patch files
|
||||||
num_changes = len(change_lists)
|
num_changes = len(change_lists)
|
||||||
|
|||||||
@@ -374,8 +374,10 @@ def _parse_args():
|
|||||||
default=os.path.expanduser('~/.gitcookies'),
|
default=os.path.expanduser('~/.gitcookies'),
|
||||||
help='Gerrit cookie file')
|
help='Gerrit cookie file')
|
||||||
parser.add_argument('--manifest', help='Manifest')
|
parser.add_argument('--manifest', help='Manifest')
|
||||||
parser.add_argument('--limits', default=1000,
|
parser.add_argument('--limits', default=1000, type=int,
|
||||||
help='Max number of change lists')
|
help='Max number of change lists')
|
||||||
|
parser.add_argument('--start', default=0, type=int,
|
||||||
|
help='Skip first N changes in query')
|
||||||
|
|
||||||
parser.add_argument('-m', '--merge',
|
parser.add_argument('-m', '--merge',
|
||||||
choices=sorted(_MERGE_COMMANDS.keys()),
|
choices=sorted(_MERGE_COMMANDS.keys()),
|
||||||
@@ -399,7 +401,8 @@ def _parse_args():
|
|||||||
def _get_change_lists_from_args(args):
|
def _get_change_lists_from_args(args):
|
||||||
"""Query the change lists by args."""
|
"""Query the change lists by args."""
|
||||||
url_opener = create_url_opener_from_args(args)
|
url_opener = create_url_opener_from_args(args)
|
||||||
return query_change_lists(url_opener, args.gerrit, args.query, args.limits)
|
return query_change_lists(url_opener, args.gerrit, args.query, args.start,
|
||||||
|
args.limits)
|
||||||
|
|
||||||
|
|
||||||
def _get_local_branch_name_from_args(args):
|
def _get_local_branch_name_from_args(args):
|
||||||
|
|||||||
@@ -93,8 +93,10 @@ def _parse_args():
|
|||||||
parser.add_argument('--gitcookies',
|
parser.add_argument('--gitcookies',
|
||||||
default=os.path.expanduser('~/.gitcookies'),
|
default=os.path.expanduser('~/.gitcookies'),
|
||||||
help='Gerrit cookie file')
|
help='Gerrit cookie file')
|
||||||
parser.add_argument('--limits', default=1000,
|
parser.add_argument('--limits', default=1000, type=int,
|
||||||
help='Max number of change lists')
|
help='Max number of change lists')
|
||||||
|
parser.add_argument('--start', default=0, type=int,
|
||||||
|
help='Skip first N changes in query')
|
||||||
|
|
||||||
parser.add_argument('-l', '--label', nargs=2, action='append',
|
parser.add_argument('-l', '--label', nargs=2, action='append',
|
||||||
help='Labels to be added')
|
help='Labels to be added')
|
||||||
@@ -219,7 +221,7 @@ def main():
|
|||||||
|
|
||||||
# Retrieve change lists
|
# Retrieve change lists
|
||||||
change_lists = query_change_lists(
|
change_lists = query_change_lists(
|
||||||
url_opener, args.gerrit, args.query, args.limits)
|
url_opener, args.gerrit, args.query, args.start, args.limits)
|
||||||
if not change_lists:
|
if not change_lists:
|
||||||
print('error: No matching change lists.', file=sys.stderr)
|
print('error: No matching change lists.', file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user