#!/usr/bin/env python3.8

# 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())
