Patch #1029061: Always extract member names from the tarinfo.

This commit is contained in:
Martin v. Löwis 2004-09-18 09:08:52 +00:00
parent 39a317890f
commit f3c5611fef
2 changed files with 19 additions and 25 deletions

View 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

View File

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