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()
openSUSE Build Service is sponsored by