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

# Copyright 2020 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 os
import platform
import subprocess
import sys

FUCHSIA_DIR = os.path.normpath(
    os.path.join(__file__, os.pardir, os.pardir, os.pardir, os.pardir))
ROLL_AND_BUILD = os.path.join(FUCHSIA_DIR, 'scripts', 'rust', 'roll_and_build_for_bisect.sh')

def main():
    parser = argparse.ArgumentParser(
        "fx bisect-rustc",
        description="Bisecting a Rust toolchain roll failure.",
    )
    parser.add_argument('--reset', help='resets bisect state before exiting', action='store_true')
    parser.add_argument(
        '--rust', help='root directory of a Rust checkout', required=True)
    parser.add_argument(
        '--bad', help='the earliest known-bad git ref', required=True)
    parser.add_argument(
        '--good', help='the latest known-good git ref', required=True)
    parser.add_argument(
        'command', nargs='*', help='command to run (try `fx build TARGET` or `fx test NAME`)')
    args = parser.parse_args()

    rust = args.rust
    host_os = {'Linux': 'linux', 'Darwin': 'mac'}[platform.system()]
    host_cpu = {'x86_64': 'amd64', 'arm64': 'arm64'}[platform.machine()]

    bisect = ['git', 'bisect']
    start = bisect + ['start', '--no-checkout', '--first-parent', args.bad, args.good]
    run = bisect + ['run', ROLL_AND_BUILD, FUCHSIA_DIR, f"{host_os}-{host_cpu}"] + args.command
    reset = bisect + ['reset']

    try:
        print('Resetting bisect state in Rust root before starting a new one.')
        subprocess.run(reset, cwd=rust)

        print('Starting bisect.')
        subprocess.run(start, check=True, cwd=rust)

        print('Running bisect.')
        subprocess.run(run, check=True, cwd=rust)
    finally:
        if args.reset:
            print('Resetting bisect state in Rust root.')
            subprocess.run(reset, cwd=rust)
        else:
            print('WARNING: Exiting without cleaning bisect state.')
            print('Run `git bisect reset` in Rust root to finish cleanup.')
            print('Pass --reset to future invocations of this command to do so automatically.')

    return 0


if __name__ == "__main__":
    sys.exit(main())
