diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2004-09-18 09:08:52 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2004-09-18 09:08:52 (GMT) |
commit | f3c5611fef7cbd2ac8f0bf4e44bf11fe210817be (patch) | |
tree | ea12bc951cb89f9db6270c657bedd9296b95d0c6 /Lib/tarfile.py | |
parent | 39a317890fa7651e8f124c1a566af5f7a72da792 (diff) | |
download | cpython-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.py | 41 |
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 |