github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/git/odb/pack/packfile_decode.go (about)

     1  package pack
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"errors"
     7  	"io"
     8  )
     9  
    10  var (
    11  	// packHeader is the expected header that begins all valid packfiles.
    12  	packHeader = []byte{'P', 'A', 'C', 'K'}
    13  
    14  	// errBadPackHeader is a sentinel error value returned when the given
    15  	// pack header does not match the expected one.
    16  	errBadPackHeader = errors.New("git/odb/pack: bad pack header")
    17  )
    18  
    19  // DecodePackfile opens the packfile given by the io.ReaderAt "r" for reading.
    20  // It does not apply any delta-base chains, nor does it do reading otherwise
    21  // beyond the header.
    22  //
    23  // If the header is malformed, or otherwise cannot be read, an error will be
    24  // returned without a corresponding packfile.
    25  func DecodePackfile(r io.ReaderAt) (*Packfile, error) {
    26  	header := make([]byte, 12)
    27  	if _, err := r.ReadAt(header[:], 0); err != nil {
    28  		return nil, err
    29  	}
    30  
    31  	if !bytes.HasPrefix(header, packHeader) {
    32  		return nil, errBadPackHeader
    33  	}
    34  
    35  	version := binary.BigEndian.Uint32(header[4:])
    36  	objects := binary.BigEndian.Uint32(header[8:])
    37  
    38  	return &Packfile{
    39  		Version: version,
    40  		Objects: objects,
    41  
    42  		r: r,
    43  	}, nil
    44  }