Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 4f7ef8f

Browse files
authored
Merge pull request #258 from ajnavarro/fix/onf-decoder
Fix missing objects if they where deltified using ref-delta
2 parents b65d94e + b872b71 commit 4f7ef8f

File tree

3 files changed

+71
-10
lines changed

3 files changed

+71
-10
lines changed

plumbing/format/packfile/decoder.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,6 @@ func (d *Decoder) decodeIfSpecificType(h *ObjectHeader) (plumbing.EncodedObject,
225225
realType, err = d.ofsDeltaType(h.OffsetReference)
226226
case plumbing.REFDeltaObject:
227227
realType, err = d.refDeltaType(h.Reference)
228-
229-
// If a reference delta is not found, it means that it isn't of
230-
// the type we are looking for, because we don't have any reference
231-
// and it is not present into the object storer
232-
if err == plumbing.ErrObjectNotFound {
233-
return nil, nil
234-
}
235228
default:
236229
realType = h.Type
237230
}

plumbing/format/packfile/decoder_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,65 @@ func (s *ReaderSuite) TestDecode(c *C) {
4747
})
4848
}
4949

50+
func (s *ReaderSuite) TestDecodeByTypeRefDelta(c *C) {
51+
f := fixtures.Basic().ByTag("ref-delta").One()
52+
53+
storage := memory.NewStorage()
54+
scanner := packfile.NewScanner(f.Packfile())
55+
d, err := packfile.NewDecoderForType(scanner, storage, plumbing.CommitObject)
56+
c.Assert(err, IsNil)
57+
58+
// Specific offset elements needed to decode correctly the ref-delta
59+
offsets := map[plumbing.Hash]int64{
60+
plumbing.NewHash("a8d315b2b1c615d43042c3a62402b8a54288cf5c"): 84880,
61+
plumbing.NewHash("fb72698cab7617ac416264415f13224dfd7a165e"): 85141,
62+
plumbing.NewHash("eba74343e2f15d62adedfd8c883ee0262b5c8021"): 85300,
63+
}
64+
65+
d.SetOffsets(offsets)
66+
67+
defer d.Close()
68+
69+
_, count, err := scanner.Header()
70+
c.Assert(err, IsNil)
71+
72+
var i uint32
73+
for i = 0; i < count; i++ {
74+
obj, err := d.DecodeObject()
75+
c.Assert(err, IsNil)
76+
77+
if obj != nil {
78+
c.Assert(obj.Type(), Equals, plumbing.CommitObject)
79+
}
80+
}
81+
}
82+
83+
func (s *ReaderSuite) TestDecodeByTypeRefDeltaError(c *C) {
84+
fixtures.Basic().ByTag("ref-delta").Test(c, func(f *fixtures.Fixture) {
85+
storage := memory.NewStorage()
86+
scanner := packfile.NewScanner(f.Packfile())
87+
d, err := packfile.NewDecoderForType(scanner, storage, plumbing.CommitObject)
88+
c.Assert(err, IsNil)
89+
90+
defer d.Close()
91+
92+
_, count, err := scanner.Header()
93+
c.Assert(err, IsNil)
94+
95+
isError := false
96+
var i uint32
97+
for i = 0; i < count; i++ {
98+
_, err := d.DecodeObject()
99+
if err != nil {
100+
isError = true
101+
break
102+
}
103+
}
104+
c.Assert(isError, Equals, true)
105+
})
106+
107+
}
108+
50109
func (s *ReaderSuite) TestDecodeByType(c *C) {
51110
ts := []plumbing.ObjectType{
52111
plumbing.CommitObject,
@@ -61,6 +120,12 @@ func (s *ReaderSuite) TestDecodeByType(c *C) {
61120
scanner := packfile.NewScanner(f.Packfile())
62121
d, err := packfile.NewDecoderForType(scanner, storage, t)
63122
c.Assert(err, IsNil)
123+
124+
// when the packfile is ref-delta based, the offsets are required
125+
if f.Is("ref-delta") {
126+
d.SetOffsets(getOffsetsFromIdx(f.Idx()))
127+
}
128+
64129
defer d.Close()
65130

66131
_, count, err := scanner.Header()

storage/filesystem/object.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ func (s *ObjectStorage) buildPackfileIters(
233233
return nil, err
234234
}
235235

236-
iter, err := newPackfileIter(pack, t, seen)
236+
iter, err := newPackfileIter(pack, t, seen, s.index[h])
237237
if err != nil {
238238
return nil, err
239239
}
@@ -272,10 +272,11 @@ type packfileIter struct {
272272
}
273273

274274
func NewPackfileIter(f billy.File, t plumbing.ObjectType) (storer.EncodedObjectIter, error) {
275-
return newPackfileIter(f, t, make(map[plumbing.Hash]bool))
275+
return newPackfileIter(f, t, make(map[plumbing.Hash]bool), nil)
276276
}
277277

278-
func newPackfileIter(f billy.File, t plumbing.ObjectType, seen map[plumbing.Hash]bool) (storer.EncodedObjectIter, error) {
278+
func newPackfileIter(f billy.File, t plumbing.ObjectType, seen map[plumbing.Hash]bool,
279+
index idx) (storer.EncodedObjectIter, error) {
279280
s := packfile.NewScanner(f)
280281
_, total, err := s.Header()
281282
if err != nil {
@@ -287,6 +288,8 @@ func newPackfileIter(f billy.File, t plumbing.ObjectType, seen map[plumbing.Hash
287288
return nil, err
288289
}
289290

291+
d.SetOffsets(index)
292+
290293
return &packfileIter{
291294
f: f,
292295
d: d,

0 commit comments

Comments
 (0)