xref: /aosp_15_r20/development/tools/repo_pull/repo_patch.py (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*90c8c64dSAndroid Build Coastguard Worker
3*90c8c64dSAndroid Build Coastguard Worker#
4*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project
5*90c8c64dSAndroid Build Coastguard Worker#
6*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
7*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
8*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at
9*90c8c64dSAndroid Build Coastguard Worker#
10*90c8c64dSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
11*90c8c64dSAndroid Build Coastguard Worker#
12*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
13*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
14*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
16*90c8c64dSAndroid Build Coastguard Worker# limitations under the License.
17*90c8c64dSAndroid Build Coastguard Worker#
18*90c8c64dSAndroid Build Coastguard Worker
19*90c8c64dSAndroid Build Coastguard Worker"""A command line utility to download multiple patch files of change lists from
20*90c8c64dSAndroid Build Coastguard WorkerGerrit."""
21*90c8c64dSAndroid Build Coastguard Worker
22*90c8c64dSAndroid Build Coastguard Workerfrom __future__ import print_function
23*90c8c64dSAndroid Build Coastguard Worker
24*90c8c64dSAndroid Build Coastguard Workerimport argparse
25*90c8c64dSAndroid Build Coastguard Workerimport os
26*90c8c64dSAndroid Build Coastguard Workerimport sys
27*90c8c64dSAndroid Build Coastguard Worker
28*90c8c64dSAndroid Build Coastguard Workerfrom gerrit import (
29*90c8c64dSAndroid Build Coastguard Worker    add_common_parse_args, create_url_opener_from_args, find_gerrit_name,
30*90c8c64dSAndroid Build Coastguard Worker    normalize_gerrit_name, query_change_lists, get_patch
31*90c8c64dSAndroid Build Coastguard Worker)
32*90c8c64dSAndroid Build Coastguard Worker
33*90c8c64dSAndroid Build Coastguard Workerdef _parse_args():
34*90c8c64dSAndroid Build Coastguard Worker    """Parse command line options."""
35*90c8c64dSAndroid Build Coastguard Worker    parser = argparse.ArgumentParser()
36*90c8c64dSAndroid Build Coastguard Worker    add_common_parse_args(parser)
37*90c8c64dSAndroid Build Coastguard Worker    return parser.parse_args()
38*90c8c64dSAndroid Build Coastguard Worker
39*90c8c64dSAndroid Build Coastguard Worker
40*90c8c64dSAndroid Build Coastguard Workerdef main():
41*90c8c64dSAndroid Build Coastguard Worker    """Main function"""
42*90c8c64dSAndroid Build Coastguard Worker    args = _parse_args()
43*90c8c64dSAndroid Build Coastguard Worker
44*90c8c64dSAndroid Build Coastguard Worker    if args.gerrit:
45*90c8c64dSAndroid Build Coastguard Worker        args.gerrit = normalize_gerrit_name(args.gerrit)
46*90c8c64dSAndroid Build Coastguard Worker    else:
47*90c8c64dSAndroid Build Coastguard Worker        try:
48*90c8c64dSAndroid Build Coastguard Worker            args.gerrit = find_gerrit_name()
49*90c8c64dSAndroid Build Coastguard Worker        # pylint: disable=bare-except
50*90c8c64dSAndroid Build Coastguard Worker        except:
51*90c8c64dSAndroid Build Coastguard Worker            print('gerrit instance not found, use [-g GERRIT]')
52*90c8c64dSAndroid Build Coastguard Worker            sys.exit(1)
53*90c8c64dSAndroid Build Coastguard Worker
54*90c8c64dSAndroid Build Coastguard Worker    # Query change lists
55*90c8c64dSAndroid Build Coastguard Worker    url_opener = create_url_opener_from_args(args)
56*90c8c64dSAndroid Build Coastguard Worker    change_lists = query_change_lists(
57*90c8c64dSAndroid Build Coastguard Worker        url_opener, args.gerrit, args.query, args.start, args.limits)
58*90c8c64dSAndroid Build Coastguard Worker
59*90c8c64dSAndroid Build Coastguard Worker    # Download patch files
60*90c8c64dSAndroid Build Coastguard Worker    num_changes = len(change_lists)
61*90c8c64dSAndroid Build Coastguard Worker    num_changes_width = len(str(num_changes))
62*90c8c64dSAndroid Build Coastguard Worker    for i, change in enumerate(change_lists, start=1):
63*90c8c64dSAndroid Build Coastguard Worker        print('{:>{}}/{} | {} {}'.format(
64*90c8c64dSAndroid Build Coastguard Worker            i, num_changes_width, num_changes, change['_number'],
65*90c8c64dSAndroid Build Coastguard Worker            change['subject']))
66*90c8c64dSAndroid Build Coastguard Worker
67*90c8c64dSAndroid Build Coastguard Worker        patch_file = get_patch(url_opener, args.gerrit, change['id'])
68*90c8c64dSAndroid Build Coastguard Worker        with open('{}.patch'.format(change['_number']), 'wb') as output_file:
69*90c8c64dSAndroid Build Coastguard Worker            output_file.write(patch_file)
70*90c8c64dSAndroid Build Coastguard Worker
71*90c8c64dSAndroid Build Coastguard Workerif __name__ == '__main__':
72*90c8c64dSAndroid Build Coastguard Worker    main()
73