diff options
-rw-r--r-- | include/git2/tree.h | 5 | ||||
-rw-r--r-- | src/tree.c | 11 |
2 files changed, 11 insertions, 5 deletions
diff --git a/include/git2/tree.h b/include/git2/tree.h index b91340624..85407d7ac 100644 --- a/include/git2/tree.h +++ b/include/git2/tree.h @@ -351,8 +351,9 @@ enum git_treewalk_mode { * the current (relative) root for the entry and the entry * data itself. * - * If the callback returns a negative value, the passed entry - * will be skipped on the traversal. + * If the callback returns a positive value, the passed entry will be + * skipped on the traversal (in pre mode). A negative value stops the + * walk. * * @param tree The tree to walk * @param callback Function to call on each tree entry diff --git a/src/tree.c b/src/tree.c index 911cbadcf..19250fe5e 100644 --- a/src/tree.c +++ b/src/tree.c @@ -787,8 +787,13 @@ static int tree_walk( for (i = 0; i < tree->entries.length; ++i) { git_tree_entry *entry = tree->entries.contents[i]; - if (preorder && callback(path->ptr, entry, payload) < 0) - continue + if (preorder) { + error = callback(path->ptr, entry, payload); + if (error > 0) + continue; + if (error < 0) + return GIT_EUSER; + } if (git_tree_entry__is_tree(entry)) { git_tree *subtree; @@ -813,7 +818,7 @@ static int tree_walk( git_tree_free(subtree); } - if (!preorder && callback(path->ptr, entry, payload)) { + if (!preorder && callback(path->ptr, entry, payload) < 0) { error = GIT_EUSER; break; } |