view contrib/packaging/packaging.py @ 43701:c9301ac73b95

logcmdutil: add a type annotation This wasn't actually required in the end, as there was a real bug found by pytype, but the annotation helped me figure that out. We can drop this patch if that's the preference. Differential Revision: https://phab.mercurial-scm.org/D7382
author Augie Fackler <augie@google.com>
date Wed, 13 Nov 2019 22:22:31 -0500
parents 303bf312d5ed
children
line wrap: on
line source

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