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

Commit 07adc3a

Browse files
committed
format: packfile fix DecodeObjectAt when Decoder has type
Signed-off-by: Máximo Cuadros <mcuadros@gmail.com>
1 parent 63f4806 commit 07adc3a

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

plumbing/format/packfile/decoder.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,16 @@ func (d *Decoder) decodeObjectsWithObjectStorerTx(count int) error {
207207
// constructor, if the object decoded is not equals to the specified one, nil will
208208
// be returned
209209
func (d *Decoder) DecodeObject() (plumbing.EncodedObject, error) {
210+
return d.doDecodeObject(d.decoderType)
211+
}
212+
213+
func (d *Decoder) doDecodeObject(t plumbing.ObjectType) (plumbing.EncodedObject, error) {
210214
h, err := d.s.NextObjectHeader()
211215
if err != nil {
212216
return nil, err
213217
}
214218

215-
if d.decoderType == plumbing.AnyObject {
219+
if t == plumbing.AnyObject {
216220
return d.decodeByHeader(h)
217221
}
218222

@@ -279,6 +283,7 @@ func (d *Decoder) decodeByHeader(h *ObjectHeader) (plumbing.EncodedObject, error
279283
obj := d.newObject()
280284
obj.SetSize(h.Length)
281285
obj.SetType(h.Type)
286+
282287
var crc uint32
283288
var err error
284289
switch h.Type {
@@ -315,7 +320,8 @@ func (d *Decoder) newObject() plumbing.EncodedObject {
315320
// returned is added into a internal index. This is intended to be able to regenerate
316321
// objects from deltas (offset deltas or reference deltas) without an package index
317322
// (.idx file). If Decode wasn't called previously objects offset should provided
318-
// using the SetOffsets method.
323+
// using the SetOffsets method. It decodes the object regardless of the Decoder
324+
// type.
319325
func (d *Decoder) DecodeObjectAt(offset int64) (plumbing.EncodedObject, error) {
320326
if !d.s.IsSeekable {
321327
return nil, ErrNonSeekable
@@ -333,7 +339,7 @@ func (d *Decoder) DecodeObjectAt(offset int64) (plumbing.EncodedObject, error) {
333339
}
334340
}()
335341

336-
return d.DecodeObject()
342+
return d.doDecodeObject(plumbing.AnyObject)
337343
}
338344

339345
func (d *Decoder) fillRegularObjectContent(obj plumbing.EncodedObject) (uint32, error) {

plumbing/format/packfile/decoder_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ func (s *ReaderSuite) TestDecodeCRCs(c *C) {
293293
c.Assert(int(sum), Equals, 78022211966)
294294
}
295295

296-
func (s *ReaderSuite) TestReadObjectAt(c *C) {
296+
func (s *ReaderSuite) TestDecodeObjectAt(c *C) {
297297
f := fixtures.Basic().One()
298298
scanner := packfile.NewScanner(f.Packfile())
299299
d, err := packfile.NewDecoder(scanner, nil)
@@ -311,6 +311,25 @@ func (s *ReaderSuite) TestReadObjectAt(c *C) {
311311
c.Assert(obj.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
312312
}
313313

314+
func (s *ReaderSuite) TestDecodeObjectAtForType(c *C) {
315+
f := fixtures.Basic().One()
316+
scanner := packfile.NewScanner(f.Packfile())
317+
d, err := packfile.NewDecoderForType(scanner, nil, plumbing.TreeObject)
318+
c.Assert(err, IsNil)
319+
320+
// when the packfile is ref-delta based, the offsets are required
321+
if f.Is("ref-delta") {
322+
d.SetIndex(getIndexFromIdxFile(f.Idx()))
323+
}
324+
325+
// the objects at reference 186, is a delta, so should be recall,
326+
// without being read before.
327+
obj, err := d.DecodeObjectAt(186)
328+
c.Assert(err, IsNil)
329+
c.Assert(obj.Type(), Equals, plumbing.CommitObject)
330+
c.Assert(obj.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
331+
}
332+
314333
func (s *ReaderSuite) TestIndex(c *C) {
315334
f := fixtures.Basic().One()
316335
scanner := packfile.NewScanner(f.Packfile())

0 commit comments

Comments
 (0)