summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tree.c15
-rw-r--r--src/tree.h1
2 files changed, 13 insertions, 3 deletions
diff --git a/src/tree.c b/src/tree.c
index 59bd92ab1..00f09fdce 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -355,7 +355,7 @@ size_t git_tree_entrycount(const git_tree *tree)
unsigned int git_treebuilder_entrycount(git_treebuilder *bld)
{
assert(bld);
- return (int)bld->entries.length;
+ return (unsigned int)bld->entrycount;
}
static int tree_error(const char *str, const char *path)
@@ -453,6 +453,7 @@ static int append_entry(
if (git_vector_insert(&bld->entries, entry) < 0)
return -1;
+ bld->entrycount++;
return 0;
}
@@ -642,14 +643,18 @@ int git_treebuilder_insert(
if (!tree_key_search(&pos, &bld->entries, filename, strlen(filename))) {
entry = git_vector_get(&bld->entries, pos);
- if (entry->removed)
+ if (entry->removed) {
entry->removed = 0;
+ bld->entrycount++;
+ }
} else {
entry = alloc_entry(filename);
GITERR_CHECK_ALLOC(entry);
if (git_vector_insert(&bld->entries, entry) < 0)
return -1;
+
+ bld->entrycount++;
}
git_oid_cpy(&entry->oid, id);
@@ -691,6 +696,7 @@ int git_treebuilder_remove(git_treebuilder *bld, const char *filename)
return tree_error("Failed to remove entry. File isn't in the tree", filename);
remove_ptr->removed = 1;
+ bld->entrycount--;
return 0;
}
@@ -747,8 +753,10 @@ void git_treebuilder_filter(
for (i = 0; i < bld->entries.length; ++i) {
git_tree_entry *entry = bld->entries.contents[i];
- if (!entry->removed && filter(entry, payload))
+ if (!entry->removed && filter(entry, payload)) {
entry->removed = 1;
+ bld->entrycount--;
+ }
}
}
@@ -763,6 +771,7 @@ void git_treebuilder_clear(git_treebuilder *bld)
}
git_vector_clear(&bld->entries);
+ bld->entrycount = 0;
}
void git_treebuilder_free(git_treebuilder *bld)
diff --git a/src/tree.h b/src/tree.h
index 27afd4fd4..567b5842d 100644
--- a/src/tree.h
+++ b/src/tree.h
@@ -27,6 +27,7 @@ struct git_tree {
struct git_treebuilder {
git_vector entries;
+ size_t entrycount; /* vector may contain "removed" entries */
};
GIT_INLINE(int) git_tree__dup(git_tree **dest, git_tree *source)