build-scripts/main.py (144 lines of code) (raw):

import argparse import os from pathlib import Path import shutil import subprocess from build import build from const import CLI_BINARY_NAME, CLI_PACKAGE_NAME, PTY_BINARY_NAME from doc import run_doc from rust import cargo_cmd_name, rust_env from test import all_tests from util import Variant, get_variants class StoreIfNotEmptyAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): if values and len(values) > 0: setattr(namespace, self.dest, values) parser = argparse.ArgumentParser( prog="build", description="Builds the FigIoDesktop application", ) subparsers = parser.add_subparsers(help="sub-command help", dest="subparser", required=True) build_subparser = subparsers.add_parser(name="build") build_subparser.add_argument( "--output-bucket", action=StoreIfNotEmptyAction, help="The name of bucket to store the build artifacts", ) build_subparser.add_argument( "--signing-bucket", action=StoreIfNotEmptyAction, help="The name of bucket to store the build artifacts", ) build_subparser.add_argument( "--aws-account-id", action=StoreIfNotEmptyAction, help="The AWS account ID", ) build_subparser.add_argument( "--apple-id-secret", action=StoreIfNotEmptyAction, help="The Apple ID secret", ) build_subparser.add_argument( "--signing-role-name", action=StoreIfNotEmptyAction, help="The name of the signing role", ) build_subparser.add_argument( "--stage-name", action=StoreIfNotEmptyAction, help="The name of the stage", ) build_subparser.add_argument( "--not-release", action="store_true", help="Build a non-release version", ) build_subparser.add_argument( "--skip-tests", action="store_true", help="Skip running npm and rust tests", ) build_subparser.add_argument( "--skip-lints", action="store_true", help="Skip running lints", ) build_subparser.add_argument("--variant", action=StoreIfNotEmptyAction, help="Variant to build for") test_subparser = subparsers.add_parser(name="test") test_subparser.add_argument( "--clippy-fail-on-warn", action="store_true", help="Fail on clippy warnings", ) # runs CLI with the given arguments cli_subparser = subparsers.add_parser(name="cli") cli_subparser.add_argument( "args", nargs=argparse.REMAINDER, help="Arguments to pass to the CLI", ) install_cli = subparsers.add_parser(name="install-cli") install_cli.add_argument( "--release", action="store_true", help="Build a release version", ) install_cli.add_argument( "--variant", action="store", help="variant to build for", choices=["minimal", "full"], ) # run the docs command subparsers.add_parser(name="doc") args = parser.parse_args() match args.subparser: case "build": if args.variant: variants = [Variant[args.variant.upper()]] else: variants = None build( release=not args.not_release, variants=variants, output_bucket=args.output_bucket, signing_bucket=args.signing_bucket, aws_account_id=args.aws_account_id, apple_id_secret=args.apple_id_secret, signing_role_name=args.signing_role_name, stage_name=args.stage_name, run_lints=not args.skip_lints, run_test=not args.skip_tests, ) case "test": all_tests( clippy_fail_on_warn=args.clippy_fail_on_warn, ) case "doc": run_doc() case "cli": subprocess.run( [ cargo_cmd_name(), "run", f"--bin={CLI_PACKAGE_NAME}", *args.args, ], env={ **os.environ, **rust_env(release=False), }, ) case "install-cli": if args.variant: variant = Variant[args.variant.upper()] else: variant = get_variants()[0] output = build(release=args.release, variants=[variant], run_lints=False, run_test=False)[variant] pty_path = Path.home() / ".local" / "bin" / PTY_BINARY_NAME pty_path.unlink(missing_ok=True) shutil.copy2(output.pty_path, pty_path) cli_path = Path.home() / ".local" / "bin" / CLI_BINARY_NAME cli_path.unlink(missing_ok=True) shutil.copy2(output.cli_path, cli_path) case _: raise ValueError(f"Unsupported subparser {args.subparser}")