Patch #1168594: set sizes of non-regular files to zero. Fixes #1167128.

Will backport to 2.4.
This commit is contained in:
Martin v. Löwis 2005-08-27 10:07:56 +00:00
parent 9e34c04732
commit 5dbdc59577
3 changed files with 49 additions and 14 deletions

View File

@ -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.

View File

@ -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,
] ]

View File

@ -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.