]> granicus.if.org Git - python/commitdiff
Issue #1735: TarFile.extractall() now correctly sets directory
authorLars Gustäbel <lars@gustaebel.de>
Fri, 4 Jan 2008 14:44:23 +0000 (14:44 +0000)
committerLars Gustäbel <lars@gustaebel.de>
Fri, 4 Jan 2008 14:44:23 +0000 (14:44 +0000)
permissions and times.

(backport from r59712)

Lib/tarfile.py
Lib/test/test_tarfile.py
Misc/NEWS

index 87b298e08ddd84f79cfcb9b8dbef8f5fd7ec91dc..86991c40d8569989c7bebaf96d8d29d8b594bbf0 100644 (file)
@@ -1525,11 +1525,11 @@ class TarFile(object):
 
         # Set correct owner, mtime and filemode on directories.
         for tarinfo in directories:
-            path = os.path.join(path, tarinfo.name)
+            dirpath = os.path.join(path, tarinfo.name)
             try:
-                self.chown(tarinfo, path)
-                self.utime(tarinfo, path)
-                self.chmod(tarinfo, path)
+                self.chown(tarinfo, dirpath)
+                self.utime(tarinfo, dirpath)
+                self.chmod(tarinfo, dirpath)
             except ExtractError, e:
                 if self.errorlevel > 1:
                     raise
index f3c090d4cbba1998d2c6f6c610f8b8280523bc66..dc2803895d708d2c6b623e8652fc06b99ea18b6f 100644 (file)
@@ -197,6 +197,34 @@ class ReadTest(BaseTest):
                 self.assert_(tarinfo.name.endswith("/"))
                 self.assert_(not tarinfo.name[:-1].endswith("/"))
 
+    def test_extractall(self):
+        # Test if extractall() correctly restores directory permissions
+        # and times (see issue1735).
+        if sys.platform == "win32":
+            # Win32 has no support for utime() on directories or
+            # fine grained permissions.
+            return
+
+        fobj = StringIO.StringIO()
+        tar = tarfile.open(fileobj=fobj, mode="w:")
+        for name in ("foo", "foo/bar"):
+            tarinfo = tarfile.TarInfo(name)
+            tarinfo.type = tarfile.DIRTYPE
+            tarinfo.mtime = 07606136617
+            tarinfo.mode = 0755
+            tar.addfile(tarinfo)
+        tar.close()
+        fobj.seek(0)
+
+        TEMPDIR = os.path.join(dirname(), "extract-test")
+        tar = tarfile.open(fileobj=fobj)
+        tar.extractall(TEMPDIR)
+        for tarinfo in tar.getmembers():
+            path = os.path.join(TEMPDIR, tarinfo.name)
+            self.assertEqual(tarinfo.mode, os.stat(path).st_mode & 0777)
+            self.assertEqual(tarinfo.mtime, os.path.getmtime(path))
+        tar.close()
+
 
 class ReadStreamTest(ReadTest):
     sep = "|"
index 167bedc5d44e2f7a2c7cef96493d581a803be15b..299b3af29f2168edcea979aaa54c87bfff31ebcd 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -53,6 +53,9 @@ Core and builtins
 Library
 -------
 
+- Issue #1735: TarFile.extractall() now correctly sets directory permissions
+  and times.
+
 - Bug #1713: posixpath.ismount() claims symlink to a mountpoint is a mountpoint.
 
 - Issue #1700: Regular expression inline flags incorrectly handle certain