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

# This script parse the gerrit query results from the stdin
# and return the correct refspec

import sys
import json

def print_topic_tip(query_results):
    patchsets = []
    parents = []
    project = query_results[0]["project"]
    topic = query_results[0]["topic"]

    # 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(topic, project))
    if len(tips) == 0:
        raise Exception("No tip commit found for {} in {}.".format(topic, project))
    # Print the reference of the topic tip patchset
    print(tips[0]["ref"])

try:
    changes = [json.loads(resp_line) for resp_line in sys.stdin]
except:
    raise Exception("Input error, it's not a JSON string!")

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

if not changes:
    print("Warning: no changes found, returning empty string", file=sys.stderr)
elif len(changes) > 1:
    print_topic_tip(changes)
else:
    print(changes[0]["currentPatchSet"]["ref"])
