| #!/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 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( |
| 'buildargs', nargs='*', help='arguments to pass to `fx build`') |
| 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.buildargs |
| 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()) |