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

plumbing/object: do not eat error on tree decode #652

Merged
merged 2 commits into from
Nov 22, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions plumbing/object/tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,9 @@ func (t *Tree) dir(baseName string) (*Tree, error) {
}

tree := &Tree{s: t.s}
tree.Decode(obj)
err = tree.Decode(obj)

return tree, nil
return tree, err
}

var errEntryNotFound = errors.New("entry not found")
Expand Down
37 changes: 37 additions & 0 deletions plumbing/object/tree_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package object

import (
"errors"
"io"

"gopkg.in/src-d/go-git.v4/plumbing"
Expand Down Expand Up @@ -113,6 +114,42 @@ func (s *TreeSuite) TestFindEntry(c *C) {
c.Assert(e.Name, Equals, "foo.go")
}

// Overrides returned plumbing.EncodedObject for given hash.
// Otherwise, delegates to actual storer to get real object
type fakeStorer struct {
storer.EncodedObjectStorer
hash plumbing.Hash
fake fakeEncodedObject
}

func (fs fakeStorer) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) {
if fs.hash == h {
return fs.fake, nil
}
return fs.EncodedObjectStorer.EncodedObject(t, h)
}

// Overrides reader of plumbing.EncodedObject to simulate read error
type fakeEncodedObject struct{ plumbing.EncodedObject }

func (fe fakeEncodedObject) Reader() (io.ReadCloser, error) {
return nil, errors.New("Simulate encoded object can't be read")
}

func (s *TreeSuite) TestDir(c *C) {
vendor, err := s.Tree.dir("vendor")
c.Assert(err, IsNil)

t, err := GetTree(s.Tree.s, s.Tree.ID())
c.Assert(err, IsNil)
o, err := t.s.EncodedObject(plumbing.AnyObject, vendor.ID())
c.Assert(err, IsNil)

t.s = fakeStorer{t.s, vendor.ID(), fakeEncodedObject{o}}
_, err = t.dir("vendor")
c.Assert(err, NotNil)
}

// This plumbing.EncodedObject implementation has a reader that only returns 6
// bytes at a time, this should simulate the conditions when a read
// returns less bytes than asked, for example when reading a hash which
Expand Down