mirror of
https://github.com/python/cpython.git
synced 2025-07-29 06:05:00 +00:00
Issue #1735: TarFile.extractall() now correctly sets
directory permissions and times. (will backport to 2.5)
This commit is contained in:
parent
0687561c94
commit
2ee1c760cc
3 changed files with 24 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue