mirror of
https://github.com/github/codeql.git
synced 2025-12-16 08:43:11 +01:00
This PR introduces a `codeql_pack_rule` that does the heavy lifting of extracting arch- and common zip files for production dist building. It also factors out the installer targets for individual packs, as well as pack groups. This changes the contract between the internal build system and the pack definition significantly, which is why an accompanying internal PR is required. No backwards compatibility layer is provided, as the PR as complex enough as-is. The individual `codeql_pack` rules are now much simpler, as they mostly stuff their inputs into a new `_CodeQLPackInfo` provider, and let the installer and `codeql_pack_group` rules do the heavy lifting. For working in the external repo with self-contained packs, the per-pack installer targets are still available. Internally, we'll only use the new `codeql_pack_group` targets going forward, both for defining intree-dists and for building the production zip files.
61 lines
2.6 KiB
Python
61 lines
2.6 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",
|
|
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`")
|
|
|
|
if opts.build_file:
|
|
build_file = runfiles.Rlocation(opts.build_file)
|
|
destdir = pathlib.Path(build_file).resolve().parent / opts.destdir
|
|
else:
|
|
destdir = pathlib.Path(opts.destdir)
|
|
assert destdir.is_absolute(), "Provide `--build-file` to resolve destination directory"
|
|
script = runfiles.Rlocation(opts.pkg_install_script)
|
|
|
|
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"
|
|
zip = zip.strip()
|
|
dest = destdir / prefix
|
|
dest.mkdir(parents=True, exist_ok=True)
|
|
subprocess.run([ripunzip, "unzip-file", zip, "-d", dest], check=True)
|