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 e5858b50e..19250fe5e 100644 --- a/src/tree.c +++ b/src/tree.c @@ -787,9 +787,12 @@ 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)) { - error = GIT_EUSER; - break; + 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)) { @@ -815,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; }