]> granicus.if.org Git - python/commitdiff
Patch #1029061: Always extract member names from the tarinfo.
authorMartin v. Löwis <martin@v.loewis.de>
Sat, 18 Sep 2004 09:08:52 +0000 (09:08 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sat, 18 Sep 2004 09:08:52 +0000 (09:08 +0000)
Lib/tarfile.py
Misc/NEWS

index 06d859087bd89711e4394dd5e2cc478de9bfbe7d..13969676dedba2f775603ac546c39cfcfc5d52fc 100644 (file)
@@ -814,7 +814,6 @@ class TarFile(object):
         # Init datastructures
         self.closed      = False
         self.members     = []       # list of members as TarInfo objects
-        self.membernames = []       # names of members
         self._loaded     = False    # flag if all members have been read
         self.offset      = 0L       # current position in the archive file
         self.inodes      = {}       # dictionary caching the inodes of
@@ -1034,12 +1033,10 @@ class TarFile(object):
            than once in the archive, its last occurence is assumed to be the
            most up-to-date version.
         """
-        self._check()
-        if name not in self.membernames and not self._loaded:
-            self._load()
-        if name not in self.membernames:
+        tarinfo = self._getmember(name)
+        if tarinfo is None:
             raise KeyError, "filename %r not found" % name
-        return self._getmember(name)
+        return tarinfo
 
     def getmembers(self):
         """Return the members of the archive as a list of TarInfo objects. The
@@ -1055,10 +1052,7 @@ class TarFile(object):
         """Return the members of the archive as a list of their names. It has
            the same order as the list returned by getmembers().
         """
-        self._check()
-        if not self._loaded:
-            self._load()
-        return self.membernames
+        return [tarinfo.name for tarinfo in self.getmembers()]
 
     def gettarinfo(self, name=None, arcname=None, fileobj=None):
         """Create a TarInfo object for either the file `name' or the file
@@ -1307,7 +1301,7 @@ class TarFile(object):
                 blocks += 1
             self.offset += blocks * BLOCKSIZE
 
-        self._record_member(tarinfo)
+        self.members.append(tarinfo)
 
     def extract(self, member, path=""):
         """Extract a member from the archive to the current working directory,
@@ -1632,7 +1626,7 @@ class TarFile(object):
             # some old tar programs don't know DIRTYPE
             tarinfo.type = DIRTYPE
 
-        self._record_member(tarinfo)
+        self.members.append(tarinfo)
         return tarinfo
 
     #--------------------------------------------------------------------------
@@ -1647,8 +1641,8 @@ class TarFile(object):
     #    if there is data to follow.
     # 2. set self.offset to the position where the next member's header will
     #    begin.
-    # 3. call self._record_member() if the tarinfo object is supposed to
-    #    appear as a member of the TarFile object.
+    # 3. append the tarinfo object to self.members, if it is supposed to appear
+    #    as a member of the TarFile object.
     # 4. return tarinfo or another valid TarInfo object.
 
     def proc_gnulong(self, tarinfo):
@@ -1729,7 +1723,7 @@ class TarFile(object):
         self.offset += self._block(tarinfo.size)
         tarinfo.size = origsize
 
-        self._record_member(tarinfo)
+        self.members.append(tarinfo)
         return tarinfo
 
     # The type mapping for the next() method. The keys are single character
@@ -1757,20 +1751,17 @@ class TarFile(object):
         """Find an archive member by name from bottom to top.
            If tarinfo is given, it is used as the starting point.
         """
+        # Ensure that all members have been loaded.
+        members = self.getmembers()
+
         if tarinfo is None:
-            end = len(self.members)
+            end = len(members)
         else:
-            end = self.members.index(tarinfo)
+            end = members.index(tarinfo)
 
         for i in xrange(end - 1, -1, -1):
-            if name == self.membernames[i]:
-                return self.members[i]
-
-    def _record_member(self, tarinfo):
-        """Record a tarinfo object in the internal datastructures.
-        """
-        self.members.append(tarinfo)
-        self.membernames.append(tarinfo.name)
+            if name == members[i].name:
+                return members[i]
 
     def _load(self):
         """Read through the entire archive file and look for readable
index a6ca5fbf4d2fa7bcd0eb36cbe5ba8a94d45b0aaa..4daf763bbba6f714423822584bdbc2e880630dd4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -22,6 +22,9 @@ Extension modules
 Library
 -------
 
+- The (undocumented) tarfile.Tarfile.membernames has been removed;
+  applications should use the getmember function.
+
 - httplib now offers symbolic constants for the HTTP status codes.
 
 - SF bug #1028306:  Trying to compare a ``datetime.date`` to a