#!/usr/bin/env fuchsia-vendored-python

# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import itertools
import os
import subprocess
import sys
import xml.etree.ElementTree as ET


def main():
    parser = argparse.ArgumentParser(
        description="Find the first integration revision that integrated"
        "a given petal revision.")
    parser.add_argument("petal_path")
    parser.add_argument("petal_revision")
    args = parser.parse_args()

    fuchsia_dir = os.environ["FUCHSIA_DIR"]

    imports = ET.parse(os.path.join(
        fuchsia_dir,
        ".jiri_manifest")).findall('./imports/import[@name=\'integration\']')

    components = []
    for n in imports:
        if n.attrib["remote"].startswith("sso://"):
            components.append("fuchsia")
            break

    components.extend([args.petal_path, "minimal"])

    integration_dir = os.path.join(fuchsia_dir, "integration")
    petal_dir = os.path.join(fuchsia_dir, args.petal_path)

    manifest_path = os.path.join(*components)
    project_xpath = './projects/project[@name=\'%s\']' % args.petal_path

    # Used to avoid shelling out to git multiple times with same petal revision.
    last_petal_revision_checked = None
    descendant_found = False
    for i in itertools.count(start=0, step=1):
        manifest_string = subprocess.check_output([
            "git",
            "-C",
            integration_dir,
            "show",
            "HEAD~%d:%s" % (i, manifest_path),
        ])
        for project in ET.fromstring(manifest_string).findall(project_xpath):
            petal_revision_at_integration_revision = project.attrib["revision"]

        if petal_revision_at_integration_revision != last_petal_revision_checked:
            last_petal_revision_checked = petal_revision_at_integration_revision
            if not subprocess.call([
                    "git",
                    "-C",
                    petal_dir,
                    "merge-base",
                    "--is-ancestor",
                    args.petal_revision,
                    petal_revision_at_integration_revision,
            ]):
                descendant_found = True
            elif descendant_found:
                subprocess.check_call(
                    [
                        "git",
                        "-C",
                        integration_dir,
                        "rev-parse",
                        "HEAD~%d" % (i - 1),
                    ],
                    stdout=sys.stdout,
                    stderr=sys.stderr,
                )
                break


if __name__ == "__main__":
    main()
