[3.12] gh-109615: Fix support test_copy_python_src_ignore() (#109958) (#110340)

* 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 b89ed9df39)

* 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 cc54bcf17b)

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

(cherry picked from commit 20bc5f7c28)

* 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 0def8c712b)

---------

Co-authored-by: Steve Dower <steve.dower@python.org>
This commit is contained in:
Victor Stinner 2023-10-04 12:27:12 +02:00 committed by GitHub
parent e7a61d34b7
commit 8939221e91
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 49 additions and 12 deletions

View 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 = []

View 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()

View 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)

View 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)

View 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)

View 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')

View file

@ -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):