summaryrefslogtreecommitdiff
path: root/src/index.c
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2015-12-16 12:30:52 +0100
committerVicent Marti <tanoku@gmail.com>2015-12-16 12:30:52 +0100
commit879ebab314fe60cc737d436f62f190260ce13c1a (patch)
tree41d1fd8db670d5649959009eb6052da53595b932 /src/index.c
parent7f2c1469f8565fa8809c03aa7aa0ffae90a99c66 (diff)
downloadlibgit2-vmg/index-fill.tar.gz
merge: Use `git_index__fill` to populate the indexvmg/index-fill
Instead of calling `git_index_add` in a loop, use the new `git_index_fill` internal API to fill the index with the initial staged entries. The new `fill` helper assumes that all the entries will be unique and valid, so it can append them at the end of the entries vector and only sort it once at the end. It performs no validation checks. This prevents the quadratic behavior caused by having to sort the entries list once after every insertion.
Diffstat (limited to 'src/index.c')
-rw-r--r--src/index.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/index.c b/src/index.c
index 26cd83851..60e4d443c 100644
--- a/src/index.c
+++ b/src/index.c
@@ -1542,6 +1542,43 @@ int git_index_remove_bypath(git_index *index, const char *path)
return 0;
}
+int git_index__fill(git_index *index, const git_vector *source_entries)
+{
+ const git_index_entry *source_entry = NULL;
+ size_t i;
+ int ret = 0;
+
+ assert(index);
+
+ if (git_mutex_lock(&index->lock) < 0) {
+ giterr_set(GITERR_OS, "Unable to acquire index lock");
+ return -1;
+ }
+
+ git_vector_foreach(source_entries, i, source_entry) {
+ git_index_entry *entry = NULL;
+
+ if ((ret = index_entry_dup(&entry, index, source_entry)) < 0)
+ break;
+
+ entry->flags_extended |= GIT_IDXENTRY_UPTODATE;
+
+ ret = git_vector_insert(&index->entries, entry);
+ if (ret < 0)
+ break;
+
+ INSERT_IN_MAP(index, entry, ret);
+ if (ret < 0)
+ break;
+ }
+
+ if (!ret)
+ git_vector_sort(&index->entries);
+
+ git_mutex_unlock(&index->lock);
+ return ret;
+}
+
int git_index_add(git_index *index, const git_index_entry *source_entry)
{