Patrick Williams | 45c7017 | 2021-03-04 20:25:26 -0600 | [diff] [blame] | 1 | #!/usr/bin/env -S python3 -B |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 2 | # |
| 3 | # SPDX-License-Identifier: Apache-2.0 |
| 4 | # Copyright (C) 2018 IBM Corp. |
| 5 | # |
| 6 | # Push changes to Gerrit, automatically adding reviewers to the patches by |
| 7 | # parsing the OpenBMC-style MAINTAINERS file in the root of the repository (if |
| 8 | # it exists). |
| 9 | |
| 10 | from obmc import maintainers |
| 11 | from typing import cast, List, Optional |
| 12 | import argparse |
| 13 | import os |
| 14 | import sh |
| 15 | import sys |
| 16 | |
| 17 | git = sh.git.bake() |
| 18 | |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 19 | |
| 20 | def get_reviewers(root: Optional[str] = None, mname: str = "MAINTAINERS") -> List[str]: |
Andrew Jeffery | 382f286 | 2018-05-23 17:05:50 +0930 | [diff] [blame] | 21 | reviewers = cast(List[str], list()) |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 22 | if not root: |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 23 | root = git("rev-parse", "--show-toplevel").strip() |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 24 | mfile = os.path.join(root, mname) |
Andrew Jeffery | 39654b1 | 2018-05-22 12:38:53 +0930 | [diff] [blame] | 25 | if not os.path.exists(mfile): |
| 26 | return reviewers |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 27 | with open(mfile, "r") as mstream: |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 28 | maintainers.trash_preamble(mstream) |
| 29 | block = maintainers.parse_block(mstream) |
| 30 | if not block: |
| 31 | return reviewers |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 32 | mlist = cast( |
| 33 | List[maintainers.Identity], block[maintainers.LineType.MAINTAINER] |
| 34 | ) |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 35 | reviewers.extend(i.email.address for i in mlist) |
| 36 | if maintainers.LineType.REVIEWER in block: |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 37 | rlist = cast( |
| 38 | List[maintainers.Identity], block[maintainers.LineType.REVIEWER] |
| 39 | ) |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 40 | reviewers.extend(i.email.address for i in rlist) |
| 41 | return reviewers |
| 42 | |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 43 | |
| 44 | def gerrit_refspec_args( |
| 45 | reviewers: Optional[List[str]] = None, topic: str = None |
| 46 | ) -> str: |
Andrew Jeffery | 3512b93 | 2020-06-15 13:09:16 +0930 | [diff] [blame] | 47 | argl = [] |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 48 | if reviewers: |
Andrew Jeffery | 3512b93 | 2020-06-15 13:09:16 +0930 | [diff] [blame] | 49 | argl.extend("r={}".format(addr) for addr in reviewers) |
| 50 | if topic: |
Lei YU | 8e56c31 | 2020-07-30 10:14:47 +0000 | [diff] [blame] | 51 | argl.append("topic={}".format(topic)) |
Andrew Jeffery | 3512b93 | 2020-06-15 13:09:16 +0930 | [diff] [blame] | 52 | return ",".join(argl) |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 53 | |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 54 | |
Andrew Jeffery | 3512b93 | 2020-06-15 13:09:16 +0930 | [diff] [blame] | 55 | def decorate_refspec(refspec: str, topic: str) -> str: |
| 56 | gargs = gerrit_refspec_args(get_reviewers(), topic) |
Andrew Jeffery | 39654b1 | 2018-05-22 12:38:53 +0930 | [diff] [blame] | 57 | if not gargs: |
| 58 | return refspec |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 59 | if "%" in refspec: |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 60 | return "{},{}".format(refspec, gargs) |
| 61 | return "{}%{}".format(refspec, gargs) |
| 62 | |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 63 | |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 64 | def do_push(args: argparse.Namespace) -> None: |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 65 | git.push( |
| 66 | args.remote, |
| 67 | decorate_refspec(args.refspec, args.topic), |
| 68 | _in=sys.stdin, |
| 69 | _out=sys.stdout, |
| 70 | _err=sys.stderr, |
| 71 | ) |
| 72 | |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 73 | |
| 74 | parser = argparse.ArgumentParser() |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 75 | subbies = parser.add_subparsers(dest="subcommand") |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 76 | subbies.required = True |
| 77 | push = subbies.add_parser("push", help="Push changes to Gerrit with reviewers") |
| 78 | push.add_argument("remote") |
| 79 | push.add_argument("refspec") |
Patrick Williams | 9a01439 | 2021-06-21 14:57:29 -0500 | [diff] [blame^] | 80 | push.add_argument("topic", nargs="?", default=None) |
Andrew Jeffery | f4019fe | 2018-05-18 16:42:18 +0930 | [diff] [blame] | 81 | push.set_defaults(func=do_push) |
| 82 | |
| 83 | args = parser.parse_args() |
| 84 | args.func(args) |