| #!/usr/bin/env fuchsia-vendored-python |
| # Copyright 2022 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. |
| """Script for running fint directly. |
| |
| This is useful for testing features, such as affected tests analysis, that are |
| normally only exercised by the infrastructure and not by fx. |
| |
| For example, if you want to see which tests `fint build` considers affected when |
| the files "src/foo.cc" and "src/bar.cc" are changed, run: |
| |
| ./tools/integration/fint/integration-test.py build -f <fint-params-path> -c src/foo.cc -c src/bar.cc |
| |
| Where <fint-params-path> is the relative path to a textproto file as chosen by |
| `fx repro`. |
| |
| Note that the affected tests analysis is also dependent on the state of the |
| checkout, so if you're testing to see how fint handles a specific change, you'll |
| need to cherry-pick that change into your checkout in addition to passing in the |
| names of the changed files. |
| |
| If successful, this will print the path to a temporary directory to which fint |
| has written its outputs. For the `build` command, the outputs will be in a file |
| named `build_artifacts.json` in that directory. |
| """ |
| |
| import argparse |
| import os |
| import subprocess |
| import sys |
| import tempfile |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| "cmd", type=str, help="fint subcommand to run (set or build)" |
| ) |
| parser.add_argument( |
| "-f", |
| "--fint-params-path", |
| help="path to fint params file", |
| required=True, |
| ) |
| parser.add_argument( |
| "-c", |
| "--changed-file", |
| action="append", |
| dest="changed_files", |
| default=[], |
| ) |
| |
| args = parser.parse_args() |
| |
| with tempfile.TemporaryDirectory() as inputs_dir: |
| execute(args, inputs_dir) |
| |
| |
| def execute(args, inputs_dir): |
| checkout_dir = os.environ["FUCHSIA_DIR"] |
| os.chdir(checkout_dir) |
| |
| artifact_dir = tempfile.mkdtemp() |
| |
| build_dir = subprocess.check_output( |
| ["fx", "get-build-dir"], text=True |
| ).strip() |
| |
| context_textproto = f""" |
| checkout_dir: "{checkout_dir}" |
| build_dir: "{build_dir}" |
| artifact_dir: "{artifact_dir}" |
| """ |
| for changed_file in args.changed_files: |
| context_textproto += f""" |
| changed_files {{ |
| path: "{changed_file}" |
| }} |
| """ |
| |
| context_path = os.path.join(inputs_dir, "context.textproto") |
| with open(context_path, "w") as f: |
| f.write(context_textproto) |
| |
| proc = subprocess.run( |
| [ |
| 'fx', 'go', 'run', |
| './tools/integration/fint/cmd/fint', |
| '-log-level', 'info', |
| args.cmd, |
| '-static', args.fint_params_path, |
| '-context', context_path, |
| ]) # fmt: skip |
| if proc.returncode != 0: |
| print("Failed to run fint. Make sure you have run `fx setup-go`.") |
| sys.exit(1) |
| |
| print(f"See {artifact_dir} for outputs.") |
| |
| |
| if __name__ == "__main__": |
| main() |