Newer
Older
#!/usr/bin/env python3
import os
import stat
import sys
import subprocess
from pathlib import Path
USAGE = "USAGE: %s ROOTPATH" % os.path.basename(sys.argv[0])
POULPE_DIR = Path(__file__).absolute().parent.parent
RESULT_DIR = "results"
BIN_ENV_DIR = "bin-envs"
DATA_ENV_DIR = "data-envs"
BENCHMARK_DIR = "benchmarks"
REPOSITORIES_DIR = "repositories"
DIRECTORIES = [
RESULT_DIR,
BIN_ENV_DIR,
DATA_ENV_DIR,
BENCHMARK_DIR,
REPOSITORIES_DIR
SUITE_DIR = "suites"
TOOLING = "tooling"
def install_poulpe(poulpe_dir):
"""setup a venv and install poulpe in it"""
print("Installing poulpe (editable) into a new venv")
install_venv = [sys.executable, "-m", "venv", ".venv"]
update_pip = [
str(Path(".venv") / "bin" / "pip"),
"install",
"--quiet",
"--upgrade",
"pip",
]
install_poulpe = [
str(Path(".venv") / "bin" / "pip"),
"install",
"--quiet",
"--editable",
str(poulpe_dir),
]
commands = [install_venv, update_pip, install_poulpe]
for command in commands:
subprocess.run(command, check=True)
ACTIVATE = """#!/usr/bin/bash
export POULPE_BASE_DIR="%s"
. "$POULPE_BASE_DIR"/.venv/bin/activate
"""
POULPE_PROXY = """#!/usr/bin/bash
base="`dirname $0`"
. "$base"/activate
poulpe "$@"
BASH_PROXY = """#!/usr/bin/bash
base="`dirname $0`"
"$@"
"""
def setup_quick_access(base_dir):
print('Creating a "bin/" directory with some utility')
Path("bin").mkdir(parents=True)
dir_bin = Path("bin")
poulpe_proxy = dir_bin / "poulpe"
poulpe_proxy.write_text(POULPE_PROXY)
poulpe_proxy.chmod(poulpe_proxy.stat().st_mode | stat.S_IEXEC)
activate = dir_bin / "activate"
activate.write_text(ACTIVATE % base_dir)
bash_proxy = dir_bin / "shell"
bash_proxy.write_text(BASH_PROXY)
bash_proxy.chmod(bash_proxy.stat().st_mode | stat.S_IEXEC)
def clone_one_repo(repo_dir, repo_type, url, dest):
dest = repo_dir / dest
if repo_type != "hg":
raise NotImplementedError(repo_type)
clone_hg(url, dest)
def clone_hg(source, dest):
environ = os.environ.copy()
environ["HGRCPATH"] = ""
environ["HGPLAIN"] = ""
command = [
"hg",
"clone",
"--quiet",
source,
dest,
]
if "TESTTMP" in environ:
command.extend([
"--config",
"extensions.share=",
"--config",
"share.poolnaming=remote",
"--config",
f"share.pool={POULPE_DIR}/.repos_caches",
])
subprocess.run(command, check=True)
def setup_base_dir(path):
base_path = Path(path).absolute()
print("Creating folders")
base_path.mkdir(parents=True)
for d in DIRECTORIES:
base_path.joinpath(d).mkdir()
old_dir = os.curdir
os.chdir(base_path)
try:
install_poulpe(POULPE_DIR)
setup_quick_access(base_path)
print("Create symlinks to Poulpe")
tooling = Path(TOOLING)
tooling.mkdir()
local_poulpe = tooling / "poulpe"
os.symlink(POULPE_DIR.resolve(), local_poulpe)
os.symlink(local_poulpe / SUITE_DIR, SUITE_DIR)
bench = base_path / BENCHMARK_DIR
bench_glob = local_poulpe.absolute() / SUITE_DIR / '*' / 'benchmarks'
for p in glob.glob(str(bench_glob)):
b = Path(p).relative_to(base_path)
suite_name = b.name
os.symlink('..' / b, bench / suite_name)
finally:
os.chdir(old_dir)
print("cloning repositories to benchmark")
repos = base_path / REPOSITORIES_DIR
for listing in glob.glob(str(base_path / 'suites' / '*' / 'repositories')):
with open(listing) as f:
for line in f:
line = line.strip()
if not line.startswith('#'):
spec = line.split()
if len(spec) != 3:
msg = "ignoring malformated repository line: %r"
msg %= line
print(msg, file=sys.stderr)
clone_one_repo(repos, *spec)

Pierre-Yves David
committed
print("updating environment variable")
repos = base_path / REPOSITORIES_DIR
activate = base_path / "bin" / "activate"
for env in glob.glob(str(base_path / 'suites' / '*' / 'environment')):
source = Path(p).relative_to(base_path)
with activate.open(mode="a") as f:
f.write("# from %s\n" % source)
with open(env) as e:
f.write(e.read())