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 }