def next()

in src/python/pants/util/tarutil.py [0:0]


  def next(self):
    """A copy and modification of the next() method in tarfile module.

    Note: this function should stay named next(), not __next__(), to reflect CPython.
    See https://github.com/python/cpython/blob/master/Lib/tarfile.py#L2255.

    The copy is from tarfile.py of CPython @102457:95df96aa2f5a

    # Copyright (C) 2002 Lars Gustäbel <lars@gustaebel.de>
    # All rights reserved.
    #
    # Permission  is  hereby granted,  free  of charge,  to  any person
    # obtaining a  copy of  this software  and associated documentation
    # files  (the  "Software"),  to   deal  in  the  Software   without
    # restriction,  including  without limitation  the  rights to  use,
    # copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies  of  the  Software,  and to  permit  persons  to  whom the
    # Software  is  furnished  to  do  so,  subject  to  the  following
    # conditions:
    #
    # The above copyright  notice and this  permission notice shall  be
    # included in all copies or substantial portions of the Software.
    """
    self._check("ra")
    if self.firstmember is not None:
      m = self.firstmember
      self.firstmember = None
      return m

    # Advance the file pointer.
    if self.offset != self.fileobj.tell():
      self.fileobj.seek(self.offset - 1)
      if not self.fileobj.read(1):
        raise tarfile.ReadError("unexpected end of data")

    # Read the next block.
    tarinfo = None
    while True:
      try:
        tarinfo = self.tarinfo.fromtarfile(self)
      except tarfile.EOFHeaderError as e:
        if self.ignore_zeros:
          self._dbg(2, "0x%X: %s" % (self.offset, e))
          self.offset += tarfile.BLOCKSIZE
          continue
      except tarfile.InvalidHeaderError as e:
        if self.ignore_zeros:
          self._dbg(2, "0x%X: %s" % (self.offset, e))
          self.offset += tarfile.BLOCKSIZE
          continue
        # Modify here, to raise exceptions if errorlevel is bigger than 0.
        elif self.errorlevel > 0:
          raise tarfile.ReadError(str(e))
      except tarfile.EmptyHeaderError:
        if self.offset == 0:
          raise tarfile.ReadError("empty file")
      except tarfile.TruncatedHeaderError as e:
        if self.offset == 0:
          raise tarfile.ReadError(str(e))
      except tarfile.SubsequentHeaderError as e:
        raise tarfile.ReadError(str(e))
      break

    if tarinfo is not None:
      self.members.append(tarinfo)
    else:
      self._loaded = True

    return tarinfo