diff -r bf87d34a675c -r b05a3e28cf24 contrib/automation/automation.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/automation/automation.py Fri Mar 15 11:24:08 2019 -0700 @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +# +# automation.py - Perform tasks on remote machines +# +# Copyright 2019 Gregory Szorc +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + +import os +import pathlib +import subprocess +import sys +import venv + + +HERE = pathlib.Path(os.path.abspath(__file__)).parent +REQUIREMENTS_TXT = HERE / 'requirements.txt' +SOURCE_DIR = HERE.parent.parent +VENV = SOURCE_DIR / 'build' / 'venv-automation' + + +def bootstrap(): + venv_created = not VENV.exists() + + VENV.parent.mkdir(exist_ok=True) + + venv.create(VENV, with_pip=True) + + if os.name == 'nt': + venv_bin = VENV / 'Scripts' + pip = venv_bin / 'pip.exe' + python = venv_bin / 'python.exe' + else: + venv_bin = VENV / 'bin' + pip = venv_bin / 'pip' + python = venv_bin / 'python' + + args = [str(pip), 'install', '-r', str(REQUIREMENTS_TXT), + '--disable-pip-version-check'] + + if not venv_created: + args.append('-q') + + subprocess.run(args, check=True) + + os.environ['HGAUTOMATION_BOOTSTRAPPED'] = '1' + os.environ['PATH'] = '%s%s%s' % ( + venv_bin, os.pathsep, os.environ['PATH']) + + subprocess.run([str(python), __file__] + sys.argv[1:], check=True) + + +def run(): + import hgautomation.cli as cli + + # Need to strip off main Python executable. + cli.main() + + +if __name__ == '__main__': + try: + if 'HGAUTOMATION_BOOTSTRAPPED' not in os.environ: + bootstrap() + else: + run() + except subprocess.CalledProcessError as e: + sys.exit(e.returncode) + except KeyboardInterrupt: + sys.exit(1)