[Python-checkins] cpython (3.3): #17076: Make copying of xattrs more permissive of missing FS support

hynek.schlawack python-checkins at python.org
Tue Feb 5 08:26:21 CET 2013


http://hg.python.org/cpython/rev/47c65639390d
changeset:   82013:47c65639390d
branch:      3.3
parent:      82010:e64b74227198
user:        Hynek Schlawack <hs at ox.cx>
date:        Tue Feb 05 08:22:44 2013 +0100
summary:
  #17076: Make copying of xattrs more permissive of missing FS support

Patch by Thomas Wouters.

files:
  Lib/shutil.py           |   8 +++++++-
  Lib/test/test_shutil.py |  11 +++++++++++
  Misc/NEWS               |   3 +++
  3 files changed, 21 insertions(+), 1 deletions(-)


diff --git a/Lib/shutil.py b/Lib/shutil.py
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -142,7 +142,13 @@
 
         """
 
-        for name in os.listxattr(src, follow_symlinks=follow_symlinks):
+        try:
+            names = os.listxattr(src, follow_symlinks=follow_symlinks)
+        except OSError as e:
+            if e.errno not in (errno.ENOTSUP, errno.ENODATA):
+                raise
+            return
+        for name in names:
             try:
                 value = os.getxattr(src, name, follow_symlinks=follow_symlinks)
                 os.setxattr(dst, name, value, follow_symlinks=follow_symlinks)
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -449,6 +449,17 @@
             self.assertIn('user.bar', os.listxattr(dst))
         finally:
             os.setxattr = orig_setxattr
+        # the source filesystem not supporting xattrs should be ok, too.
+        def _raise_on_src(fname, *, follow_symlinks=True):
+            if fname == src:
+                raise OSError(errno.ENOTSUP, 'Operation not supported')
+            return orig_listxattr(fname, follow_symlinks=follow_symlinks)
+        try:
+            orig_listxattr = os.listxattr
+            os.listxattr = _raise_on_src
+            shutil._copyxattr(src, dst)
+        finally:
+            os.listxattr = orig_listxattr
 
         # test that shutil.copystat copies xattrs
         src = os.path.join(tmp_dir, 'the_original')
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -163,6 +163,9 @@
 Library
 -------
 
+- Issue #17076: Make copying of xattrs more permissive of missing FS support.
+  Patch by Thomas Wouters.
+
 - Issue #17089: Expat parser now correctly works with string input not only when
   an internal XML encoding is UTF-8 or US-ASCII.  It now accepts bytes and
   strings larger than 2 GiB.

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list