blob: 3adb4b7abe3cecb26d314bca5fcbab127c80b9ac [file] [log] [blame]
from pathlib import Path
import json
import os
import platform
import re
import shutil
from subprocess import Popen
import sys
import tempfile
from rules_python.python.runfiles import runfiles
r = runfiles.Create()
def modify_WORKSPACE(wksp, distro_path):
"""Update the WORKSPACE file in the example to point to our locally-built tar.gz
This allows users to clone rules_python, cd into the example/dir, and run the example directly,
while our integration tests use the locally-built copy.
Args:
wksp: filesystem absolute path of the bazel WORKSPACE file under test
distro_path: runfiles path of the distro .tar.gz
"""
with open(wksp, 'r') as wksp_file:
content = wksp_file.read()
# Replace the url for rules_python with our locally built one
content = re.sub(
r'url = "https://github.com/bazelbuild/rules_python/releases/download/[^"]+"',
'url = "file://%s"' % r.Rlocation(distro_path),
content)
content = re.sub(r'sha256 = "', '#\1', content)
with open(wksp, 'w') as wksp_file:
wksp_file.write(content)
def main(conf_file):
with open(conf_file) as j:
config = json.load(j)
isWindows = platform.system() == 'Windows'
bazelBinary = r.Rlocation(os.path.join(config['bazelBinaryWorkspace'], 'bazel.exe' if isWindows else 'bazel'))
workspacePath = config['workspaceRoot']
# Canonicalize bazel external/some_repo/foo
if workspacePath.startswith('external/'):
workspacePath = '..' + workspacePath[len('external'):]
with tempfile.TemporaryDirectory(dir = os.environ['TEST_TMPDIR']) as tmpdir:
workdir = os.path.join(tmpdir, "wksp")
print("copying workspace under test %s to %s" % (workspacePath, workdir))
shutil.copytree(workspacePath, workdir)
modify_WORKSPACE(os.path.join(workdir, 'WORKSPACE'), config['distro'])
for command in config['bazelCommands']:
bazel_args = command.split(' ')
try:
doubleHyphenPos = bazel_args.index('--')
print("patch that in ", doubleHyphenPos)
except ValueError:
pass
# Bazel's wrapper script needs this or you get
# 2020/07/13 21:58:11 could not get the user's cache directory: $HOME is not defined
os.environ['HOME'] = str(Path.home())
bazel_args.insert(0, bazelBinary)
bazel_process = Popen(bazel_args, cwd = workdir)
bazel_process.wait()
if bazel_process.returncode != 0:
# Test failure in Bazel is exit 3
# https://github.com/bazelbuild/bazel/blob/486206012a664ecb20bdb196a681efc9a9825049/src/main/java/com/google/devtools/build/lib/util/ExitCode.java#L44
sys.exit(3)
if __name__ == '__main__':
main(sys.argv[1])