Commit 89244e7ff9755657b96d733b6936cecbd4e2ef0c

Edward Thomson 2014-10-22T14:45:36

Merge pull request #2634 from libgit2/cmn/tree-cache-count tree-cache: correct the entry_count calculation

diff --git a/src/tree-cache.c b/src/tree-cache.c
index aaf8a13..b37be0f 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 17a61a9..de5cd83 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);
 }