mirror of https://github.com/python/cpython
Issue #1735: TarFile.extractall() now correctly sets directory
permissions and times. (backport from r59712)
This commit is contained in:
parent
12f03ccece
commit
e5f9e588c6
|
@ -1525,11 +1525,11 @@ class TarFile(object):
|
||||||
|
|
||||||
# Set correct owner, mtime and filemode on directories.
|
# Set correct owner, mtime and filemode on directories.
|
||||||
for tarinfo in directories:
|
for tarinfo in directories:
|
||||||
path = os.path.join(path, tarinfo.name)
|
dirpath = os.path.join(path, tarinfo.name)
|
||||||
try:
|
try:
|
||||||
self.chown(tarinfo, path)
|
self.chown(tarinfo, dirpath)
|
||||||
self.utime(tarinfo, path)
|
self.utime(tarinfo, dirpath)
|
||||||
self.chmod(tarinfo, path)
|
self.chmod(tarinfo, dirpath)
|
||||||
except ExtractError, e:
|
except ExtractError, e:
|
||||||
if self.errorlevel > 1:
|
if self.errorlevel > 1:
|
||||||
raise
|
raise
|
||||||
|
|
|
@ -197,6 +197,34 @@ class ReadTest(BaseTest):
|
||||||
self.assert_(tarinfo.name.endswith("/"))
|
self.assert_(tarinfo.name.endswith("/"))
|
||||||
self.assert_(not tarinfo.name[:-1].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):
|
class ReadStreamTest(ReadTest):
|
||||||
sep = "|"
|
sep = "|"
|
||||||
|
|
|
@ -53,6 +53,9 @@ Core and builtins
|
||||||
Library
|
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 #1713: posixpath.ismount() claims symlink to a mountpoint is a mountpoint.
|
||||||
|
|
||||||
- Issue #1700: Regular expression inline flags incorrectly handle certain
|
- Issue #1700: Regular expression inline flags incorrectly handle certain
|
||||||
|
|
Loading…
Reference in New Issue