Commit f824259e674e6fa483f0b6651beff2d82127be6f

Carlos Martín Nieto 2015-12-16T15:18:42

Merge pull request #3549 from libgit2/vmg/index-fill merge: Use `git_index__fill` to populate the index

diff --git a/src/index.c b/src/index.c
index 26cd838..60e4d44 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)
 {
diff --git a/src/index.h b/src/index.h
index 9baf976..0909da8 100644
--- a/src/index.h
+++ b/src/index.h
@@ -113,6 +113,8 @@ GIT_INLINE(bool) git_index_entry_newer_than_index(
 extern int git_index__find_pos(
 	size_t *at_pos, git_index *index, const char *path, size_t path_len, int stage);
 
+extern int git_index__fill(git_index *index, const git_vector *source_entries);
+
 extern void git_index__set_ignore_case(git_index *index, bool ignore_case);
 
 extern unsigned int git_index__create_mode(unsigned int mode);
diff --git a/src/merge.c b/src/merge.c
index 9eb3b09..61ff93c 100644
--- a/src/merge.c
+++ b/src/merge.c
@@ -1739,7 +1739,6 @@ static int index_from_diff_list(git_index **out,
 {
 	git_index *index;
 	size_t i;
-	git_index_entry *entry;
 	git_merge_diff *conflict;
 	int error = 0;
 
@@ -1748,10 +1747,8 @@ static int index_from_diff_list(git_index **out,
 	if ((error = git_index_new(&index)) < 0)
 		return error;
 
-	git_vector_foreach(&diff_list->staged, i, entry) {
-		if ((error = git_index_add(index, entry)) < 0)
-			goto on_error;
-	}
+	if ((error = git_index__fill(index, &diff_list->staged)) < 0)
+		goto on_error;
 
 	git_vector_foreach(&diff_list->conflicts, i, conflict) {
 		const git_index_entry *ancestor =