Add git_tree_cache_get

Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
This commit is contained in:
Carlos Martín Nieto 2011-08-02 15:27:42 +02:00 committed by Vicent Marti
parent b419fe2d8c
commit 3ba69ba8a4
2 changed files with 25 additions and 1 deletions

View File

@ -7,7 +7,7 @@
#include "tree-cache.h" #include "tree-cache.h"
static git_tree_cache *find_child(git_tree_cache *tree, const char *path) static git_tree_cache *find_child(const git_tree_cache *tree, const char *path)
{ {
size_t i, dirlen; size_t i, dirlen;
const char *end; const char *end;
@ -53,6 +53,29 @@ void git_tree_cache_invalidate_path(git_tree_cache *tree, const char *path)
} }
} }
const git_tree_cache *git_tree_cache_get(const git_tree_cache *tree, const char *path)
{
const char *ptr = path, *end;
if (tree == NULL) {
return NULL;
}
while (1) {
end = strchr(ptr, '/');
tree = find_child(tree, ptr);
if (tree == NULL) { /* Can't find it */
return NULL;
}
if (end == NULL || end + 1 == '\0')
return tree;
ptr = end + 1;
}
}
static int read_tree_internal(git_tree_cache **out, static int read_tree_internal(git_tree_cache **out,
const char **buffer_in, const char *buffer_end, git_tree_cache *parent) const char **buffer_in, const char *buffer_end, git_tree_cache *parent)
{ {

View File

@ -25,6 +25,7 @@ typedef struct git_tree_cache git_tree_cache;
int git_tree_cache_read(git_tree_cache **tree, const char *buffer, size_t buffer_size); int git_tree_cache_read(git_tree_cache **tree, const char *buffer, size_t buffer_size);
void git_tree_cache_invalidate_path(git_tree_cache *tree, const char *path); void git_tree_cache_invalidate_path(git_tree_cache *tree, const char *path);
const git_tree_cache *git_tree_cache_get(const git_tree_cache *tree, const char *path);
void git_tree_cache_free(git_tree_cache *tree); void git_tree_cache_free(git_tree_cache *tree);
#endif #endif