| #!/usr/bin/env -S python3 -B |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| # Copyright (C) 2018 IBM Corp. |
| # |
| # Push changes to Gerrit, automatically adding reviewers to the patches by |
| # parsing the OpenBMC-style MAINTAINERS file in the root of the repository (if |
| # it exists). |
| |
| from obmc import maintainers |
| from obmc.reviewlist import ReviewList |
| from typing import cast, Callable, List, Optional |
| import argparse |
| import os |
| import sh # type: ignore |
| import sys |
| |
| git: Callable[..., str] = sh.git.bake() |
| |
| |
| def get_reviewers( |
| root: Optional[str] = None, mname: str = "MAINTAINERS" |
| ) -> ReviewList: |
| |
| if not root: |
| root = git("rev-parse", "--show-toplevel").strip() |
| |
| mfile = os.path.join(root, mname) |
| if os.path.exists(mfile): |
| return maintainers.get_reviewers(mfile) |
| |
| return ReviewList() |
| |
| |
| def gerrit_refspec_args( |
| maintainers: Optional[List[str]] = None, |
| reviewers: Optional[List[str]] = None, |
| topic: str = None, |
| ) -> str: |
| argl: List[str] = [] |
| if maintainers: |
| argl.extend("r={}".format(addr) for addr in maintainers) |
| if reviewers: |
| argl.extend("cc={}".format(addr) for addr in reviewers) |
| if topic: |
| argl.append("topic={}".format(topic)) |
| return ",".join(argl) |
| |
| |
| def decorate_refspec(refspec: str, topic: str) -> str: |
| revlist = get_reviewers() |
| gargs = gerrit_refspec_args(revlist.maintainers, revlist.reviewers, topic) |
| if not gargs: |
| return refspec |
| if "%" in refspec: |
| return "{},{}".format(refspec, gargs) |
| return "{}%{}".format(refspec, gargs) |
| |
| |
| def do_push(args: argparse.Namespace) -> None: |
| git( |
| "push", |
| args.remote, |
| decorate_refspec(args.refspec, args.topic), |
| _in=sys.stdin, |
| _out=sys.stdout, |
| _err=sys.stderr, |
| ) |
| |
| |
| def do_reviewers(args: argparse.Namespace) -> None: |
| revlist = get_reviewers() |
| print(gerrit_refspec_args(revlist.maintainers, revlist.reviewers)) |
| |
| |
| parser = argparse.ArgumentParser() |
| subbies = parser.add_subparsers(dest="subcommand") |
| subbies.required = True |
| |
| push = subbies.add_parser("push", help="Push changes to Gerrit with reviewers") |
| push.add_argument("remote") |
| push.add_argument("refspec") |
| push.add_argument("topic", nargs="?", default=None) |
| push.set_defaults(func=do_push) |
| |
| reviewers = subbies.add_parser("reviewers", help="Get the reviewer list.") |
| reviewers.set_defaults(func=do_reviewers) |
| |
| args = parser.parse_args() |
| args.func(args) |