contrib/automation/automation.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 10 Aug 2021 12:56:32 +0200
branchstable
changeset 47826 83235fb50e1c
parent 43076 2372284d9457
permissions -rwxr-xr-x
run-tests: introduce a --pyoxidized option This options make it possible to use the pyoxidizer version to run the tests. This is a first basic version that is windows only. The test needs a working python, with Mercurial installed. However the pyoxidizer product is "self contains" without a "usable" Python. There have been discussion to have a fully functional `hg admin::python` command providing a fully functional python interpreter, but nothing is of the sort is ready yet. In In the meantime we use an hybrid approach, similar to what we do for testing `rhg`. We install a full "normal" Mercurial, but also the pyxodizer product as the official `hg binary`. That way, we use the pyoxidizer version or everything, but test that needs to run python have it available, with a fully functional Mercurial package. This first version is pretty basic (Windows only, no --local, not --with-pyoxidized), but it runs, various bug that we will have to fix. Differential Revision: https://phab.mercurial-scm.org/D11277

#!/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)