summaryrefslogtreecommitdiffstats
path: root/Lib/tarfile.py
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2004-09-18 09:08:52 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2004-09-18 09:08:52 (GMT)
commitf3c5611fef7cbd2ac8f0bf4e44bf11fe210817be (patch)
treeea12bc951cb89f9db6270c657bedd9296b95d0c6 /Lib/tarfile.py
parent39a317890fa7651e8f124c1a566af5f7a72da792 (diff)
downloadcpython-f3c5611fef7cbd2ac8f0bf4e44bf11fe210817be.zip
cpython-f3c5611fef7cbd2ac8f0bf4e44bf11fe210817be.tar.gz
cpython-f3c5611fef7cbd2ac8f0bf4e44bf11fe210817be.tar.bz2
Patch #1029061: Always extract member names from the tarinfo.
Diffstat (limited to 'Lib/tarfile.py')
-rw-r--r--Lib/tarfile.py41
1 files changed, 16 insertions, 25 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index 06d8590..1396967 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -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