blob: 39f42cdcd91c275374380c7b762fa303acda8894 [file] [log] [blame]
# Copyright 2022 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Extracts a concise error from a bazel log."""
from pathlib import Path
import re
import sys
def parse_bazel_stdout(bazel_stdout: Path) -> str:
"""Extracts a concise error from a bazel log."""
seen_error = False
error_lines = []
with bazel_stdout.open() as ins:
for line in ins:
# Trailing whitespace isn't significant, as it doesn't affect the
# way the line shows up in the logs. However, leading whitespace may
# be significant, especially for compiler error messages.
line = line.rstrip()
if re.match(r'^ERROR:', line):
seen_error = True
if seen_error:
# Ignore long lines that just show the environment.
if re.search(r' +[\w_]*(PATH|PWD)=.* \\', line):
continue
# Ignore lines that only show bazel sandboxing.
if line.strip().startswith(('(cd /', 'exec env')):
continue
if line.strip().startswith('Use --sandbox_debug to see'):
continue
if line.strip().startswith('# Configuration'):
continue
# An "<ALLCAPS>:" line usually means compiler output is done
# and useful compiler errors are complete.
if re.match(r'^(?!ERROR)[A-Z]+:', line):
break
error_lines.append(line)
result = '\n'.join(error_lines)
return re.sub(r'\n+', '\n', result)
if __name__ == '__main__':
print(parse_bazel_stdout(Path(sys.argv[1])))