diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2016-08-30 11:29:47 +0200 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2016-08-30 11:29:47 +0200 |
commit | 2c527d02ceac3879f82ab53645b6c7c03c0e5d71 (patch) | |
tree | ebdd08843d1f5c6df7dff366ad5de8b4b2977e8c /tree_walker.go | |
parent | d47285fa6e39399f639d8a9c3209d7d9bfb63ce4 (diff) | |
download | go-git-2c527d02ceac3879f82ab53645b6c7c03c0e5d71.tar.gz |
TreeWalker optimization
Diffstat (limited to 'tree_walker.go')
-rw-r--r-- | tree_walker.go | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/tree_walker.go b/tree_walker.go index d4aa01a..cbd81c4 100644 --- a/tree_walker.go +++ b/tree_walker.go @@ -43,7 +43,8 @@ func NewTreeWalker(r *Repository, t *Tree) *TreeWalker { // In the current implementation any objects which cannot be found in the // underlying repository will be skipped automatically. It is possible that this // may change in future versions. -func (w *TreeWalker) Next() (name string, entry TreeEntry, obj Object, err error) { +func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) { + var obj Object for { current := len(w.stack) - 1 if current < 0 { @@ -51,6 +52,7 @@ func (w *TreeWalker) Next() (name string, entry TreeEntry, obj Object, err error err = io.EOF return } + if current > maxTreeDepth { // We're probably following bad data or some self-referencing tree err = ErrMaxTreeDepth @@ -65,6 +67,7 @@ func (w *TreeWalker) Next() (name string, entry TreeEntry, obj Object, err error w.base = path.Clean(w.base) // Remove trailing slash continue } + if err != nil { return } @@ -73,10 +76,9 @@ func (w *TreeWalker) Next() (name string, entry TreeEntry, obj Object, err error err = nil continue } + if entry.Mode.IsDir() { obj, err = w.r.Tree(entry.Hash) - } else { - obj, err = w.r.Blob(entry.Hash) } name = path.Join(w.base, entry.Name) |