]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch #1168594: set sizes of non-regular files to zero. Fixes #1167128.
authorMartin v. Löwis <martin@v.loewis.de>
Sat, 27 Aug 2005 10:08:21 +0000 (10:08 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sat, 27 Aug 2005 10:08:21 +0000 (10:08 +0000)
Lib/tarfile.py
Lib/test/test_tarfile.py
Misc/NEWS

index 366a244ab5a96d30cad35eb1fe30387ac1814760..ce4d02feb429375327efc48aca8c58dd01fb3d19 100644 (file)
@@ -1132,17 +1132,16 @@ class TarFile(object):
 
         # Fill the TarInfo object with all
         # information we can get.
-        tarinfo.name  = arcname
-        tarinfo.mode  = stmd
-        tarinfo.uid   = statres.st_uid
-        tarinfo.gid   = statres.st_gid
-        if stat.S_ISDIR(stmd):
-            # For a directory, the size must be 0
-            tarinfo.size  = 0
-        else:
+        tarinfo.name = arcname
+        tarinfo.mode = stmd
+        tarinfo.uid = statres.st_uid
+        tarinfo.gid = statres.st_gid
+        if stat.S_ISREG(stmd):
             tarinfo.size = statres.st_size
+        else:
+            tarinfo.size = 0L
         tarinfo.mtime = statres.st_mtime
-        tarinfo.type  = type
+        tarinfo.type = type
         tarinfo.linkname = linkname
         if pwd:
             try:
@@ -1233,16 +1232,15 @@ class TarFile(object):
             self.addfile(tarinfo, f)
             f.close()
 
-        if tarinfo.type in (LNKTYPE, SYMTYPE, FIFOTYPE, CHRTYPE, BLKTYPE):
-            tarinfo.size = 0L
-            self.addfile(tarinfo)
-
-        if tarinfo.isdir():
+        elif tarinfo.isdir():
             self.addfile(tarinfo)
             if recursive:
                 for f in os.listdir(name):
                     self.add(os.path.join(name, f), os.path.join(arcname, f))
 
+        else:
+            self.addfile(tarinfo)
+
     def addfile(self, tarinfo, fileobj=None):
         """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
            given, tarinfo.size bytes are read from it and added to the archive.
index 0fae5efcd4010bfa3be7a5a5030d0562d96fc22d..c0d9ecad47cafde472fd5a1a429586afec422e00 100644 (file)
@@ -208,6 +208,40 @@ class WriteTest(BaseTest):
             else:
                 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):
     sep = '|'
 
@@ -366,6 +400,7 @@ def test_main():
         ReadTest,
         ReadStreamTest,
         WriteTest,
+        WriteSize0Test,
         WriteStreamTest,
         WriteGNULongTest,
     ]
index 69a5686d1d3d2f99afa5919fe7d915e970a61399..9ea848bfd9b738c496973a269673a09cf2079665 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -79,6 +79,8 @@ Extension Modules
 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
   functionality.