]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-109615: Fix support test_copy_python_src_ignore() (#109958) (#110340)
authorVictor Stinner <vstinner@python.org>
Wed, 4 Oct 2023 10:27:12 +0000 (12:27 +0200)
committerGitHub <noreply@github.com>
Wed, 4 Oct 2023 10:27:12 +0000 (10:27 +0000)
* gh-109615: Fix support test_copy_python_src_ignore() (#109958)

Fix the test when run on an installed Python: use "abs_srcdir" of
sysconfig, and skip the test if the Python source code cannot be
found.

* Tools/patchcheck/patchcheck.py, Tools/freeze/test/freeze.py and
  Lib/test/libregrtest/utils.py now first try to get "abs_srcdir"
  from sysconfig, before getting "srcdir" from sysconfig.
* test.pythoninfo logs sysconfig "abs_srcdir".

(cherry picked from commit b89ed9df39851348fbb1552294644f99f6b17d2c)

* gh-109615: Fix support test_copy_python_src_ignore() on WASM (#109970)

Not only check if src_dir exists, but look also for Lib/os.py
landmark.

(cherry picked from commit cc54bcf17b5b5f7681f52baf3acef75b995fa1fd)

* gh-109615: Look for 'Modules' as landmark for test_copy_python_src_ignore (GH-110108)

(cherry picked from commit 20bc5f7c28a6f8a2e156c4a748ffabb5efc7c761)

* gh-109748: Fix again venv test_zippath_from_non_installed_posix() (#110149)

Call also copy_python_src_ignore() on listdir() names.

shutil.copytree(): replace set() with an empty tuple. An empty tuple
becomes a constant in the compiler and checking if an item is in an
empty tuple is cheap.

(cherry picked from commit 0def8c712bb6f66f1081cab71deb3681566b846d)

---------

Co-authored-by: Steve Dower <steve.dower@python.org>
Lib/shutil.py
Lib/test/libregrtest/main.py
Lib/test/pythoninfo.py
Lib/test/test_support.py
Lib/test/test_venv.py
Tools/freeze/test/freeze.py
Tools/patchcheck/patchcheck.py

index 5bcfa563fea9afe67c4b8b5b1d12e5c1f32411c1..a278b74fab2ddb3b81db1491a2f656280e5fc25b 100644 (file)
@@ -481,7 +481,7 @@ def _copytree(entries, src, dst, symlinks, ignore, copy_function,
     if ignore is not None:
         ignored_names = ignore(os.fspath(src), [x.name for x in entries])
     else:
-        ignored_names = set()
+        ignored_names = ()
 
     os.makedirs(dst, exist_ok=dirs_exist_ok)
     errors = []
index 7cfea548ee2180960f732da28671536e6415ac2e..56d562d0b068dda5cc030f9e18ae29e27e8d8a96 100644 (file)
@@ -747,11 +747,13 @@ class Regrtest:
             if sysconfig.is_python_build():
                 self.tmp_dir = sysconfig.get_config_var('abs_builddir')
                 if self.tmp_dir is None:
-                    # gh-74470: On Windows, only srcdir is available. Using
-                    # abs_builddir mostly matters on UNIX when building Python
-                    # out of the source tree, especially when the source tree
-                    # is read only.
-                    self.tmp_dir = sysconfig.get_config_var('srcdir')
+                    self.tmp_dir = sysconfig.get_config_var('abs_srcdir')
+                    if not self.tmp_dir:
+                        # gh-74470: On Windows, only srcdir is available. Using
+                        # abs_builddir mostly matters on UNIX when building
+                        # Python out of the source tree, especially when the
+                        # source tree is read only.
+                        self.tmp_dir = sysconfig.get_config_var('srcdir')
                 self.tmp_dir = os.path.join(self.tmp_dir, 'build')
             else:
                 self.tmp_dir = tempfile.gettempdir()
index 860c4cc4e0a818771e40179b751589d51e153041..1ec04de3c0c94f4c70013fab044ca48e35cec3b1 100644 (file)
@@ -516,6 +516,8 @@ def collect_sysconfig(info_add):
         'Py_ENABLE_SHARED',
         'SHELL',
         'SOABI',
+        'abs_builddir',
+        'abs_srcdir',
         'prefix',
     ):
         value = sysconfig.get_config_var(name)
index d3b2922d9b0ad12efb61224389482bbda1b3937b..b9b05fc4306a31c28d23c0c08b355d3d288ff291 100644 (file)
@@ -767,12 +767,27 @@ class TestSupport(unittest.TestCase):
         #self.assertEqual(available, 2)
 
     def test_copy_python_src_ignore(self):
-        src_dir = sysconfig.get_config_var('srcdir')
+        # Get source directory
+        src_dir = sysconfig.get_config_var('abs_srcdir')
+        if not src_dir:
+            src_dir = sysconfig.get_config_var('srcdir')
         src_dir = os.path.abspath(src_dir)
 
-        ignored = {'.git', '__pycache__'}
+        # Check that the source code is available
+        if not os.path.exists(src_dir):
+            self.skipTest(f"cannot access Python source code directory:"
+                          f" {src_dir!r}")
+        # Check that the landmark copy_python_src_ignore() expects is available
+        # (Previously we looked for 'Lib\os.py', which is always present on Windows.)
+        landmark = os.path.join(src_dir, 'Modules')
+        if not os.path.exists(landmark):
+            self.skipTest(f"cannot access Python source code directory:"
+                          f" {landmark!r} landmark is missing")
+
+        # Test support.copy_python_src_ignore()
 
         # Source code directory
+        ignored = {'.git', '__pycache__'}
         names = os.listdir(src_dir)
         self.assertEqual(support.copy_python_src_ignore(src_dir, names),
                          ignored | {'build'})
@@ -782,7 +797,7 @@ class TestSupport(unittest.TestCase):
         self.assertEqual(support.copy_python_src_ignore(path, os.listdir(path)),
                          ignored | {'build', 'venv'})
 
-        # An other directory
+        # Another directory
         path = os.path.join(src_dir, 'Objects')
         self.assertEqual(support.copy_python_src_ignore(path, os.listdir(path)),
                          ignored)
index 6942bf246b61d12de7197dbabaab4cc352b917d0..fea16568afebae11bc34b44c9bb3055f736cfbff 100644 (file)
@@ -571,7 +571,11 @@ class BasicTest(BaseTest):
                         eachpath,
                         os.path.join(non_installed_dir, platlibdir))
             elif os.path.isfile(os.path.join(eachpath, "os.py")):
-                for name in os.listdir(eachpath):
+                names = os.listdir(eachpath)
+                ignored_names = copy_python_src_ignore(eachpath, names)
+                for name in names:
+                    if name in ignored_names:
+                        continue
                     if name == "site-packages":
                         continue
                     fn = os.path.join(eachpath, name)
index bb15941464e3d1eccbcfd2d7da509bcda8fe0d1d..cdf77c57bbb6aeba289a27f6f43a706f462a50b0 100644 (file)
@@ -7,9 +7,16 @@ import sysconfig
 from test import support
 
 
+def get_python_source_dir():
+    src_dir = sysconfig.get_config_var('abs_srcdir')
+    if not src_dir:
+        src_dir = sysconfig.get_config_var('srcdir')
+    return os.path.abspath(src_dir)
+
+
 TESTS_DIR = os.path.dirname(__file__)
 TOOL_ROOT = os.path.dirname(TESTS_DIR)
-SRCDIR = os.path.abspath(sysconfig.get_config_var('srcdir'))
+SRCDIR = get_python_source_dir()
 
 MAKE = shutil.which('make')
 FREEZE = os.path.join(TOOL_ROOT, 'freeze.py')
index fa3a43af6e604826b6ea3c3b1afe9f4505865882..e3959ce428c7c50a93e23ab88686d49b3c1e5e49 100755 (executable)
@@ -11,6 +11,13 @@ import reindent
 import untabify
 
 
+def get_python_source_dir():
+    src_dir = sysconfig.get_config_var('abs_srcdir')
+    if not src_dir:
+        src_dir = sysconfig.get_config_var('srcdir')
+    return os.path.abspath(src_dir)
+
+
 # Excluded directories which are copies of external libraries:
 # don't check their coding style
 EXCLUDE_DIRS = [
@@ -18,7 +25,7 @@ EXCLUDE_DIRS = [
     os.path.join('Modules', 'expat'),
     os.path.join('Modules', 'zlib'),
     ]
-SRCDIR = sysconfig.get_config_var('srcdir')
+SRCDIR = get_python_source_dir()
 
 
 def n_files_str(count):