Skip to content

Commit 9bf8236

Browse files
ShikChenLUCI
authored and
LUCI
committed
logging: Fix log formatting with colored output
The log message is already formatted before being passed to the colorer. To avoid the exception "TypeError: not enough arguments for format string", we should use the `nofmt_colorer` instead. This bug occurs only when the formatted string still contains '%' character. The following snippet can reproduce the bug: ``` from repo_logging import RepoLogger RepoLogger(__name__).error("%s", "100% failed") ``` Change-Id: I4e3977b3d21aec4e0deb95fc1c6dd1e59272d695 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/432017 Tested-by: Shik Chen <[email protected]> Commit-Queue: Shik Chen <[email protected]> Reviewed-by: Mike Frysinger <[email protected]>
1 parent 87f52f3 commit 9bf8236

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

repo_logging.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ class _LogColoring(Coloring):
3939

4040
def __init__(self, config):
4141
super().__init__(config, "logs")
42-
self.error = self.colorer("error", fg="red")
43-
self.warning = self.colorer("warn", fg="yellow")
42+
self.error = self.nofmt_colorer("error", fg="red")
43+
self.warning = self.nofmt_colorer("warn", fg="yellow")
4444
self.levelMap = {
4545
"WARNING": self.warning,
4646
"ERROR": self.error,

tests/test_repo_logging.py

+37
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@
1313
# limitations under the License.
1414

1515
"""Unit test for repo_logging module."""
16+
17+
import contextlib
18+
import io
19+
import logging
1620
import unittest
1721
from unittest import mock
1822

23+
from color import SetDefaultColoring
1924
from error import RepoExitError
2025
from repo_logging import RepoLogger
2126

@@ -62,3 +67,35 @@ def test_log_aggregated_errors_logs_single_error(self, mock_error):
6267
mock.call("Repo command failed: %s", "RepoExitError"),
6368
]
6469
)
70+
71+
def test_log_with_format_string(self):
72+
"""Test different log levels with format strings."""
73+
74+
# Set color output to "always" for consistent test results.
75+
# This ensures the logger's behavior is uniform across different
76+
# environments and git configurations.
77+
SetDefaultColoring("always")
78+
79+
# Regex pattern to match optional ANSI color codes.
80+
# \033 - Escape character
81+
# \[ - Opening square bracket
82+
# [0-9;]* - Zero or more digits or semicolons
83+
# m - Ending 'm' character
84+
# ? - Makes the entire group optional
85+
opt_color = r"(\033\[[0-9;]*m)?"
86+
87+
for level in (logging.INFO, logging.WARN, logging.ERROR):
88+
name = logging.getLevelName(level)
89+
90+
with self.subTest(level=level, name=name):
91+
output = io.StringIO()
92+
93+
with contextlib.redirect_stderr(output):
94+
logger = RepoLogger(__name__)
95+
logger.log(level, "%s", "100% pass")
96+
97+
self.assertRegex(
98+
output.getvalue().strip(),
99+
f"^{opt_color}100% pass{opt_color}$",
100+
f"failed for level {name}",
101+
)

0 commit comments

Comments
 (0)