Skip to content

Commit

Permalink
(fixes buildbot#582) This patch fixes the test failures by injecting …
Browse files Browse the repository at this point in the history
…an extractall method into TarFile if not already present.
  • Loading branch information
Stefan Seefeld authored and Dustin J. Mitchell committed Jul 11, 2009
1 parent bd24cdb commit c7a38d3
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions buildbot/steps/transfer.py
Expand Up @@ -59,6 +59,42 @@ def __del__(self):
os.unlink(self.destfile)


def _extractall(self, path=".", members=None):
"""Fallback extractall method for TarFile, in case it doesn't have its own."""

import copy
import operator

directories = []

if members is None:
members = self

for tarinfo in members:
if tarinfo.isdir():
# Extract directories with a safe mode.
directories.append(tarinfo)
tarinfo = copy.copy(tarinfo)
tarinfo.mode = 0700
self.extract(tarinfo, path)

# Reverse sort directories.
directories.sort(lambda a, b: cmp(a.name, b.name))
directories.reverse()

# Set correct owner, mtime and filemode on directories.
for tarinfo in directories:
dirpath = os.path.join(path, tarinfo.name)
try:
self.chown(tarinfo, dirpath)
self.utime(tarinfo, dirpath)
self.chmod(tarinfo, dirpath)
except tarfile.ExtractError, e:
if self.errorlevel > 1:
raise
else:
self._dbg(1, "tarfile: %s" % e)

class _DirectoryWriter(_FileWriter):
"""
A DirectoryWriter is implemented as a FileWriter, with an added post-processing
Expand Down Expand Up @@ -86,6 +122,8 @@ def remote_unpack(self):
mode='r|gz'
else:
mode = 'r'
if not hasattr(tarfile.TarFile, 'extractall'):
tarfile.TarFile.extractall = _extractall
archive = tarfile.open(name=self.tarname, mode=mode, fileobj=fileobj)
archive.extractall(path=self.destroot)
os.remove(self.tarname)
Expand Down

0 comments on commit c7a38d3

Please sign in to comment.