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

Commit 83e914d

Browse files
committed
object: fix Change.Files() method behavior (fix #317)
- If 'from' or 'to' are tree entries that aren't files, Files() method will return nil instead of object not found error. - Added a test checking this using modules fixture.
1 parent 31a249d commit 83e914d

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

plumbing/object/change.go

+8
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,21 @@ func (c *Change) Files() (from, to *File, err error) {
4646

4747
if action == merkletrie.Insert || action == merkletrie.Modify {
4848
to, err = c.To.Tree.TreeEntryFile(&c.To.TreeEntry)
49+
if !c.To.TreeEntry.Mode.IsFile() {
50+
return nil, nil, nil
51+
}
52+
4953
if err != nil {
5054
return
5155
}
5256
}
5357

5458
if action == merkletrie.Delete || action == merkletrie.Modify {
5559
from, err = c.From.Tree.TreeEntryFile(&c.From.TreeEntry)
60+
if !c.From.TreeEntry.Mode.IsFile() {
61+
return nil, nil, nil
62+
}
63+
5664
if err != nil {
5765
return
5866
}

plumbing/object/change_test.go

+48
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,54 @@ func (s *ChangeSuite) TestEmptyChangeFails(c *C) {
198198
c.Assert(str, Equals, "malformed change")
199199
}
200200

201+
// test reproducing bug #317
202+
func (s *ChangeSuite) TestNoFileFilemodes(c *C) {
203+
s.Suite.SetUpSuite(c)
204+
f := fixtures.ByURL("https://github.com/git-fixtures/submodule.git").One()
205+
206+
sto, err := filesystem.NewStorage(f.DotGit())
207+
c.Assert(err, IsNil)
208+
209+
iter, err := sto.IterEncodedObjects(plumbing.AnyObject)
210+
c.Assert(err, IsNil)
211+
var commits []*Commit
212+
iter.ForEach(func(o plumbing.EncodedObject) error {
213+
if o.Type() == plumbing.CommitObject {
214+
commit, err := GetCommit(sto, o.Hash())
215+
c.Assert(err, IsNil)
216+
commits = append(commits, commit)
217+
218+
}
219+
220+
return nil
221+
})
222+
223+
c.Assert(len(commits), Not(Equals), 0)
224+
225+
var prev *Commit
226+
for _, commit := range commits {
227+
if prev == nil {
228+
prev = commit
229+
continue
230+
}
231+
tree, err := commit.Tree()
232+
c.Assert(err, IsNil)
233+
prevTree, err := prev.Tree()
234+
c.Assert(err, IsNil)
235+
changes, err := DiffTree(tree, prevTree)
236+
c.Assert(err, IsNil)
237+
for _, change := range changes {
238+
_, _, err := change.Files()
239+
if err != nil {
240+
panic(err)
241+
c.Assert(err, IsNil)
242+
}
243+
}
244+
245+
prev = commit
246+
}
247+
}
248+
201249
func (s *ChangeSuite) TestErrorsFindingChildsAreDetected(c *C) {
202250
// Commit 7beaad711378a4daafccc2c04bc46d36df2a0fd1 of the go-git
203251
// fixture modified "examples/latest/latest.go".

0 commit comments

Comments
 (0)