Skip to content

Commit 7f69e69

Browse files
authored
Unify handling of console color output. NFC (#25505)
Followup to #25502.
1 parent 0c64387 commit 7f69e69

File tree

4 files changed

+72
-71
lines changed

4 files changed

+72
-71
lines changed

test/parallel_testsuite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import common
1717
from common import errlog
1818

19-
from tools.diagnostics import with_color, CYAN, GREEN, RED
19+
from tools.colored_logger import with_color, CYAN, GREEN, RED
2020
from tools.utils import WINDOWS
2121

2222

tools/cmdline.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,9 @@ def consume_arg_file():
510510
elif check_flag('--threadprofiler'):
511511
settings_changes.append('PTHREADS_PROFILING=1')
512512
elif arg in ('-fcolor-diagnostics', '-fdiagnostics-color', '-fdiagnostics-color=always'):
513-
diagnostics.color_enabled = True
514-
elif arg in ('-fno-color-diagnostics', '-fdiagnostics-color=never'):
515-
diagnostics.color_enabled = False
513+
colored_logger.enable(force=True)
514+
elif arg in ('-fno-color-diagnostics', '-fno-diagnostics-color', '-fdiagnostics-color=never'):
515+
colored_logger.disable()
516516
elif arg == '-fno-exceptions':
517517
settings.DISABLE_EXCEPTION_CATCHING = 1
518518
settings.DISABLE_EXCEPTION_THROWING = 1
@@ -568,9 +568,6 @@ def consume_arg_file():
568568
settings.USE_PTHREADS = 0
569569
elif arg == '-pthreads':
570570
exit_with_error('unrecognized command-line option `-pthreads`; did you mean `-pthread`?')
571-
elif arg in ('-fno-diagnostics-color', '-fdiagnostics-color=never'):
572-
colored_logger.disable()
573-
diagnostics.color_enabled = False
574571
elif arg == '-fno-rtti':
575572
settings.USE_RTTI = 0
576573
elif arg == '-frtti':

tools/colored_logger.py

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,56 @@
44
# found in the LICENSE file.
55

66
"""Enables colored logger just by importing this module
7+
8+
Also, provides utiliy functions to use ANSI colors in the terminal.
79
"""
810

911
import ctypes
1012
import sys
1113
import logging
14+
from functools import wraps
15+
16+
17+
# ANSI colors
18+
RED = 1
19+
GREEN = 2
20+
YELLOW = 3
21+
BLUE = 4
22+
MAGENTA = 5
23+
CYAN = 6
24+
WHITE = 7
25+
26+
color_enabled = False
27+
28+
29+
def output_color(color):
30+
if color_enabled:
31+
return '\033[3%sm' % color
32+
return ''
33+
34+
35+
def bold():
36+
if color_enabled:
37+
return '\033[1m'
38+
return ''
39+
40+
41+
def reset_color():
42+
if color_enabled:
43+
return '\033[0m'
44+
return ''
45+
46+
47+
def with_bold_color(color, string):
48+
return output_color(color) + bold() + string + reset_color()
49+
50+
51+
def with_color(color, string):
52+
return output_color(color) + string + reset_color()
53+
54+
55+
def with_bold(string):
56+
return bold() + string + reset_color()
1257

1358

1459
def ansi_color_available():
@@ -34,30 +79,35 @@ def ansi_color_available():
3479

3580
def add_coloring_to_emit_ansi(fn):
3681
# add methods we need to the class
82+
@wraps(fn)
3783
def new(*args):
3884
levelno = args[1].levelno
85+
color = None
3986
if levelno >= 40:
40-
color = '\x1b[31m' # red
87+
color = RED
4188
elif levelno >= 30:
42-
color = '\x1b[33m' # yellow
89+
color = YELLOW
4390
elif levelno >= 20:
44-
color = '\x1b[32m' # green
91+
color = GREEN
4592
elif levelno >= 10:
46-
color = '\x1b[35m' # pink
47-
else:
48-
color = '\x1b[0m' # normal
49-
args[1].msg = color + args[1].msg + '\x1b[0m' # normal
93+
color = MAGENTA
94+
if color:
95+
args[1].msg = with_color(color, args[1].msg)
5096
return fn(*args)
5197

5298
new.orig_func = fn
5399
return new
54100

55101

56-
def enable():
57-
if ansi_color_available():
102+
def enable(force=False):
103+
global color_enabled
104+
if force or ansi_color_available():
58105
logging.StreamHandler.emit = add_coloring_to_emit_ansi(logging.StreamHandler.emit)
106+
color_enabled = True
59107

60108

61109
def disable():
110+
global color_enabled
62111
if hasattr(logging.StreamHandler.emit, 'orig_func'):
63112
logging.StreamHandler.emit = logging.StreamHandler.emit.orig_func
113+
color_enabled = False

tools/diagnostics.py

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,17 @@
1313

1414
from . import colored_logger
1515

16-
color_enabled = colored_logger.ansi_color_available()
1716
logger = logging.getLogger('diagnostics')
1817
tool_name = os.path.splitext(os.path.basename(sys.argv[0]))[0]
1918

2019
# diagnostic levels
2120
WARN = 1
2221
ERROR = 2
2322

24-
# available (ANSI) colors
25-
RED = 1
26-
GREEN = 2
27-
YELLOW = 3
28-
BLUE = 4
29-
MAGENTA = 5
30-
CYAN = 6
31-
WHITE = 7
32-
3323
# color for use for each diagnostic level
3424
level_colors = {
35-
WARN: MAGENTA,
36-
ERROR: RED,
25+
WARN: colored_logger.MAGENTA,
26+
ERROR: colored_logger.RED,
3727
}
3828

3929
level_prefixes = {
@@ -42,55 +32,19 @@
4232
}
4333

4434

45-
def output_color(color):
46-
if color_enabled:
47-
return '\033[3%sm' % color
48-
return ''
49-
50-
51-
def bold():
52-
if color_enabled:
53-
return '\033[1m'
54-
return ''
55-
56-
57-
def reset_color():
58-
if color_enabled:
59-
return '\033[0m'
60-
return ''
61-
62-
63-
def with_color(color, text):
64-
return output_color(color) + text + reset_color()
65-
66-
6735
def diag(level, msg, *args):
6836
# Format output message as:
6937
# <tool>: <level>: msg
70-
# With the `<level>:` part being colored accordingly.
71-
sys.stderr.write(tool_name + ': ')
72-
73-
if color_enabled:
74-
output = output_color(level_colors[level]) + bold()
75-
if output:
76-
sys.stderr.write(output)
77-
78-
sys.stderr.write(level_prefixes[level])
79-
80-
if color_enabled:
81-
output = reset_color() + bold()
82-
if output:
83-
sys.stderr.write(output)
84-
38+
# With the `<level>:` part being colored accordingly, and the message itself in bold.
39+
prefix = level_prefixes[level]
40+
color = level_colors[level]
8541
if args:
8642
msg = msg % args
87-
sys.stderr.write(str(msg))
88-
sys.stderr.write('\n')
8943

90-
if color_enabled:
91-
output = reset_color()
92-
if output:
93-
sys.stderr.write(output)
44+
# Add colors
45+
prefix = colored_logger.with_bold_color(color, prefix)
46+
msg = colored_logger.with_bold(msg)
47+
sys.stderr.write(f'{tool_name}: {prefix}{msg}\n')
9448

9549

9650
def error(msg, *args):

0 commit comments

Comments
 (0)