##// END OF EJS Templates
setup: don't skip the search for global hg.exe if there is no local instance...
setup: don't skip the search for global hg.exe if there is no local instance The point of trying not to blindly execute `hg` on Windows is that the local hg.exe would be given precedence, and if py3 isn't on PATH, it errors out with a modal dialog. But that's not a problem if there is no local executable that could be run. The problem that I recently ran into was I upgraded the repo format to use zstd. But doing a `make clean` deletes all of the supporting libraries, causing the next run to abort with a message about not understanding the `revlog-compression-zstd` requirement. By getting rid of the local executable in the previous commit when cleaning, we avoid leaving a broken executable around, and avoid the py3 PATH problem too. There is still a small hole in that `hg.exe` needs to be deleted before switching between py2/py3/PyOxidizer builds, because the zstd module won't load. But that seems like good hygiene anyway. Differential Revision: https://phab.mercurial-scm.org/D8038

File last commit:

r43346:2372284d default
r44684:a7f8160c default
Show More
automation.py
74 lines | 1.7 KiB | text/x-python | PythonLexer
Gregory Szorc
automation: perform tasks on remote machines...
r42191 #!/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'
Augie Fackler
formatting: blacken the codebase...
r43346 args = [
str(pip),
'install',
'-r',
str(REQUIREMENTS_TXT),
'--disable-pip-version-check',
]
Gregory Szorc
automation: perform tasks on remote machines...
r42191
if not venv_created:
args.append('-q')
subprocess.run(args, check=True)
os.environ['HGAUTOMATION_BOOTSTRAPPED'] = '1'
Augie Fackler
formatting: blacken the codebase...
r43346 os.environ['PATH'] = '%s%s%s' % (venv_bin, os.pathsep, os.environ['PATH'])
Gregory Szorc
automation: perform tasks on remote machines...
r42191
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)