Skip to content

Commit 8019144

Browse files
authored
Merge pull request go-git#73 from WKBae/close_object
Close Reader & Writer of EncodedObject after use
2 parents e7f5448 + 1019994 commit 8019144

File tree

8 files changed

+55
-14
lines changed

8 files changed

+55
-14
lines changed

plumbing/format/packfile/diff_delta.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55

66
"github.com/go-git/go-git/v5/plumbing"
7+
"github.com/go-git/go-git/v5/utils/ioutil"
78
)
89

910
// See https://github.com/jelmer/dulwich/blob/master/dulwich/pack.py and
@@ -27,17 +28,20 @@ func GetDelta(base, target plumbing.EncodedObject) (plumbing.EncodedObject, erro
2728
return getDelta(new(deltaIndex), base, target)
2829
}
2930

30-
func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (plumbing.EncodedObject, error) {
31+
func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (o plumbing.EncodedObject, err error) {
3132
br, err := base.Reader()
3233
if err != nil {
3334
return nil, err
3435
}
35-
defer br.Close()
36+
37+
defer ioutil.CheckClose(br, &err)
38+
3639
tr, err := target.Reader()
3740
if err != nil {
3841
return nil, err
3942
}
40-
defer tr.Close()
43+
44+
defer ioutil.CheckClose(tr, &err)
4145

4246
bb := bufPool.Get().(*bytes.Buffer)
4347
defer bufPool.Put(bb)

plumbing/format/packfile/encoder.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/go-git/go-git/v5/plumbing"
1010
"github.com/go-git/go-git/v5/plumbing/storer"
1111
"github.com/go-git/go-git/v5/utils/binary"
12+
"github.com/go-git/go-git/v5/utils/ioutil"
1213
)
1314

1415
// Encoder gets the data from the storage and write it into the writer in PACK
@@ -80,7 +81,7 @@ func (e *Encoder) head(numEntries int) error {
8081
)
8182
}
8283

83-
func (e *Encoder) entry(o *ObjectToPack) error {
84+
func (e *Encoder) entry(o *ObjectToPack) (err error) {
8485
if o.WantWrite() {
8586
// A cycle exists in this delta chain. This should only occur if a
8687
// selected object representation disappeared during writing
@@ -119,17 +120,22 @@ func (e *Encoder) entry(o *ObjectToPack) error {
119120
}
120121

121122
e.zw.Reset(e.w)
123+
124+
defer ioutil.CheckClose(e.zw, &err)
125+
122126
or, err := o.Object.Reader()
123127
if err != nil {
124128
return err
125129
}
126130

131+
defer ioutil.CheckClose(or, &err)
132+
127133
_, err = io.Copy(e.zw, or)
128134
if err != nil {
129135
return err
130136
}
131137

132-
return e.zw.Close()
138+
return nil
133139
}
134140

135141
func (e *Encoder) writeBaseIfDelta(o *ObjectToPack) error {

plumbing/format/packfile/encoder_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ func objectsEqual(c *C, o1, o2 plumbing.EncodedObject) {
287287
c.Assert(err, IsNil)
288288

289289
c.Assert(bytes.Compare(b1, b2), Equals, 0)
290+
291+
err = r2.Close()
292+
c.Assert(err, IsNil)
293+
294+
err = r1.Close()
295+
c.Assert(err, IsNil)
290296
}
291297

292298
func packfileFromReader(c *C, buf *bytes.Buffer) (*Packfile, func()) {

plumbing/format/packfile/packfile.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/go-git/go-git/v5/plumbing/cache"
1111
"github.com/go-git/go-git/v5/plumbing/format/idxfile"
1212
"github.com/go-git/go-git/v5/plumbing/storer"
13+
"github.com/go-git/go-git/v5/utils/ioutil"
1314
)
1415

1516
var (
@@ -307,12 +308,14 @@ func (p *Packfile) getNextMemoryObject(h *ObjectHeader) (plumbing.EncodedObject,
307308
return obj, nil
308309
}
309310

310-
func (p *Packfile) fillRegularObjectContent(obj plumbing.EncodedObject) error {
311+
func (p *Packfile) fillRegularObjectContent(obj plumbing.EncodedObject) (err error) {
311312
w, err := obj.Writer()
312313
if err != nil {
313314
return err
314315
}
315316

317+
defer ioutil.CheckClose(w, &err)
318+
316319
_, _, err = p.s.NextObject(w)
317320
p.cachePut(obj)
318321

plumbing/format/packfile/parser.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import (
44
"bytes"
55
"errors"
66
"io"
7-
"io/ioutil"
7+
stdioutil "io/ioutil"
88

99
"github.com/go-git/go-git/v5/plumbing"
1010
"github.com/go-git/go-git/v5/plumbing/cache"
1111
"github.com/go-git/go-git/v5/plumbing/storer"
12+
"github.com/go-git/go-git/v5/utils/ioutil"
1213
)
1314

1415
var (
@@ -283,7 +284,7 @@ func (p *Parser) resolveDeltas() error {
283284

284285
if !obj.IsDelta() && len(obj.Children) > 0 {
285286
for _, child := range obj.Children {
286-
if err := p.resolveObject(ioutil.Discard, child, content); err != nil {
287+
if err := p.resolveObject(stdioutil.Discard, child, content); err != nil {
287288
return err
288289
}
289290
}
@@ -298,7 +299,7 @@ func (p *Parser) resolveDeltas() error {
298299
return nil
299300
}
300301

301-
func (p *Parser) get(o *objectInfo, buf *bytes.Buffer) error {
302+
func (p *Parser) get(o *objectInfo, buf *bytes.Buffer) (err error) {
302303
if !o.ExternalRef { // skip cache check for placeholder parents
303304
b, ok := p.cache.Get(o.Offset)
304305
if ok {
@@ -310,17 +311,21 @@ func (p *Parser) get(o *objectInfo, buf *bytes.Buffer) error {
310311
// If it's not on the cache and is not a delta we can try to find it in the
311312
// storage, if there's one. External refs must enter here.
312313
if p.storage != nil && !o.Type.IsDelta() {
313-
e, err := p.storage.EncodedObject(plumbing.AnyObject, o.SHA1)
314+
var e plumbing.EncodedObject
315+
e, err = p.storage.EncodedObject(plumbing.AnyObject, o.SHA1)
314316
if err != nil {
315317
return err
316318
}
317319
o.Type = e.Type()
318320

319-
r, err := e.Reader()
321+
var r io.ReadCloser
322+
r, err = e.Reader()
320323
if err != nil {
321324
return err
322325
}
323326

327+
defer ioutil.CheckClose(r, &err)
328+
324329
_, err = buf.ReadFrom(io.LimitReader(r, e.Size()))
325330
return err
326331
}

plumbing/format/packfile/patch_delta.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io"
77

88
"github.com/go-git/go-git/v5/plumbing"
9+
"github.com/go-git/go-git/v5/utils/ioutil"
910
)
1011

1112
// See https://github.com/git/git/blob/49fa3dc76179e04b0833542fa52d0f287a4955ac/delta.h
@@ -16,17 +17,21 @@ import (
1617
const deltaSizeMin = 4
1718

1819
// ApplyDelta writes to target the result of applying the modification deltas in delta to base.
19-
func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) error {
20+
func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) (err error) {
2021
r, err := base.Reader()
2122
if err != nil {
2223
return err
2324
}
2425

26+
defer ioutil.CheckClose(r, &err)
27+
2528
w, err := target.Writer()
2629
if err != nil {
2730
return err
2831
}
2932

33+
defer ioutil.CheckClose(w, &err)
34+
3035
buf := bufPool.Get().(*bytes.Buffer)
3136
defer bufPool.Put(buf)
3237
buf.Reset()

storage/filesystem/object.go

+2
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,8 @@ func (s *ObjectStorage) getFromUnpacked(h plumbing.Hash) (obj plumbing.EncodedOb
408408
return nil, err
409409
}
410410

411+
defer ioutil.CheckClose(w, &err)
412+
411413
s.objectCache.Put(obj)
412414

413415
_, err = io.Copy(w, r)

storage/test/storage_suite.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -494,12 +494,12 @@ func objectEquals(a plumbing.EncodedObject, b plumbing.EncodedObject) error {
494494

495495
ra, err := a.Reader()
496496
if err != nil {
497-
return fmt.Errorf("can't get reader on b: %q", err)
497+
return fmt.Errorf("can't get reader on a: %q", err)
498498
}
499499

500500
rb, err := b.Reader()
501501
if err != nil {
502-
return fmt.Errorf("can't get reader on a: %q", err)
502+
return fmt.Errorf("can't get reader on b: %q", err)
503503
}
504504

505505
ca, err := ioutil.ReadAll(ra)
@@ -516,5 +516,15 @@ func objectEquals(a plumbing.EncodedObject, b plumbing.EncodedObject) error {
516516
return errors.New("content does not match")
517517
}
518518

519+
err = rb.Close()
520+
if err != nil {
521+
return fmt.Errorf("can't close reader on b: %q", err)
522+
}
523+
524+
err = ra.Close()
525+
if err != nil {
526+
return fmt.Errorf("can't close reader on a: %q", err)
527+
}
528+
519529
return nil
520530
}

0 commit comments

Comments
 (0)