Imported Upstream version 2.5.0
[scm/test.git] / vendor / github.com / git-lfs / gitobj / pack / packfile_decode.go
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("gitobj/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 }