ballistica/tools/spinoff
2024-04-23 22:18:54 -07:00

60 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3.12
# Released under the MIT License. See LICENSE for details.
#
"""Command line wrapper for the spinoff system."""
from __future__ import annotations
import os
import sys
import subprocess
if __name__ == '__main__':
# The initial invocation of this script actually just sets the stage
# for the *real* invocation of this script, which always happens
# from the fully-inited virtual env of the source project. This way
# all modules used by the spinoff system are in place and there's no
# abiguity where we could be loading Python stuff from the dst
# project while we're in the process of modifying it.
if 'BA_SPINOFF_SRC_ROOT' not in os.environ:
# Calc absolute paths for our source (and possibly dst)
# projects. If we are getting invoked via a symlink, what it
# points to is src and we are dst. Otherwise we are src and
# there is no dst.
dst_proj_root: str | None
if os.path.islink(sys.argv[0]):
src_spinoff_path = os.path.realpath(sys.argv[0])
dst_proj_root = os.path.abspath(
os.path.join(os.path.dirname(sys.argv[0]), '..')
)
else:
src_spinoff_path = sys.argv[0]
dst_proj_root = None # pylint: disable=invalid-name
src_proj_root = os.path.abspath(
os.path.join(os.path.dirname(src_spinoff_path), '..')
)
src_proj_python = os.path.join(src_proj_root, '.venv/bin/python3.12')
cmd = [src_proj_python, 'tools/spinoff'] + sys.argv[1:]
env = dict(os.environ, BA_SPINOFF_SRC_ROOT=src_proj_root)
if dst_proj_root is not None:
env['BA_SPINOFF_DST_ROOT'] = dst_proj_root
# Make sure the src project is properly bootstrapped.
subprocess.run(['make', 'env'], check=True, cwd=src_proj_root)
# Finally, run for realz (from src proj dir).
result = subprocess.run(cmd, check=False, env=env, cwd=src_proj_root)
sys.exit(result.returncode)
else:
from batools.spinoff import spinoff_main
# Ok; we're a real invocation. Do our thing.
spinoff_main()