view contrib/automation/automation.py @ 42273:651f325e4fdd

remotefilelog: move most functions in onetimeclientsetup() to top level This is how most extensions seem to do it. It makes sure we don't accidentally depend on the captured ui instance. Differential Revision: https://phab.mercurial-scm.org/D6333
author Martin von Zweigbergk <martinvonz@google.com>
date Wed, 01 May 2019 15:24:16 -0700
parents b05a3e28cf24
children 2372284d9457
line wrap: on
line source

#!/usr/bin/env python3
#
# automation.py - Perform tasks on remote machines
#
# Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com>
#
# 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)