blob: 6cb24cba02c76b8f37bf1c9d7473f665bb90307a [file] [log] [blame]
#!/usr/bin/env python3
#
# 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 typing import cast, List, Optional
import argparse
import os
import sh
import sys
git = sh.git.bake()
def get_reviewers(root: Optional[str]=None, mname: str='MAINTAINERS') -> List[str]:
reviewers = cast(List[str], list())
if not root:
root = git('rev-parse', '--show-toplevel').strip()
mfile = os.path.join(root, mname)
if not os.path.exists(mfile):
return reviewers
with open(mfile, 'r') as mstream:
maintainers.trash_preamble(mstream)
block = maintainers.parse_block(mstream)
if not block:
return reviewers
mlist = cast(List[maintainers.Identity],
block[maintainers.LineType.MAINTAINER])
reviewers.extend(i.email.address for i in mlist)
if maintainers.LineType.REVIEWER in block:
rlist = cast(List[maintainers.Identity],
block[maintainers.LineType.REVIEWER])
reviewers.extend(i.email.address for i in rlist)
return reviewers
def gerrit_refspec_args(reviewers: Optional[List[str]]=None, topic: str=None) -> str:
argl = []
if reviewers:
argl.extend("r={}".format(addr) for addr in reviewers)
if topic:
argl.append("topic={}".format(topic));
return ",".join(argl)
def decorate_refspec(refspec: str, topic: str) -> str:
gargs = gerrit_refspec_args(get_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)
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")
push.set_defaults(func=do_push)
args = parser.parse_args()
args.func(args)