]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-140082: Forward colorizing from libregrtest to unittest (#140083)
authorCody Maloney <cmaloney@users.noreply.github.com>
Wed, 29 Oct 2025 12:33:44 +0000 (05:33 -0700)
committerGitHub <noreply@github.com>
Wed, 29 Oct 2025 12:33:44 +0000 (13:33 +0100)
libregrtest redirects test output to a file as part of its operation.
When `unittest` checks to see if it should colorize with
`isatty(sys.stdout)` that fails resulting in no colorizing of the
unittest output.

Update `libregrtest` to set `FORCE_COLOR=1` when redirecting test output
so that unittest will do color printing.

Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/test/libregrtest/setup.py
Lib/test/libregrtest/worker.py
Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst [new file with mode: 0644]

index 9bfc414cd615c8b1c03d06eadd04f6c25102863a..b9b76a44e3b4e798189d2efb993a5a8f1187b71e 100644 (file)
@@ -8,6 +8,7 @@ import sys
 import unittest
 from test import support
 from test.support.os_helper import TESTFN_UNDECODABLE, FS_NONASCII
+from _colorize import can_colorize  # type: ignore[import-not-found]
 
 from .filter import set_match_tests
 from .runtests import RunTests
@@ -139,3 +140,10 @@ def setup_tests(runtests: RunTests) -> None:
         gc.set_threshold(runtests.gc_threshold)
 
     random.seed(runtests.random_seed)
+
+    # sys.stdout is redirected to a StringIO in single process mode on which
+    # color auto-detect fails as StringIO is not a TTY. If the original
+    # sys.stdout supports color pass that through with FORCE_COLOR so that when
+    # results are printed, such as with -W, they get color.
+    if can_colorize(file=sys.stdout):
+        os.environ['FORCE_COLOR'] = "1"
index 5d75bf7ae787ed201d20da45d9a2257a45210392..1ad67e1cebf2881a3d85dfc5086d43cc5954a05e 100644 (file)
@@ -1,6 +1,7 @@
 import subprocess
 import sys
 import os
+from _colorize import can_colorize  # type: ignore[import-not-found]
 from typing import Any, NoReturn
 
 from test.support import os_helper, Py_DEBUG
@@ -32,6 +33,12 @@ def create_worker_process(runtests: WorkerRunTests, output_fd: int,
         env['TEMP'] = tmp_dir
         env['TMP'] = tmp_dir
 
+    # The subcommand is run with a temporary output which means it is not a TTY
+    # and won't auto-color. The test results are printed to stdout so if we can
+    # color that have the subprocess use color.
+    if can_colorize(file=sys.stdout):
+        env['FORCE_COLOR'] = '1'
+
     # Running the child from the same working directory as regrtest's original
     # invocation ensures that TEMPDIR for the child is the same when
     # sysconfig.is_python_build() is true. See issue 15300.
diff --git a/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst b/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst
new file mode 100644 (file)
index 0000000..70e7021
--- /dev/null
@@ -0,0 +1,3 @@
+Update ``python -m test`` to set ``FORCE_COLOR=1`` when being run with color
+enabled so that :mod:`unittest` which is run by it with redirected output will
+output in color.