Commit 729b6f490068642f35ca933ef44830fda11b6aef

Jakob Pfender 2011-04-21T10:40:54

index: Allow user to toggle whether to replace an index entry When in the middle of a merge, the index needs to contain several files with the same name. git_index_insert() used to prevent this by not adding a new entry if an entry with the same name already existed.

diff --git a/include/git2/index.h b/include/git2/index.h
index 8a84f50..adc4cb4 100644
--- a/include/git2/index.h
+++ b/include/git2/index.h
@@ -203,15 +203,16 @@ GIT_EXTERN(int) git_index_remove(git_index *index, int position);
 /**
  * Insert an entry into the index.
  * A full copy (including the 'path' string) of the given
- * 'source_entry' will be inserted on the index; if the index
- * already contains an entry for the same path, the entry
- * will be updated.
+ * 'source_entry' will be inserted on the index; if the
+ * replace flag is not set and the index already contains
+ * an entry for the same path, the entry will be updated.
  *
  * @param index an existing index object
  * @param source_entry new entry object
+ * @param replace if set, existing entries will be replaced
  * @return 0 on success, otherwise an error code
  */
-GIT_EXTERN(int) git_index_insert(git_index *index, const git_index_entry *source_entry);
+GIT_EXTERN(int) git_index_insert(git_index *index, const git_index_entry *source_entry, int replace);
 
 /**
  * Get a pointer to one of the entries in the index
diff --git a/src/index.c b/src/index.c
index 68bb9e2..c066d24 100644
--- a/src/index.c
+++ b/src/index.c
@@ -330,7 +330,7 @@ int git_index_add(git_index *index, const char *rel_path, int stage)
 	entry.flags |= (stage << GIT_IDXENTRY_STAGESHIFT);
 	entry.path = (char *)rel_path; /* do not duplicate; index_insert already does this */
 
-	return git_index_insert(index, &entry);
+	return git_index_insert(index, &entry, 1);
 }
 
 void sort_index(git_index *index)
@@ -338,7 +338,7 @@ void sort_index(git_index *index)
 	git_vector_sort(&index->entries);
 }
 
-int git_index_insert(git_index *index, const git_index_entry *source_entry)
+int git_index_insert(git_index *index, const git_index_entry *source_entry, int replace)
 {
 	git_index_entry *entry;
 	size_t path_length;
@@ -374,13 +374,15 @@ int git_index_insert(git_index *index, const git_index_entry *source_entry)
 	/* look if an entry with this path already exists */
 	position = git_index_find(index, source_entry->path);
 
-	/* if no entry exists, add the entry at the end;
+	/* if no entry exists and replace is not set,
+	 * add the entry at the end;
 	 * the index is no longer sorted */
-	if (position == GIT_ENOTFOUND) {
+	if (!replace || position == GIT_ENOTFOUND) {
 		if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS)
 			return GIT_ENOMEM;
 
-	/* if a previous entry exists, replace it */
+	/* if a previous entry exists and replace is set,
+	 * replace it */
 	} else {
 		git_index_entry **entry_array = (git_index_entry **)index->entries.contents;