blob: a52abbc2feee76c8cdf346203df6b840d9f20a1e [file] [log] [blame]
Andrew Jefferyf4019fe2018-05-18 16:42:18 +09301#!/usr/bin/env python3
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
10from obmc import maintainers
11from typing import cast, List, Optional
12import argparse
13import os
14import sh
15import sys
16
17git = sh.git.bake()
18
19def get_reviewers(root: Optional[str]=None, mname: str='MAINTAINERS') -> List[str]:
20 reviewers: List[str] = list()
21 if not root:
22 root = git('rev-parse', '--show-toplevel').strip()
23 mfile = os.path.join(root, mname)
24 with open(mfile, 'r') as mstream:
25 maintainers.trash_preamble(mstream)
26 block = maintainers.parse_block(mstream)
27 if not block:
28 return reviewers
29 mlist = cast(List[maintainers.Identity],
30 block[maintainers.LineType.MAINTAINER])
31 reviewers.extend(i.email.address for i in mlist)
32 if maintainers.LineType.REVIEWER in block:
33 rlist = cast(List[maintainers.Identity],
34 block[maintainers.LineType.REVIEWER])
35 reviewers.extend(i.email.address for i in rlist)
36 return reviewers
37
38def gerrit_refspec_args(reviewers: Optional[List[str]]=None) -> str:
39 args = ""
40 if reviewers:
41 args += ",".join("r={}".format(addr) for addr in reviewers)
42 return args
43
44def decorate_refspec(refspec: str) -> str:
45 gargs = gerrit_refspec_args(get_reviewers())
46 if '%' in refspec:
47 return "{},{}".format(refspec, gargs)
48 return "{}%{}".format(refspec, gargs)
49
50def do_push(args: argparse.Namespace) -> None:
51 git.push(args.remote, decorate_refspec(args.refspec),
52 _in=sys.stdin, _out=sys.stdout, _err=sys.stderr)
53
54parser = argparse.ArgumentParser()
55subbies = parser.add_subparsers(dest='subcommand')
56subbies.required = True
57push = subbies.add_parser("push", help="Push changes to Gerrit with reviewers")
58push.add_argument("remote")
59push.add_argument("refspec")
60push.set_defaults(func=do_push)
61
62args = parser.parse_args()
63args.func(args)