diff options
Diffstat (limited to 'plumbing')
-rw-r--r-- | plumbing/format/packfile/patch_delta.go | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/plumbing/format/packfile/patch_delta.go b/plumbing/format/packfile/patch_delta.go index a972f1c..45e589e 100644 --- a/plumbing/format/packfile/patch_delta.go +++ b/plumbing/format/packfile/patch_delta.go @@ -1,8 +1,9 @@ package packfile import ( + "bytes" "errors" - "io/ioutil" + "sync" "gopkg.in/src-d/go-git.v4/plumbing" ) @@ -14,6 +15,12 @@ import ( const deltaSizeMin = 4 +var bytesBufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} + // ApplyDelta writes to target the result of applying the modification deltas in delta to base. func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) error { r, err := base.Reader() @@ -26,10 +33,16 @@ func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) error { return err } - src, err := ioutil.ReadAll(r) + buf := bytesBufferPool.Get().(*bytes.Buffer) + defer func() { + buf.Reset() + bytesBufferPool.Put(buf) + } () + _, err = buf.ReadFrom(r) if err != nil { return err } + src := buf.Bytes() dst, err := PatchDelta(src, delta) if err != nil { |