File lchmod-non-support.patch of Package python3.41795
---
Lib/test/test_shutil.py | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
Index: Python-3.4.10/Lib/test/test_shutil.py
===================================================================
--- Python-3.4.10.orig/Lib/test/test_shutil.py 2025-11-23 22:19:16.000345739 +0100
+++ Python-3.4.10/Lib/test/test_shutil.py 2025-11-23 22:19:40.834313246 +0100
@@ -24,6 +24,32 @@
from test import support
from test.support import TESTFN, check_warnings, captured_stdout, requires_zlib
+# Check if lchmod is available and works.
+# (see http://bugs.python.org/issue30643)
+LCHMOD_SUPPORTED = False
+if hasattr(os, 'lchmod') and hasattr(os, 'symlink'):
+ LCHMOD_SUPPORTED = True
+ tempdir = tempfile.mkdtemp()
+ try:
+ src = os.path.join(tempdir, 'src')
+ with open(src, 'w') as f:
+ f.write('test')
+ dst = os.path.join(tempdir, 'dst')
+ os.symlink(src, dst)
+ os.lchmod(dst, stat.S_IREAD)
+ except OSError as e:
+ if e.errno in (errno.EOPNOTSUPP, getattr(errno, 'ENOTSUP', -1), 95):
+ LCHMOD_SUPPORTED = False
+ except:
+ # any other error means we have lchmod but something else is wrong
+ # (e.g. permissions).
+ pass
+ finally:
+ shutil.rmtree(tempdir)
+
+requires_lchmod = unittest.skipUnless(LCHMOD_SUPPORTED,
+ 'os.lchmod is not supported')
+
try:
import bz2
BZ2_SUPPORTED = True
@@ -315,7 +341,7 @@
shutil.copymode(src_link, dst_link)
self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
- @unittest.skipUnless(hasattr(os, 'lchmod'), 'requires os.lchmod')
+ @requires_lchmod
@support.skip_unless_symlink
def test_copymode_symlink_to_symlink(self):
tmp_dir = self.mkdtemp()
@@ -359,6 +385,7 @@
os.symlink(dst, dst_link)
shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fail
+ @requires_lchmod
@support.skip_unless_symlink
def test_copystat_symlinks(self):
tmp_dir = self.mkdtemp()
@@ -510,6 +537,7 @@
shutil._copyxattr(src_link, dst, follow_symlinks=False)
self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43')
+ @requires_lchmod
@support.skip_unless_symlink
def test_copy_symlinks(self):
tmp_dir = self.mkdtemp()
@@ -533,6 +561,7 @@
self.assertEqual(os.lstat(src_link).st_mode,
os.lstat(dst).st_mode)
+ @requires_lchmod
@support.skip_unless_symlink
def test_copy2_symlinks(self):
tmp_dir = self.mkdtemp()
@@ -648,6 +677,7 @@
actual = read_file((dst_dir, 'test_dir', 'test.txt'))
self.assertEqual(actual, '456')
+ @requires_lchmod
@support.skip_unless_symlink
def test_copytree_symlinks(self):
tmp_dir = self.mkdtemp()
@@ -882,6 +912,7 @@
shutil.copytree(src_dir, dst_dir, copy_function=_copy)
self.assertEqual(len(copied), 2)
+ @requires_lchmod
@support.skip_unless_symlink
def test_copytree_dangling_symlinks(self):
@@ -903,6 +934,7 @@
shutil.copytree(src_dir, dst_dir, symlinks=True)
self.assertIn('test.txt', os.listdir(dst_dir))
+ @requires_lchmod
@support.skip_unless_symlink
def test_copytree_symlink_dir(self):
src_dir = self.mkdtemp()