blob: c6636e544540ad501a40eca53cb6918a865a3456 [file] [log] [blame]
Patrick Williams45c70172021-03-04 20:25:26 -06001#!/usr/bin/env -S python3 -B
Andrew Jefferyf4019fe2018-05-18 16:42:18 +09302#
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
10from obmc import maintainers
Patrick Williams0b047c42021-06-21 16:08:29 -050011from obmc.reviewlist import ReviewList
12from typing import cast, Callable, List, Optional
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093013import argparse
14import os
Patrick Williams2deb2e32021-06-21 15:15:20 -050015import sh # type: ignore
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093016import sys
17
Patrick Williams2deb2e32021-06-21 15:15:20 -050018git: Callable[..., str] = sh.git.bake()
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093019
Patrick Williams9a014392021-06-21 14:57:29 -050020
Patrick Williams404d3012021-06-21 15:33:11 -050021def get_reviewers(
22 root: Optional[str] = None, mname: str = "MAINTAINERS"
Patrick Williams0b047c42021-06-21 16:08:29 -050023) -> ReviewList:
24
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093025 if not root:
Patrick Williams9a014392021-06-21 14:57:29 -050026 root = git("rev-parse", "--show-toplevel").strip()
Patrick Williams951268d2021-06-21 15:53:10 -050027
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093028 mfile = os.path.join(root, mname)
Patrick Williams951268d2021-06-21 15:53:10 -050029 if os.path.exists(mfile):
30 return maintainers.get_reviewers(mfile)
31
Patrick Williams0b047c42021-06-21 16:08:29 -050032 return ReviewList()
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093033
Patrick Williams9a014392021-06-21 14:57:29 -050034
35def gerrit_refspec_args(
Patrick Williams404d3012021-06-21 15:33:11 -050036 maintainers: Optional[List[str]] = None,
37 reviewers: Optional[List[str]] = None,
38 topic: str = None,
Patrick Williams9a014392021-06-21 14:57:29 -050039) -> str:
Patrick Williams2deb2e32021-06-21 15:15:20 -050040 argl: List[str] = []
Patrick Williams404d3012021-06-21 15:33:11 -050041 if maintainers:
42 argl.extend("r={}".format(addr) for addr in maintainers)
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093043 if reviewers:
Patrick Williams404d3012021-06-21 15:33:11 -050044 argl.extend("cc={}".format(addr) for addr in reviewers)
Andrew Jeffery3512b932020-06-15 13:09:16 +093045 if topic:
Lei YU8e56c312020-07-30 10:14:47 +000046 argl.append("topic={}".format(topic))
Andrew Jeffery3512b932020-06-15 13:09:16 +093047 return ",".join(argl)
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093048
Patrick Williams9a014392021-06-21 14:57:29 -050049
Andrew Jeffery3512b932020-06-15 13:09:16 +093050def decorate_refspec(refspec: str, topic: str) -> str:
Patrick Williams0b047c42021-06-21 16:08:29 -050051 revlist = get_reviewers()
52 gargs = gerrit_refspec_args(revlist.maintainers, revlist.reviewers, topic)
Andrew Jeffery39654b12018-05-22 12:38:53 +093053 if not gargs:
54 return refspec
Patrick Williams9a014392021-06-21 14:57:29 -050055 if "%" in refspec:
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093056 return "{},{}".format(refspec, gargs)
57 return "{}%{}".format(refspec, gargs)
58
Patrick Williams9a014392021-06-21 14:57:29 -050059
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093060def do_push(args: argparse.Namespace) -> None:
Patrick Williams2deb2e32021-06-21 15:15:20 -050061 git(
62 "push",
Patrick Williams9a014392021-06-21 14:57:29 -050063 args.remote,
64 decorate_refspec(args.refspec, args.topic),
65 _in=sys.stdin,
66 _out=sys.stdout,
67 _err=sys.stderr,
68 )
69
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093070
Patrick Williams2d198342021-06-21 15:35:50 -050071def do_reviewers(args: argparse.Namespace) -> None:
Patrick Williams0b047c42021-06-21 16:08:29 -050072 revlist = get_reviewers()
73 print(gerrit_refspec_args(revlist.maintainers, revlist.reviewers))
Patrick Williams2d198342021-06-21 15:35:50 -050074
75
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093076parser = argparse.ArgumentParser()
Patrick Williams9a014392021-06-21 14:57:29 -050077subbies = parser.add_subparsers(dest="subcommand")
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093078subbies.required = True
Patrick Williams2d198342021-06-21 15:35:50 -050079
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093080push = subbies.add_parser("push", help="Push changes to Gerrit with reviewers")
81push.add_argument("remote")
82push.add_argument("refspec")
Patrick Williams9a014392021-06-21 14:57:29 -050083push.add_argument("topic", nargs="?", default=None)
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093084push.set_defaults(func=do_push)
85
Patrick Williams2d198342021-06-21 15:35:50 -050086reviewers = subbies.add_parser("reviewers", help="Get the reviewer list.")
87reviewers.set_defaults(func=do_reviewers)
88
Andrew Jefferyf4019fe2018-05-18 16:42:18 +093089args = parser.parse_args()
90args.func(args)