зеркало из https://github.com/github/codeql.git
67 строки
2.2 KiB
Python
67 строки
2.2 KiB
Python
"""
|
|
Update generated files related to Go in the repo. Using --force will regenerate all files from scratch.
|
|
|
|
In particular the script will:
|
|
1. update the `vendor` dir with `go mod vendor` (using a go toolchain provided by bazel)
|
|
2. update `BUILD.bazel` files using gazelle
|
|
3. update `ql/lib/go.dbscheme` using a compiled `go-dbschemegen`
|
|
"""
|
|
|
|
import sys
|
|
import pathlib
|
|
import subprocess
|
|
import os
|
|
import argparse
|
|
import shutil
|
|
from python.runfiles import runfiles
|
|
|
|
def options():
|
|
p = argparse.ArgumentParser(description="Update generated files related to Go in the repo")
|
|
p.add_argument("--force", "-f", action="store_true", help="Regenerate all files from scratch rather than updating them")
|
|
p.add_argument("executables", nargs=3, help="Internally provided executables")
|
|
return p.parse_args()
|
|
|
|
opts = options()
|
|
|
|
try:
|
|
workspace_dir = pathlib.Path(os.environ['BUILD_WORKSPACE_DIRECTORY'])
|
|
except KeyError:
|
|
print("this should be run with bazel run", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
go_extractor_dir = workspace_dir / "go" / "extractor"
|
|
|
|
if not go_extractor_dir.exists():
|
|
# internal repo?
|
|
workspace_dir /= "ql"
|
|
go_extractor_dir = workspace_dir / "go" / "extractor"
|
|
|
|
go_dbscheme = workspace_dir / "go" / "ql" / "lib" / "go.dbscheme"
|
|
r = runfiles.Create()
|
|
go, gazelle, go_gen_dbscheme = map(r.Rlocation, opts.executables)
|
|
|
|
|
|
existing_build_files = set(go_extractor_dir.glob("*/**/BUILD.bazel"))
|
|
|
|
if opts.force:
|
|
print("clearing generated BUILD files")
|
|
for build_file in existing_build_files:
|
|
build_file.unlink()
|
|
|
|
print("running gazelle", gazelle, go_extractor_dir)
|
|
subprocess.check_call([gazelle, "go/extractor"], cwd=workspace_dir)
|
|
|
|
# we want to stamp all newly generated `BUILD.bazel` files with a header
|
|
build_files_to_update = set(go_extractor_dir.glob("*/**/BUILD.bazel"))
|
|
# if --force, all files are new
|
|
if not opts.force:
|
|
# otherwise, subtract the files that existed at the start
|
|
build_files_to_update -= existing_build_files
|
|
|
|
print("adding header to newly generated BUILD files")
|
|
for build_file in build_files_to_update:
|
|
contents = build_file.read_text()
|
|
build_file.write_text(f"# generated running `bazel run //go/gazelle`, do not edit\n\n{contents}")
|
|
|
|
subprocess.check_call([go_gen_dbscheme, go_dbscheme])
|