#!/usr/bin/env python3
#
# Copyright (c) 2019, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#

# This scripts translates certain accepted refspec schemes to something that can
# be used on git command line. For example, given the refspec 'topic:foo/bar'
# for a given project, this script translates and prints the full commit hash.
#
# If a scheme is not recognized, print the received refspec unchanged.

import argparse
import gerrit
import sys

# Gerrit servers we care about.
gerrit_arm = gerrit.GerritServer("gerrit.oss.arm.com")
gerrit_tforg = gerrit.GerritServer("review.trustedfirmware.org")

# Trusted Firmware-A and associated projects.
# Different projects are hosted on different Gerrit servers.
projects = {
    # Projects hosted on Arm Gerrit server.
    "arm": {
        "trusted-firmware": gerrit.GerritProject("pdcs-platforms/ap/tf-topics", gerrit_arm),
        "trusted-firmware-tf": gerrit.GerritProject("trusted-firmware/tf-a-tests", gerrit_arm),
        "trusted-firmware-ci": gerrit.GerritProject("pdswinf/ci/pdcs-platforms/platform-ci", gerrit_arm),
        "scp": gerrit.GerritProject("scp/firmware", gerrit_arm),
    },

    # Projects hosted on trustedfirmware.org Gerrit server.
    "tforg": {
        "trusted-firmware": gerrit.GerritProject("TF-A/trusted-firmware-a", gerrit_tforg),
        "trusted-firmware-tf": gerrit.GerritProject("TF-A/tf-a-tests", gerrit_tforg),
    },
}

# Argument setup
parser = argparse.ArgumentParser()
parser.add_argument("--project", "-p",
                    help="Gerrit project identifier this refspec belongs to")
parser.add_argument("--server", "-s", help="Gerrit server hosting this project",
                    choices=["arm", "tforg"])
parser.add_argument("--user", "-u",
                    help="Username to use to query the Gerrit server")
parser.add_argument("--key", "-k",
                    help="SSH private key to use to authenticate with the Gerrit server")
parser.add_argument("refspec", help="Refspec to translate")
opts = parser.parse_args()

project = projects[opts.server][opts.project]

# Default action: print refspec and exit
def do_default():
    print(opts.refspec)
    sys.exit(0)

def print_topic_tip(query_results):
    patchsets = []
    parents = []

    # For each change, get its most recent patchset
    for change in query_results:
        patchsets.append(change["patchSets"][-1])

    # For each patchset, get its parent commit
    for patchset in patchsets:
        parents.append(patchset["parents"][0])

    # If a patchset's revision is NOT in the list of parents then it should
    # be the tip commit
    tips = list(filter(lambda x: x["revision"] not in parents, patchsets))

    # There must be only one patchset remaining, otherwise the tip is ambiguous
    if len(tips) > 1:
        raise Exception("{} in {} has no unique tip commit.".format(opts.refspec,
                                                                    opts.project))
    if len(tips) == 0:
        raise Exception("No tip commit found for {} in {}.".format(opts.refspec,
                                                                   opts.project))
    # Print the reference of the topic tip patchset
    print(tips[0]["ref"])

query = ["status:open"]

# If we don't understand the refspec, that's OK. We don't translate it, but
# print it as is.
try:
    scheme, rest = opts.refspec.split(":")
    if scheme == "topic":
        query += ["topic:" + rest]
    elif scheme == "change":
        query += [opts.refspec]
    else:
        do_default()
except:
    do_default()

changes = project.query(query, username=opts.user, keyfile=opts.key)

# The last object is a summary; drop it as it's not of interest to us.
changes.pop()

if not changes:
    raise Exception("{} for {} resolved to nothing.".format(opts.refspec,
                                                            opts.project))

if scheme == "topic":
    if len(changes) > 1:
       print_topic_tip(changes)
    else:
        print(changes[0]["currentPatchSet"]["ref"])
elif scheme == "change":
    if len(changes) > 1:
        # When querying for a specific change there must be just a single result
        raise Exception("{} for {} did not resolve uniquely.".format(opts.refspec,
                                                                     opts.project))
    print(changes[0]["currentPatchSet"]["revision"])
