#!/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: List[str] = list()
    if not root:
        root = git('rev-parse', '--show-toplevel').strip()
    mfile = os.path.join(root, mname)
    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) -> str:
    args = ""
    if reviewers:
        args += ",".join("r={}".format(addr) for addr in reviewers)
    return args

def decorate_refspec(refspec: str) -> str:
    gargs = gerrit_refspec_args(get_reviewers())
    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),
             _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.set_defaults(func=do_push)

args = parser.parse_args()
args.func(args)
