mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
56 lines
2.4 KiB
Python
56 lines
2.4 KiB
Python
"""
|
|
Helper script for installing `codeql_pack` targets.
|
|
|
|
This mainly wraps around a `pkg_install` script from `rules_pkg` adding:
|
|
* resolving destination directory with respect to a provided `--build-file`
|
|
* clean-up of target destination directory before a reinstall
|
|
* installing imported zip files using a provided `--ripunzip`
|
|
"""
|
|
|
|
import argparse
|
|
import pathlib
|
|
import shutil
|
|
import subprocess
|
|
from python.runfiles import runfiles
|
|
|
|
runfiles = runfiles.Create()
|
|
assert runfiles, "Installer should be run with `bazel run`"
|
|
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument("--destdir", type=pathlib.Path, required=True,
|
|
help="Desination directory, relative to `--build-file`")
|
|
parser.add_argument("--pkg-install-script", required=True,
|
|
help="The wrapped `pkg_install` installation script rlocation")
|
|
parser.add_argument("--build-file", required=True,
|
|
help="BUILD.bazel rlocation relative to which the installation should take place")
|
|
parser.add_argument("--ripunzip",
|
|
help="ripunzip executable rlocation. Must be provided if `--zip-manifest` is.")
|
|
parser.add_argument("--zip-manifest",
|
|
help="The rlocation of a file containing newline-separated `prefix:zip_file` entries")
|
|
parser.add_argument("--cleanup", action=argparse.BooleanOptionalAction, default=True,
|
|
help="Whether to wipe the destination directory before installing (true by default)")
|
|
opts = parser.parse_args()
|
|
if opts.zip_manifest and not opts.ripunzip:
|
|
parser.error("Provide `--ripunzip` when specifying `--zip-manifest`")
|
|
|
|
build_file = runfiles.Rlocation(opts.build_file)
|
|
script = runfiles.Rlocation(opts.pkg_install_script)
|
|
destdir = pathlib.Path(build_file).resolve().parent / opts.destdir
|
|
|
|
if destdir.exists() and opts.cleanup:
|
|
shutil.rmtree(destdir)
|
|
|
|
destdir.mkdir(parents=True, exist_ok=True)
|
|
subprocess.run([script, "--destdir", destdir], check=True)
|
|
|
|
if opts.zip_manifest:
|
|
ripunzip = runfiles.Rlocation(opts.ripunzip)
|
|
zip_manifest = runfiles.Rlocation(opts.zip_manifest)
|
|
with open(zip_manifest) as manifest:
|
|
for line in manifest:
|
|
prefix, _, zip = line.partition(":")
|
|
assert zip, f"missing prefix for {prefix}, you should use prefix:zip format"
|
|
dest = destdir / prefix
|
|
dest.mkdir(parents=True, exist_ok=True)
|
|
subprocess.run([ripunzip, "unzip-file", zip, "-d", dest], check=True)
|