Will backport to 2.4.
This commit is contained in:
parent
9e34c04732
commit
5dbdc59577
|
@ -1179,17 +1179,16 @@ class TarFile(object):
|
||||||
|
|
||||||
# Fill the TarInfo object with all
|
# Fill the TarInfo object with all
|
||||||
# information we can get.
|
# information we can get.
|
||||||
tarinfo.name = arcname
|
tarinfo.name = arcname
|
||||||
tarinfo.mode = stmd
|
tarinfo.mode = stmd
|
||||||
tarinfo.uid = statres.st_uid
|
tarinfo.uid = statres.st_uid
|
||||||
tarinfo.gid = statres.st_gid
|
tarinfo.gid = statres.st_gid
|
||||||
if stat.S_ISDIR(stmd):
|
if stat.S_ISREG(stmd):
|
||||||
# For a directory, the size must be 0
|
|
||||||
tarinfo.size = 0
|
|
||||||
else:
|
|
||||||
tarinfo.size = statres.st_size
|
tarinfo.size = statres.st_size
|
||||||
|
else:
|
||||||
|
tarinfo.size = 0L
|
||||||
tarinfo.mtime = statres.st_mtime
|
tarinfo.mtime = statres.st_mtime
|
||||||
tarinfo.type = type
|
tarinfo.type = type
|
||||||
tarinfo.linkname = linkname
|
tarinfo.linkname = linkname
|
||||||
if pwd:
|
if pwd:
|
||||||
try:
|
try:
|
||||||
|
@ -1280,16 +1279,15 @@ class TarFile(object):
|
||||||
self.addfile(tarinfo, f)
|
self.addfile(tarinfo, f)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
if tarinfo.type in (LNKTYPE, SYMTYPE, FIFOTYPE, CHRTYPE, BLKTYPE):
|
elif tarinfo.isdir():
|
||||||
tarinfo.size = 0L
|
|
||||||
self.addfile(tarinfo)
|
|
||||||
|
|
||||||
if tarinfo.isdir():
|
|
||||||
self.addfile(tarinfo)
|
self.addfile(tarinfo)
|
||||||
if recursive:
|
if recursive:
|
||||||
for f in os.listdir(name):
|
for f in os.listdir(name):
|
||||||
self.add(os.path.join(name, f), os.path.join(arcname, f))
|
self.add(os.path.join(name, f), os.path.join(arcname, f))
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.addfile(tarinfo)
|
||||||
|
|
||||||
def addfile(self, tarinfo, fileobj=None):
|
def addfile(self, tarinfo, fileobj=None):
|
||||||
"""Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
|
"""Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
|
||||||
given, tarinfo.size bytes are read from it and added to the archive.
|
given, tarinfo.size bytes are read from it and added to the archive.
|
||||||
|
|
|
@ -230,6 +230,40 @@ class WriteTest(BaseTest):
|
||||||
else:
|
else:
|
||||||
self.dst.addfile(tarinfo, f)
|
self.dst.addfile(tarinfo, f)
|
||||||
|
|
||||||
|
class WriteSize0Test(BaseTest):
|
||||||
|
mode = 'w'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.tmpdir = dirname()
|
||||||
|
self.dstname = tmpname()
|
||||||
|
self.dst = tarfile.open(self.dstname, "w")
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.dst.close()
|
||||||
|
|
||||||
|
def test_file(self):
|
||||||
|
path = os.path.join(self.tmpdir, "file")
|
||||||
|
file(path, "w")
|
||||||
|
tarinfo = self.dst.gettarinfo(path)
|
||||||
|
self.assertEqual(tarinfo.size, 0)
|
||||||
|
file(path, "w").write("aaa")
|
||||||
|
tarinfo = self.dst.gettarinfo(path)
|
||||||
|
self.assertEqual(tarinfo.size, 3)
|
||||||
|
|
||||||
|
def test_directory(self):
|
||||||
|
path = os.path.join(self.tmpdir, "directory")
|
||||||
|
os.mkdir(path)
|
||||||
|
tarinfo = self.dst.gettarinfo(path)
|
||||||
|
self.assertEqual(tarinfo.size, 0)
|
||||||
|
|
||||||
|
def test_symlink(self):
|
||||||
|
if hasattr(os, "symlink"):
|
||||||
|
path = os.path.join(self.tmpdir, "symlink")
|
||||||
|
os.symlink("link_target", path)
|
||||||
|
tarinfo = self.dst.gettarinfo(path)
|
||||||
|
self.assertEqual(tarinfo.size, 0)
|
||||||
|
|
||||||
|
|
||||||
class WriteStreamTest(WriteTest):
|
class WriteStreamTest(WriteTest):
|
||||||
sep = '|'
|
sep = '|'
|
||||||
|
|
||||||
|
@ -399,6 +433,7 @@ def test_main():
|
||||||
ReadAsteriskTest,
|
ReadAsteriskTest,
|
||||||
ReadStreamAsteriskTest,
|
ReadStreamAsteriskTest,
|
||||||
WriteTest,
|
WriteTest,
|
||||||
|
WriteSize0Test,
|
||||||
WriteStreamTest,
|
WriteStreamTest,
|
||||||
WriteGNULongTest,
|
WriteGNULongTest,
|
||||||
]
|
]
|
||||||
|
|
|
@ -204,6 +204,8 @@ Extension Modules
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Bug #1167128: Fix size of a symlink in a tarfile to be 0.
|
||||||
|
|
||||||
- Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook
|
- Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook
|
||||||
functionality.
|
functionality.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue