summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Gustäbel <lars@gustaebel.de>2008-01-04 14:00:33 (GMT)
committerLars Gustäbel <lars@gustaebel.de>2008-01-04 14:00:33 (GMT)
commit2ee1c760cc5845c06c0de98c3327299b3d72eb20 (patch)
treebe2f824b1c2959791983b493b960b43a78ac54bf
parent0687561c940064e41ef1f89dc63aa6218161d2b9 (diff)
downloadcpython-2ee1c760cc5845c06c0de98c3327299b3d72eb20.zip
cpython-2ee1c760cc5845c06c0de98c3327299b3d72eb20.tar.gz
cpython-2ee1c760cc5845c06c0de98c3327299b3d72eb20.tar.bz2
Issue #1735: TarFile.extractall() now correctly sets
directory permissions and times. (will backport to 2.5)
-rw-r--r--Lib/tarfile.py8
-rw-r--r--Lib/test/test_tarfile.py17
-rw-r--r--Misc/NEWS3
3 files changed, 24 insertions, 4 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index ae24291..7143f0b 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -2037,11 +2037,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
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index a280bdd..d446d5f 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -244,6 +244,23 @@ class MiscReadTest(ReadTest):
data = open(os.path.join(TEMPDIR, "ustar/symtype"), "rb").read()
self.assertEqual(md5sum(data), md5_regtype)
+ 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
+
+ tar = tarfile.open(tarname, encoding="iso8859-1")
+ directories = [t for t in tar if t.isdir()]
+ tar.extractall(TEMPDIR, directories)
+ for tarinfo in directories:
+ path = os.path.join(TEMPDIR, tarinfo.name)
+ self.assertEqual(tarinfo.mode & 0777, os.stat(path).st_mode & 0777)
+ self.assertEqual(tarinfo.mtime, os.path.getmtime(path))
+ tar.close()
+
class StreamReadTest(ReadTest):
diff --git a/Misc/NEWS b/Misc/NEWS
index 8100c77..7095b5b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -342,6 +342,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.
- Bug #1687: Fxed plistlib.py restricts <integer> to Python int when writing