| #!/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. | |
| #### PREBUILTS=${PREBUILT_PYTHON3} | |
| 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'}[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()) |