Ticket #582: patch

File patch, 1.8 KB (added by stefan, 3 years ago)

This patch fixes the test failures by injecting an extractall method into TarFile? if not already present.

  • buildbot/steps/transfer.py

    diff --git a/buildbot/steps/transfer.py b/buildbot/steps/transfer.py
    index ff1de46..ff034bd 100644
    a b class _FileWriter(pb.Referenceable): 
    5959            os.unlink(self.destfile) 
    6060 
    6161 
     62def _extractall(self, path=".", members=None): 
     63    """Fallback extractall method for TarFile, in case it doesn't have its own.""" 
     64 
     65    import copy 
     66    import operator 
     67 
     68    directories = [] 
     69 
     70    if members is None: 
     71        members = self 
     72 
     73    for tarinfo in members: 
     74        if tarinfo.isdir(): 
     75            # Extract directories with a safe mode. 
     76            directories.append(tarinfo) 
     77            tarinfo = copy.copy(tarinfo) 
     78            tarinfo.mode = 0700 
     79        self.extract(tarinfo, path) 
     80 
     81    # Reverse sort directories. 
     82    directories.sort(lambda a, b: cmp(a.name, b.name)) 
     83    directories.reverse() 
     84 
     85    # Set correct owner, mtime and filemode on directories. 
     86    for tarinfo in directories: 
     87        dirpath = os.path.join(path, tarinfo.name) 
     88        try: 
     89            self.chown(tarinfo, dirpath) 
     90            self.utime(tarinfo, dirpath) 
     91            self.chmod(tarinfo, dirpath) 
     92        except tarfile.ExtractError, e: 
     93            if self.errorlevel > 1: 
     94                raise 
     95            else: 
     96                self._dbg(1, "tarfile: %s" % e) 
     97 
    6298class _DirectoryWriter(_FileWriter): 
    6399    """ 
    64100    A DirectoryWriter is implemented as a FileWriter, with an added post-processing 
    class _DirectoryWriter(_FileWriter): 
    86122            mode='r|gz' 
    87123        else: 
    88124            mode = 'r' 
     125        if not hasattr(tarfile.TarFile, 'extractall'): 
     126            tarfile.TarFile.extractall = _extractall 
    89127        archive = tarfile.open(name=self.tarname, mode=mode, fileobj=fileobj) 
    90128        archive.extractall(path=self.destroot) 
    91129        os.remove(self.tarname)