From 0debae11c26dca0e50a56f2b9a3b5e8cca99faac Mon Sep 17 00:00:00 2001 From: Miguel Molina Date: Fri, 8 Sep 2017 11:09:41 +0200 Subject: revert: revlist: do not revisit already visited ancestors Signed-off-by: Miguel Molina --- plumbing/revlist/revlist.go | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/plumbing/revlist/revlist.go b/plumbing/revlist/revlist.go index 3071584..10a5813 100644 --- a/plumbing/revlist/revlist.go +++ b/plumbing/revlist/revlist.go @@ -37,7 +37,6 @@ func objects( ) ([]plumbing.Hash, error) { seen := hashListToSet(ignore) result := make(map[plumbing.Hash]bool) - visited := make(map[plumbing.Hash]bool) walkerFunc := func(h plumbing.Hash) { if !seen[h] { @@ -47,7 +46,7 @@ func objects( } for _, h := range objects { - if err := processObject(s, h, seen, visited, ignore, walkerFunc); err != nil { + if err := processObject(s, h, seen, ignore, walkerFunc); err != nil { if allowMissingObjects && err == plumbing.ErrObjectNotFound { continue } @@ -64,7 +63,6 @@ func processObject( s storer.EncodedObjectStorer, h plumbing.Hash, seen map[plumbing.Hash]bool, - visited map[plumbing.Hash]bool, ignore []plumbing.Hash, walkerFunc func(h plumbing.Hash), ) error { @@ -84,12 +82,12 @@ func processObject( switch do := do.(type) { case *object.Commit: - return reachableObjects(do, seen, visited, ignore, walkerFunc) + return reachableObjects(do, seen, ignore, walkerFunc) case *object.Tree: return iterateCommitTrees(seen, do, walkerFunc) case *object.Tag: walkerFunc(do.Hash) - return processObject(s, do.Target, seen, visited, ignore, walkerFunc) + return processObject(s, do.Target, seen, ignore, walkerFunc) case *object.Blob: walkerFunc(do.Hash) default: @@ -104,14 +102,9 @@ func processObject( // objects from the specified commit. To avoid to iterate over seen commits, // if a commit hash is into the 'seen' set, we will not iterate all his trees // and blobs objects. -// We assume all commits have the same parents, unless a commit has no parents. -// So when we've visited a commit before, we can stop iterating commits, as we've -// already processed all its ancestors before as well. `visited` keeps track of -// all the commits that have been visited that had parents. func reachableObjects( commit *object.Commit, seen map[plumbing.Hash]bool, - visited map[plumbing.Hash]bool, ignore []plumbing.Hash, cb func(h plumbing.Hash), ) error { @@ -126,18 +119,11 @@ func reachableObjects( return err } - if visited[commit.Hash] { - break - } - if seen[commit.Hash] { continue } cb(commit.Hash) - if commit.NumParents() > 0 { - visited[commit.Hash] = true - } tree, err := commit.Tree() if err != nil { -- cgit