https://github.com/python/cpython/commit/91af0263101251ac1652bc7457e940cb821a2245
commit: 91af0263101251ac1652bc7457e940cb821a2245
branch: 3.10
author: Miss Islington (bot) <[email protected]>
committer: ambv <[email protected]>
date: 2025-09-29T16:27:23+02:00
summary:

[3.10] gh-135374: Adjust test for setuptools' replacement of distutils 
(GH-138796) (GH-139303)

ensurepip installs a bundled copy of distutils, which overrides
the stdlib module. This affects several tests. This commit:

- skips distutils in test___all__, as we're unlikely to break
  `__all__` in a security-fix-only branch (and if we do it's not
  much of a a big deal)
- skips importability tests of distutils submodules if the
  setuptools hack is detected
(cherry picked from commit 987af36a717793e97aad57f7da36a0677edfbdbd)

Co-authored-by: Petr Viktorin <[email protected]>
Co-authored-by: Ɓukasz Langa <[email protected]>
Co-authored-by: Emma Smith <[email protected]>

files:
M Lib/test/test___all__.py
M Lib/test/test_sundry.py

diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py
index 6368ef02253b6d..8f425df133b806 100644
--- a/Lib/test/test___all__.py
+++ b/Lib/test/test___all__.py
@@ -62,6 +62,12 @@ def check_all(self, modname):
                 self.assertEqual(keys, all_set, "in module {}".format(modname))
 
     def walk_modules(self, basedir, modpath):
+        if modpath == 'distutils.':
+            # gh-135374: when setuptools is installed, it now replaces
+            # 'distutils' with its own version.
+            # In a security-fix only branch of CPython,
+            # skip the __all__ test rather than deal with the fallout.
+            return
         for fn in sorted(os.listdir(basedir)):
             path = os.path.join(basedir, fn)
             if os.path.isdir(path):
diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py
index 007d68817c677e..f27450e4a354a9 100644
--- a/Lib/test/test_sundry.py
+++ b/Lib/test/test_sundry.py
@@ -6,6 +6,7 @@
 from test.support import import_helper
 from test.support import warnings_helper
 import unittest
+import sys
 
 class TestUntestedModules(unittest.TestCase):
     def test_untested_modules_can_be_imported(self):
@@ -20,6 +21,32 @@ def test_untested_modules_can_be_imported(self):
                     self.fail('{} has tests even though test_sundry claims '
                               'otherwise'.format(name))
 
+            import html.entities
+
+            try:
+                import tty  # Not available on Windows
+            except ImportError:
+                if support.verbose:
+                    print("skipping tty")
+
+    def test_distutils_modules(self):
+        with warnings_helper.check_warnings(quiet=True):
+
+            path_copy = sys.path[:]
+            import distutils
+            if '_distutils_hack' in sys.modules:
+                # gh-135374: when 'setuptools' is installed, it now replaces
+                # 'distutils' with its own version.
+                # This imports '_distutils_hack' and modifies sys.path.
+                # The setuptols version of distutils also does not include some
+                # of the modules tested here.
+
+                # Undo the path modifications and skip the test.
+
+                sys.path[:] = path_copy
+                raise unittest.SkipTest(
+                    'setuptools has replaced distutils with its own version')
+
             import distutils.bcppcompiler
             import distutils.ccompiler
             import distutils.cygwinccompiler
@@ -45,13 +72,6 @@ def test_untested_modules_can_be_imported(self):
             import distutils.command.sdist
             import distutils.command.upload
 
-            import html.entities
-
-            try:
-                import tty  # Not available on Windows
-            except ImportError:
-                if support.verbose:
-                    print("skipping tty")
 
 
 if __name__ == "__main__":

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to