Make colourize_console() a function

Currently, colourize_console is a constant, set at process
initialization.

To allow the actual stdout to be easily compared with the expected when
running tests, we want to allow colourization to be on for the test
driver, but not for the in-process configure done by run_configure,
which has stdout redirected from a tty to a pipe.

v2:
Cache _colorize_console per file object

v3:
Reset cache on setup_console()
pull/6620/head
Jon Turney 4 years ago
parent cd566d2bd5
commit f107f9b396
No known key found for this signature in database
GPG Key ID: C7C86F0370285C81
  1. 29
      mesonbuild/mlog.py
  2. 8
      run_project_tests.py
  3. 6
      run_tests.py

@ -40,15 +40,32 @@ def _windows_ansi() -> bool:
# original behavior
return bool(kernel.SetConsoleMode(stdout, mode.value | 0x4) or os.environ.get('ANSICON'))
def setup_console() -> bool:
def colorize_console() -> bool:
_colorize_console = getattr(sys.stdout, 'colorize_console', None) # type: bool
if _colorize_console is not None:
return _colorize_console
try:
if platform.system().lower() == 'windows':
return os.isatty(sys.stdout.fileno()) and _windows_ansi()
return os.isatty(sys.stdout.fileno()) and os.environ.get('TERM') != 'dumb'
_colorize_console = os.isatty(sys.stdout.fileno()) and _windows_ansi()
else:
_colorize_console = os.isatty(sys.stdout.fileno()) and os.environ.get('TERM', 'dumb') != 'dumb'
except Exception:
return False
_colorize_console = False
sys.stdout.colorize_console = _colorize_console # type: ignore[attr-defined]
return _colorize_console
def setup_console():
# on Windows, a subprocess might call SetConsoleMode() on the console
# connected to stdout and turn off ANSI escape processing. Call this after
# running a subprocess to ensure we turn it on again.
if platform.system().lower() == 'windows':
try:
delattr(sys.stdout, 'colorize_console')
except AttributeError:
pass
colorize_console = setup_console()
log_dir = None # type: T.Optional[str]
log_file = None # type: T.Optional[T.TextIO]
log_fname = 'meson-log.txt' # type: str
@ -204,7 +221,7 @@ def log(*args: T.Union[str, AnsiDecorator], is_error: bool = False,
if log_file is not None:
print(*arr, file=log_file, **kwargs)
log_file.flush()
if colorize_console:
if colorize_console():
arr = process_markup(args, True)
if not log_errors_only or is_error:
force_print(*arr, **kwargs)

@ -341,19 +341,19 @@ def log_text_file(logfile, testdir, stdo, stde):
def bold(text):
return mlog.bold(text).get_text(mlog.colorize_console)
return mlog.bold(text).get_text(mlog.colorize_console())
def green(text):
return mlog.green(text).get_text(mlog.colorize_console)
return mlog.green(text).get_text(mlog.colorize_console())
def red(text):
return mlog.red(text).get_text(mlog.colorize_console)
return mlog.red(text).get_text(mlog.colorize_console())
def yellow(text):
return mlog.yellow(text).get_text(mlog.colorize_console)
return mlog.yellow(text).get_text(mlog.colorize_console())
def _run_ci_include(args: T.List[str]) -> str:

@ -303,7 +303,7 @@ def run_configure(commandlist, env=None):
return run_configure_inprocess(commandlist, env=env)
def print_system_info():
print(mlog.bold('System information.').get_text(mlog.colorize_console))
print(mlog.bold('System information.').get_text(mlog.colorize_console()))
print('Architecture:', platform.architecture())
print('Machine:', platform.machine())
print('Platform:', platform.system())
@ -377,7 +377,7 @@ def main():
print(flush=True)
returncode = 0
else:
print(mlog.bold('Running unittests.').get_text(mlog.colorize_console))
print(mlog.bold('Running unittests.').get_text(mlog.colorize_console()))
print(flush=True)
cmd = mesonlib.python_command + ['run_unittests.py', '-v']
if options.failfast:
@ -390,7 +390,7 @@ def main():
else:
cross_test_args = mesonlib.python_command + ['run_cross_test.py']
for cf in options.cross:
print(mlog.bold('Running {} cross tests.'.format(cf)).get_text(mlog.colorize_console))
print(mlog.bold('Running {} cross tests.'.format(cf)).get_text(mlog.colorize_console()))
print(flush=True)
cmd = cross_test_args + ['cross/' + cf]
if options.failfast:

Loading…
Cancel
Save