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

Commit

Permalink
Merge pull request #1067 from ajnavarro/fix/log-all-missing-objects
Browse files Browse the repository at this point in the history
Ignore missing references/objects on log --all
  • Loading branch information
mcuadros authored Feb 13, 2019
2 parents 2ab6d5c + 2b24822 commit 4d8bd13
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 11 deletions.
34 changes: 23 additions & 11 deletions plumbing/object/commit_walker.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,26 +197,38 @@ func NewCommitAllIter(repoStorer storage.Storer, commitIterFunc func(*Commit) Co
commitsPath := list.New()
commitsLookup := make(map[plumbing.Hash]*list.Element)
head, err := storer.ResolveReference(repoStorer, plumbing.HEAD)
if err != nil {
return nil, err
if err == nil {
err = addReference(repoStorer, commitIterFunc, head, commitsPath, commitsLookup)
}

// add all references along with the HEAD
if err = addReference(repoStorer, commitIterFunc, head, commitsPath, commitsLookup); err != nil {
if err != nil && err != plumbing.ErrReferenceNotFound {
return nil, err
}

// add all references along with the HEAD
refIter, err := repoStorer.IterReferences()
if err != nil {
return nil, err
}
defer refIter.Close()
err = refIter.ForEach(
func(ref *plumbing.Reference) error {
return addReference(repoStorer, commitIterFunc, ref, commitsPath, commitsLookup)
},
)
if err != nil {
return nil, err

for {
ref, err := refIter.Next()
if err == io.EOF {
break
}

if err == plumbing.ErrReferenceNotFound {
continue
}

if err != nil {
return nil, err
}

if err = addReference(repoStorer, commitIterFunc, ref, commitsPath, commitsLookup); err != nil {
return nil, err
}
}

return &commitAllIterator{commitsPath.Front()}, nil
Expand Down
62 changes: 62 additions & 0 deletions repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1256,8 +1256,18 @@ func (s *RepositorySuite) TestLogAll(c *C) {
err := r.clone(context.Background(), &CloneOptions{
URL: s.GetBasicLocalRepositoryURL(),
})
c.Assert(err, IsNil)

rIter, err := r.Storer.IterReferences()
c.Assert(err, IsNil)

refCount := 0
err = rIter.ForEach(func(ref *plumbing.Reference) error {
refCount++
return nil
})
c.Assert(err, IsNil)
c.Assert(refCount, Equals, 5)

cIter, err := r.Log(&LogOptions{
All: true,
Expand Down Expand Up @@ -1286,6 +1296,58 @@ func (s *RepositorySuite) TestLogAll(c *C) {
cIter.Close()
}

func (s *RepositorySuite) TestLogAllMissingReferences(c *C) {
r, _ := Init(memory.NewStorage(), nil)
err := r.clone(context.Background(), &CloneOptions{
URL: s.GetBasicLocalRepositoryURL(),
})
c.Assert(err, IsNil)
err = r.Storer.RemoveReference(plumbing.HEAD)
c.Assert(err, IsNil)

rIter, err := r.Storer.IterReferences()
c.Assert(err, IsNil)

refCount := 0
err = rIter.ForEach(func(ref *plumbing.Reference) error {
refCount++
return nil
})
c.Assert(err, IsNil)
c.Assert(refCount, Equals, 4)

err = r.Storer.SetReference(plumbing.NewHashReference(plumbing.ReferenceName("DUMMY"), plumbing.NewHash("DUMMY")))
c.Assert(err, IsNil)

rIter, err = r.Storer.IterReferences()
c.Assert(err, IsNil)

refCount = 0
err = rIter.ForEach(func(ref *plumbing.Reference) error {
refCount++
return nil
})
c.Assert(err, IsNil)
c.Assert(refCount, Equals, 5)

cIter, err := r.Log(&LogOptions{
All: true,
})
c.Assert(cIter, NotNil)
c.Assert(err, IsNil)

cCount := 0
cIter.ForEach(func(c *object.Commit) error {
cCount++
return nil
})
c.Assert(cCount, Equals, 9)

_, err = cIter.Next()
c.Assert(err, Equals, io.EOF)
cIter.Close()
}

func (s *RepositorySuite) TestLogAllOrderByTime(c *C) {
r, _ := Init(memory.NewStorage(), nil)
err := r.clone(context.Background(), &CloneOptions{
Expand Down

0 comments on commit 4d8bd13

Please sign in to comment.