summaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/tree.c b/src/tree.c
index bb59ff82b..4d77ff778 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -884,22 +884,22 @@ static int tree_walk(
git_vector_foreach(&tree->entries, i, entry) {
if (preorder) {
error = callback(path->ptr, entry, payload);
- if (error > 0) {
+ if (error < 0) { /* negative value stops iteration */
+ giterr_set_after_callback_function(error, "git_tree_walk");
+ break;
+ }
+ if (error > 0) { /* positive value skips this entry */
error = 0;
continue;
}
- if (error < 0) {
- giterr_clear();
- return GIT_EUSER;
- }
}
if (git_tree_entry__is_tree(entry)) {
git_tree *subtree;
size_t path_len = git_buf_len(path);
- if ((error = git_tree_lookup(
- &subtree, tree->object.repo, &entry->oid)) < 0)
+ error = git_tree_lookup(&subtree, tree->object.repo, &entry->oid);
+ if (error < 0)
break;
/* append the next entry to the path */
@@ -907,21 +907,24 @@ static int tree_walk(
git_buf_putc(path, '/');
if (git_buf_oom(path))
- return -1;
+ error = -1;
+ else
+ error = tree_walk(subtree, callback, path, payload, preorder);
- error = tree_walk(subtree, callback, path, payload, preorder);
git_tree_free(subtree);
-
if (error != 0)
break;
git_buf_truncate(path, path_len);
}
- if (!preorder && callback(path->ptr, entry, payload) < 0) {
- giterr_clear();
- error = GIT_EUSER;
- break;
+ if (!preorder) {
+ error = callback(path->ptr, entry, payload);
+ if (error < 0) { /* negative value stops iteration */
+ giterr_set_after_callback_function(error, "git_tree_walk");
+ break;
+ }
+ error = 0;
}
}