blob: c1c131384e065de913c3f120e5ceeb977fbbed72 [file] [log] [blame] [edit]
#!/usr/bin/env python3
# Copyright 2022 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Convert the binary Bazel workspace log to text format."""
import argparse
import os
import shlex
import subprocess
import sys
from typing import Optional
_SCRIPT_DIR = os.path.dirname(__file__)
_FUCHSIA_DIR = os.path.abspath(os.path.join(_SCRIPT_DIR, "..", "..", ".."))
sys.path.insert(0, _SCRIPT_DIR)
import build_utils
def find_default_log_file() -> Optional[str]:
"""Find the location of the default log file.
Returns:
Path to the default log file, or None if it could not be determined.
"""
fuchsia_dir = build_utils.find_fuchsia_dir()
if not fuchsia_dir:
return None
build_dir = build_utils.find_fx_build_dir(fuchsia_dir)
if not build_dir:
return None
top_dir = os.path.join(build_dir, build_utils.get_bazel_topdir(fuchsia_dir))
log_file = os.path.join(top_dir, "logs", "workspace-events.log")
return log_file
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"--jre",
help="Specify Java JRE used to run the parser, default uses the prebuilt Bazel JRE.",
)
parser.add_argument(
"--log-parser-jar",
help="Specify alternative location for parser .jar file.",
)
parser.add_argument(
"--exclude_rule",
action="append",
default=[],
help="Rule(s) to filter out while parsing.",
)
parser.add_argument(
"--output_path",
help="Output file location. If not used, output goes to stdout.",
)
parser.add_argument("--log_file", help="Input log file (auto-detected).")
parser.add_argument(
"--verbose", action="store_true", help="Enable verbose mode."
)
args = parser.parse_args()
# Find the Java Runtime Environment to run the parser first.
java_binary = os.path.join("bin", "java")
if sys.platform.startswith("win"):
java_binary += ".exe"
def find_java_binary(jre_path: str) -> Optional[str]:
path = os.path.join(jre_path, java_binary)
return path if os.path.exists(path) else None
if args.jre:
java_launcher = find_java_binary(args.jre)
if not java_launcher:
parser.error("Invalid JRE path: " + args.jre)
return 1
else:
# Auto-detect the prebuilt bazel JRE first
prebuilt_bazel_jdk = os.path.join(
_FUCHSIA_DIR,
"prebuilt",
"third_party",
"bazel",
build_utils.get_host_tag(),
"install_base",
"embedded_tools",
"jdk",
)
java_launcher = find_java_binary(prebuilt_bazel_jdk)
if not java_launcher:
print(
"ERROR: Missing prebuilt Bazel JDK launcher, please use --jre=<DIR>: %s/%s"
% (prebuilt_bazel_jdk, java_binary),
file=sys.stderr,
)
return 1
def verbose(msg: str) -> None:
if args.verbose:
print("DEBUG: " + msg, file=sys.stderr)
# Find the parser JAR file now.
if args.log_parser_jar:
log_parser_jar = args.log_parser_jar
else:
log_parser_jar = os.path.join(
_FUCHSIA_DIR,
"prebuilt",
"third_party",
"bazel_workspacelogparser",
"bazel_workspacelogparser.jar",
)
if not os.path.exists(log_parser_jar):
parser.error("Missing parser file: " + log_parser_jar)
verbose("Using jar file at: " + log_parser_jar)
log_file = args.log_file
if not args.log_file:
log_file = find_default_log_file()
if not log_file:
print(
"ERROR: Could not find default log file, please use --log_file=FILE",
file=sys.stderr,
)
return 1
verbose("Using log file at: " + log_file)
cmd = [java_launcher, "-jar", log_parser_jar, "--log_path=" + log_file]
cmd += ["--exclude_rule=" + rule for rule in args.exclude_rule]
if args.output_path:
cmd += ["--output_path=" + args.output_path]
verbose("Running command: %s" % " ".join([shlex.quote(c) for c in cmd]))
return subprocess.run(cmd).returncode
if __name__ == "__main__":
sys.exit(main())