contrib/packaging/packaging.py
author Simon Sapin <simon.sapin@octobus.net>
Wed, 03 Mar 2021 18:38:22 +0100
changeset 46739 92e3cfd63096
parent 43704 303bf312d5ed
permissions -rwxr-xr-x
rhg: Fall back to Python on unsupported `rhg config <section>` Printing an entire section (as opposed to a single value with `rhg config foo.bar`) is not supported yet in Rust only. Differential Revision: https://phab.mercurial-scm.org/D10098

#!/usr/bin/env python3
#
# packaging.py - Mercurial packaging functionality
#
# 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-packaging"


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["HGPACKAGING_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 hgpackaging.cli as cli

    # Need to strip off main Python executable.
    cli.main()


if __name__ == "__main__":
    try:
        if "HGPACKAGING_BOOTSTRAPPED" not in os.environ:
            bootstrap()
        else:
            run()
    except subprocess.CalledProcessError as e:
        sys.exit(e.returncode)
    except KeyboardInterrupt:
        sys.exit(1)