parameters: (cls, buf, encoding, errors)
return_statement: return obj
docstring: Construct a TarInfo object from a 512 byte bytes object.
docstring_summary: Construct a TarInfo object from a 512 byte bytes object.
docstring_tokens: Construct a TarInfo object from a 512 byte bytes object .
function: def frombuf(cls, buf, encoding, errors):
          """Construct a TarInfo object from a 512 byte bytes object.
          """
          if len(buf) == 0:
              raise EmptyHeaderError("empty header")
          if len(buf) != BLOCKSIZE:
              raise TruncatedHeaderError("truncated header")
          if buf.count(NUL) == BLOCKSIZE:
              raise EOFHeaderError("end of file header")
  
          chksum = nti(buf[148:156])
          if chksum not in calc_chksums(buf):
              raise InvalidHeaderError("bad checksum")
  
          obj = cls()
          obj.name = nts(buf[0:100], encoding, errors)
          obj.mode = nti(buf[100:108])
          obj.uid = nti(buf[108:116])
          obj.gid = nti(buf[116:124])
          obj.size = nti(buf[124:136])
          obj.mtime = nti(buf[136:148])
          obj.chksum = chksum
          obj.type = buf[156:157]
          obj.linkname = nts(buf[157:257], encoding, errors)
          obj.uname = nts(buf[265:297], encoding, errors)
          obj.gname = nts(buf[297:329], encoding, errors)
          obj.devmajor = nti(buf[329:337])
          obj.devminor = nti(buf[337:345])
          prefix = nts(buf[345:500], encoding, errors)
  
          # Old V7 tar format represents a directory as a regular
          # file with a trailing slash.
          if obj.type == AREGTYPE and obj.name.endswith("/"):
              obj.type = DIRTYPE
  
          # The old GNU sparse format occupies some of the unused
          # space in the buffer for up to 4 sparse structures.
          # Save them for later processing in _proc_sparse().
          if obj.type == GNUTYPE_SPARSE:
              pos = 386
              structs = []
              for i in range(4):
                  try:
                      offset = nti(buf[pos:pos + 12])
                      numbytes = nti(buf[pos + 12:pos + 24])
                  except ValueError:
                      break
                  structs.append((offset, numbytes))
                  pos += 24
              isextended = bool(buf[482])
              origsize = nti(buf[483:495])
              obj._sparse_structs = (structs, isextended, origsize)
  
          # Remove redundant slashes from directories.
          if obj.isdir():
              obj.name = obj.name.rstrip("/")
  
          # Reconstruct a ustar longname.
          if prefix and obj.type not in GNU_TYPES:
              obj.name = prefix + "/" + obj.name
          return obj
function_tokens: def frombuf ( cls , buf , encoding , errors ) : if len ( buf ) == 0 : raise EmptyHeaderError ( "empty header" ) if len ( buf ) != BLOCKSIZE : raise TruncatedHeaderError ( "truncated header" ) if buf . count ( NUL ) == BLOCKSIZE : raise EOFHeaderError ( "end of file header" ) chksum = nti ( buf [ 148 : 156 ] ) if chksum not in calc_chksums ( buf ) : raise InvalidHeaderError ( "bad checksum" ) obj = cls ( ) obj . name = nts ( buf [ 0 : 100 ] , encoding , errors ) obj . mode = nti ( buf [ 100 : 108 ] ) obj . uid = nti ( buf [ 108 : 116 ] ) obj . gid = nti ( buf [ 116 : 124 ] ) obj . size = nti ( buf [ 124 : 136 ] ) obj . mtime = nti ( buf [ 136 : 148 ] ) obj . chksum = chksum obj . type = buf [ 156 : 157 ] obj . linkname = nts ( buf [ 157 : 257 ] , encoding , errors ) obj . uname = nts ( buf [ 265 : 297 ] , encoding , errors ) obj . gname = nts ( buf [ 297 : 329 ] , encoding , errors ) obj . devmajor = nti ( buf [ 329 : 337 ] ) obj . devminor = nti ( buf [ 337 : 345 ] ) prefix = nts ( buf [ 345 : 500 ] , encoding , errors ) # Old V7 tar format represents a directory as a regular # file with a trailing slash. if obj . type == AREGTYPE and obj . name . endswith ( "/" ) : obj . type = DIRTYPE # The old GNU sparse format occupies some of the unused # space in the buffer for up to 4 sparse structures. # Save them for later processing in _proc_sparse(). if obj . type == GNUTYPE_SPARSE : pos = 386 structs = [ ] for i in range ( 4 ) : try : offset = nti ( buf [ pos : pos + 12 ] ) numbytes = nti ( buf [ pos + 12 : pos + 24 ] ) except ValueError : break structs . append ( ( offset , numbytes ) ) pos += 24 isextended = bool ( buf [ 482 ] ) origsize = nti ( buf [ 483 : 495 ] ) obj . _sparse_structs = ( structs , isextended , origsize ) # Remove redundant slashes from directories. if obj . isdir ( ) : obj . name = obj . name . rstrip ( "/" ) # Reconstruct a ustar longname. if prefix and obj . type not in GNU_TYPES : obj . name = prefix + "/" + obj . name return obj