mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-23 07:16:21 +00:00
6d821124e0
This updates RepoLogger.log_aggregated_errors to print out the error message the RepoExitError when there is not a list of aggregated errors. Previously it would log out: ======================================================================= Repo command failed: ManifestParseError This told us what class of error occurred but missed the helpful error message that developers put in the error. After this change it will now print out the error message: ======================================================================= Repo command failed: ManifestParseError error parsing manifest /path/to/manifest.xml: no element found: line 197, column 0 Change-Id: I4805540fddb5fa9171dbc8912becfa7fdfb1ba67 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/392614 Commit-Queue: Aravind Vasudevan <aravindvasudev@google.com> Tested-by: Joshua Bartel <josh.bartel@garmin.com> Reviewed-by: Aravind Vasudevan <aravindvasudev@google.com>
94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
# Copyright (C) 2023 The Android Open Source Project
|
|
#
|
|
# 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
|
|
#
|
|
# http://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.
|
|
|
|
"""Logic for printing user-friendly logs in repo."""
|
|
|
|
import logging
|
|
|
|
from color import Coloring
|
|
from error import RepoExitError
|
|
|
|
|
|
SEPARATOR = "=" * 80
|
|
MAX_PRINT_ERRORS = 5
|
|
|
|
|
|
class _ConfigMock:
|
|
"""Default coloring config to use when Logging.config is not set."""
|
|
|
|
def __init__(self):
|
|
self.default_values = {"color.ui": "auto"}
|
|
|
|
def GetString(self, x):
|
|
return self.default_values.get(x, None)
|
|
|
|
|
|
class _LogColoring(Coloring):
|
|
"""Coloring outstream for logging."""
|
|
|
|
def __init__(self, config):
|
|
super().__init__(config, "logs")
|
|
self.error = self.colorer("error", fg="red")
|
|
self.warning = self.colorer("warn", fg="yellow")
|
|
self.levelMap = {
|
|
"WARNING": self.warning,
|
|
"ERROR": self.error,
|
|
}
|
|
|
|
|
|
class _LogColoringFormatter(logging.Formatter):
|
|
"""Coloring formatter for logging."""
|
|
|
|
def __init__(self, config=None, *args, **kwargs):
|
|
self.config = config if config else _ConfigMock()
|
|
self.colorer = _LogColoring(self.config)
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def format(self, record):
|
|
"""Formats |record| with color."""
|
|
msg = super().format(record)
|
|
colorer = self.colorer.levelMap.get(record.levelname)
|
|
return msg if not colorer else colorer(msg)
|
|
|
|
|
|
class RepoLogger(logging.Logger):
|
|
"""Repo Logging Module."""
|
|
|
|
def __init__(self, name: str, config=None, **kwargs):
|
|
super().__init__(name, **kwargs)
|
|
handler = logging.StreamHandler()
|
|
handler.setFormatter(_LogColoringFormatter(config))
|
|
self.addHandler(handler)
|
|
|
|
def log_aggregated_errors(self, err: RepoExitError):
|
|
"""Print all aggregated logs."""
|
|
self.error(SEPARATOR)
|
|
|
|
if not err.aggregate_errors:
|
|
self.error("Repo command failed: %s", type(err).__name__)
|
|
self.error("\t%s", str(err))
|
|
return
|
|
|
|
self.error(
|
|
"Repo command failed due to the following `%s` errors:",
|
|
type(err).__name__,
|
|
)
|
|
self.error(
|
|
"\n".join(str(e) for e in err.aggregate_errors[:MAX_PRINT_ERRORS])
|
|
)
|
|
|
|
diff = len(err.aggregate_errors) - MAX_PRINT_ERRORS
|
|
if diff > 0:
|
|
self.error("+%d additional errors...", diff)
|