diff options
author | Vicent Marti <tanoku@gmail.com> | 2012-08-06 12:41:08 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2012-08-06 12:41:08 +0200 |
commit | 51e1d8084641bd36416bf6f127b31d47d64cce69 (patch) | |
tree | 1a95e6b4c664020eb4bbff843eead794f3ee3d35 /src/tree.c | |
parent | 7e9f78b5fee2d8f56711a587c35fcba10d370547 (diff) | |
parent | b0d376695e7d3f71fed97d9d08b60661faad7a5a (diff) | |
download | libgit2-51e1d8084641bd36416bf6f127b31d47d64cce69.tar.gz |
Merge remote-tracking branch 'arrbee/tree-walk-fixes' into development
Conflicts:
src/notes.c
src/transports/git.c
src/transports/http.c
src/transports/local.c
tests-clar/odb/foreach.c
Diffstat (limited to 'src/tree.c')
-rw-r--r-- | src/tree.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/src/tree.c b/src/tree.c index 086ef111a..e5858b50e 100644 --- a/src/tree.c +++ b/src/tree.c @@ -240,6 +240,21 @@ const git_tree_entry *git_tree_entry_byindex(git_tree *tree, size_t idx) return git_vector_get(&tree->entries, idx); } +const git_tree_entry *git_tree_entry_byoid(git_tree *tree, const git_oid *oid) +{ + unsigned int i; + git_tree_entry *e; + + assert(tree); + + git_vector_foreach(&tree->entries, i, e) { + if (memcmp(&e->oid.id, &oid->id, sizeof(oid->id)) == 0) + return e; + } + + return NULL; +} + int git_tree__prefix_position(git_tree *tree, const char *path) { git_vector *entries = &tree->entries; @@ -724,7 +739,7 @@ int git_tree_entry_bypath( } switch (path[filename_len]) { - case '/': + case '/': /* If there are more components in the path... * then this entry *must* be a tree */ if (!git_tree_entry__is_tree(entry)) { @@ -772,8 +787,10 @@ 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) - return -1; + if (preorder && callback(path->ptr, entry, payload)) { + error = GIT_EUSER; + break; + } if (git_tree_entry__is_tree(entry)) { git_tree *subtree; @@ -790,18 +807,21 @@ static int tree_walk( if (git_buf_oom(path)) return -1; - if (tree_walk(subtree, callback, path, payload, preorder) < 0) - return -1; + error = tree_walk(subtree, callback, path, payload, preorder); + if (error != 0) + break; git_buf_truncate(path, path_len); git_tree_free(subtree); } - if (!preorder && callback(path->ptr, entry, payload) < 0) - return -1; + if (!preorder && callback(path->ptr, entry, payload)) { + error = GIT_EUSER; + break; + } } - return 0; + return error; } int git_tree_walk(git_tree *tree, git_treewalk_cb callback, int mode, void *payload) |