#!/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) -> 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 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),
             _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)
