| package packfile |
| |
| import ( |
| "bytes" |
| "io" |
| "sync" |
| |
| "gopkg.in/src-d/go-git.v4/plumbing/storer" |
| "gopkg.in/src-d/go-git.v4/utils/ioutil" |
| ) |
| |
| var signature = []byte{'P', 'A', 'C', 'K'} |
| |
| const ( |
| // VersionSupported is the packfile version supported by this package |
| VersionSupported uint32 = 2 |
| |
| firstLengthBits = uint8(4) // the first byte into object header has 4 bits to store the length |
| lengthBits = uint8(7) // subsequent bytes has 7 bits to store the length |
| maskFirstLength = 15 // 0000 1111 |
| maskContinue = 0x80 // 1000 0000 |
| maskLength = uint8(127) // 0111 1111 |
| maskType = uint8(112) // 0111 0000 |
| ) |
| |
| // UpdateObjectStorage updates the given storer.EncodedObjectStorer with the contents of the |
| // packfile. |
| func UpdateObjectStorage(s storer.EncodedObjectStorer, packfile io.Reader) error { |
| if sw, ok := s.(storer.PackfileWriter); ok { |
| return writePackfileToObjectStorage(sw, packfile) |
| } |
| |
| stream := NewScanner(packfile) |
| d, err := NewDecoder(stream, s) |
| if err != nil { |
| return err |
| } |
| |
| _, err = d.Decode() |
| return err |
| } |
| |
| func writePackfileToObjectStorage(sw storer.PackfileWriter, packfile io.Reader) error { |
| var err error |
| w, err := sw.PackfileWriter() |
| if err != nil { |
| return err |
| } |
| |
| defer ioutil.CheckClose(w, &err) |
| _, err = io.Copy(w, packfile) |
| return err |
| } |
| |
| var bufPool = sync.Pool{ |
| New: func() interface{} { |
| return bytes.NewBuffer(nil) |
| }, |
| } |