diff --git a/src/tree-cache.c b/src/tree-cache.c index aaf8a132c..b37be0f0d 100644 --- a/src/tree-cache.c +++ b/src/tree-cache.c @@ -191,8 +191,10 @@ static int read_tree_recursive(git_tree_cache *cache, const git_tree *tree, git_ git_tree *subtree; entry = git_tree_entry_byindex(tree, i); - if (git_tree_entry_filemode(entry) != GIT_FILEMODE_TREE) + if (git_tree_entry_filemode(entry) != GIT_FILEMODE_TREE) { + cache->entry_count++; continue; + } if ((error = git_tree_cache_new(&cache->children[j], git_tree_entry_name(entry), pool)) < 0) return error; @@ -202,6 +204,7 @@ static int read_tree_recursive(git_tree_cache *cache, const git_tree *tree, git_ error = read_tree_recursive(cache->children[j], subtree, pool); git_tree_free(subtree); + cache->entry_count += cache->children[j]->entry_count; j++; if (error < 0) @@ -245,35 +248,6 @@ int git_tree_cache_new(git_tree_cache **out, const char *name, git_pool *pool) return 0; } -/** - * Recursively recalculate the total entry count, which we need to - * write out to the index - */ -static void recount_entries(git_tree_cache *tree) -{ - size_t i; - ssize_t entry_count; - git_tree_cache *child; - - for (i = 0; i < tree->children_count; i++) - recount_entries(tree->children[i]); - - if (tree->entry_count == -1) - return; - - entry_count = 0; - for (i = 0; i < tree->children_count; i++) { - child = tree->children[i]; - - if (child->entry_count == -1) - continue; - - entry_count += tree->children[i]->children_count; - } - - tree->entry_count = entry_count; -} - static void write_tree(git_buf *out, git_tree_cache *tree) { size_t i; @@ -289,7 +263,6 @@ static void write_tree(git_buf *out, git_tree_cache *tree) int git_tree_cache_write(git_buf *out, git_tree_cache *tree) { - recount_entries(tree); write_tree(out, tree); return git_buf_oom(out) ? -1 : 0; diff --git a/tests/index/cache.c b/tests/index/cache.c index 17a61a9f5..de5cd8308 100644 --- a/tests/index/cache.c +++ b/tests/index/cache.c @@ -38,7 +38,7 @@ void test_index_cache__write_extension_at_root(void) cl_git_pass(git_index_open(&index, index_file)); cl_assert(index->tree); - cl_assert_equal_i(0, index->tree->entry_count); + cl_assert_equal_i(git_index_entrycount(index), index->tree->entry_count); cl_assert_equal_i(0, index->tree->children_count); cl_assert(git_oid_equal(&id, &index->tree->oid)); @@ -106,7 +106,7 @@ void test_index_cache__read_tree_no_children(void) cl_assert(index->tree); cl_assert(git_oid_equal(&id, &index->tree->oid)); cl_assert_equal_i(0, index->tree->children_count); - cl_assert_equal_i(0, index->tree->entry_count); /* 0 is a placeholder here */ + cl_assert_equal_i(git_index_entrycount(index), index->tree->entry_count); memset(&entry, 0x0, sizeof(git_index_entry)); entry.path = "new.txt"; @@ -169,7 +169,7 @@ void test_index_cache__two_levels(void) cl_assert_equal_i(1, index->tree->children_count); tree_cache = git_tree_cache_get(index->tree, "subdir"); cl_assert(tree_cache); - cl_assert_equal_i(0, tree_cache->entry_count); + cl_assert_equal_i(1, tree_cache->entry_count); } void test_index_cache__read_tree_children(void) @@ -226,11 +226,11 @@ void test_index_cache__read_tree_children(void) cache = git_tree_cache_get(index->tree, "subdir/even-deeper"); cl_assert(cache); - cl_assert_equal_i(0, cache->entry_count); + cl_assert_equal_i(1, cache->entry_count); cache = git_tree_cache_get(index->tree, "subdir2"); cl_assert(cache); - cl_assert_equal_i(0, cache->entry_count); + cl_assert_equal_i(1, cache->entry_count); git_index_free(index); }