diff options
| -rw-r--r-- | src/tree-cache.c | 48 | ||||
| -rw-r--r-- | src/tree-cache.h | 1 |
2 files changed, 48 insertions, 1 deletions
diff --git a/src/tree-cache.c b/src/tree-cache.c index 2e6e5f103..026ede0cc 100644 --- a/src/tree-cache.c +++ b/src/tree-cache.c @@ -7,10 +7,56 @@ #include "tree-cache.h" +static git_tree_cache *find_child(git_tree_cache *tree, const char *path) +{ + size_t i, dirlen; + const char *end; + + end = strchr(path, '/'); + if (end == NULL) { + end = strrchr(path, '\0'); + } + + dirlen = end - path; + + for (i = 0; i < tree->children_count; ++i) { + const char *childname = tree->children[i]->name; + + if (strlen(childname) == dirlen && !memcmp(path, childname, dirlen)) + return tree->children[i]; + } + + return NULL; +} + +void git_tree_cache_invalidate_path(git_tree_cache *tree, const char *path) +{ + const char *ptr = path, *end; + + if (tree == NULL) + return; + + tree->entries = -1; + + while (ptr != NULL) { + end = strchr(ptr, '/'); + + if (end == NULL) /* End of path */ + break; + + tree = find_child(tree, ptr); + if (tree == NULL) /* We don't have that tree */ + return; + + tree->entries = -1; + ptr = end + 1; + } +} + static int read_tree_internal(git_tree_cache **out, const char **buffer_in, const char *buffer_end, git_tree_cache *parent) { - git_tree_cache *tree; + git_tree_cache *tree = NULL; const char *name_start, *buffer; int count; int error = GIT_SUCCESS; diff --git a/src/tree-cache.h b/src/tree-cache.h index 1a5d40613..450b03803 100644 --- a/src/tree-cache.h +++ b/src/tree-cache.h @@ -24,6 +24,7 @@ struct git_tree_cache { typedef struct git_tree_cache git_tree_cache; 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_free(git_tree_cache *tree); #endif |
