Skip to content

Commit 6811349

Browse files
committed
Unify handling of console color output. NFC
Followup to emscripten-core#25502.
1 parent b4ffae4 commit 6811349

File tree

3 files changed

+74
-63
lines changed

3 files changed

+74
-63
lines changed

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()
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: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,59 @@
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+
assert color_enabled
31+
return '\033[3%sm' % color
32+
33+
34+
def bold():
35+
assert color_enabled
36+
return '\033[1m'
37+
38+
39+
def reset_color():
40+
assert color_enabled
41+
return '\033[0m'
42+
43+
44+
def with_bold_color(color, string):
45+
if not color_enabled:
46+
return string
47+
return output_color(color) + bold() + string + reset_color()
48+
49+
50+
def with_color(color, string):
51+
if not color_enabled:
52+
return string
53+
return output_color(color) + string + reset_color()
54+
55+
56+
def with_bold(string):
57+
if not color_enabled:
58+
return string
59+
return bold() + string + reset_color()
1260

1361

1462
def ansi_color_available():
@@ -34,30 +82,35 @@ def ansi_color_available():
3482

3583
def add_coloring_to_emit_ansi(fn):
3684
# add methods we need to the class
85+
@wraps(fn)
3786
def new(*args):
3887
levelno = args[1].levelno
88+
color = None
3989
if levelno >= 40:
40-
color = '\x1b[31m' # red
90+
color = RED
4191
elif levelno >= 30:
42-
color = '\x1b[33m' # yellow
92+
color = YELLOW
4393
elif levelno >= 20:
44-
color = '\x1b[32m' # green
94+
color = GREEN
4595
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
96+
color = MAGENTA
97+
if color:
98+
args[1].msg = with_color(color, args[1].msg)
5099
return fn(*args)
51100

52101
new.orig_func = fn
53102
return new
54103

55104

56-
def enable():
57-
if ansi_color_available():
105+
def enable(force=False):
106+
global color_enabled
107+
if force or ansi_color_available():
58108
logging.StreamHandler.emit = add_coloring_to_emit_ansi(logging.StreamHandler.emit)
109+
color_enabled = True
59110

60111

61112
def disable():
113+
global color_enabled
62114
if hasattr(logging.StreamHandler.emit, 'orig_func'):
63115
logging.StreamHandler.emit = logging.StreamHandler.emit.orig_func
116+
color_enabled = False

tools/diagnostics.py

Lines changed: 9 additions & 48 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,48 +32,19 @@
4232
}
4333

4434

45-
def output_color(color):
46-
assert color_enabled
47-
return '\033[3%sm' % color
48-
49-
50-
def bold():
51-
assert color_enabled
52-
return '\033[1m'
53-
54-
55-
def reset_color():
56-
assert color_enabled
57-
return '\033[0m'
58-
59-
6035
def diag(level, msg, *args):
6136
# Format output message as:
6237
# <tool>: <level>: msg
63-
# With the `<level>:` part being colored accordingly.
64-
sys.stderr.write(tool_name + ': ')
65-
66-
if color_enabled:
67-
output = output_color(level_colors[level]) + bold()
68-
if output:
69-
sys.stderr.write(output)
70-
71-
sys.stderr.write(level_prefixes[level])
72-
73-
if color_enabled:
74-
output = reset_color() + bold()
75-
if output:
76-
sys.stderr.write(output)
77-
38+
# With the `<level>:` part being colored accordingly, and the message itself in bold.
39+
prefix = level_prefixes[level]
40+
color = level_colors[level]
7841
if args:
7942
msg = msg % args
80-
sys.stderr.write(str(msg))
81-
sys.stderr.write('\n')
8243

83-
if color_enabled:
84-
output = reset_color()
85-
if output:
86-
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')
8748

8849

8950
def error(msg, *args):

0 commit comments

Comments
 (0)