Commit 729b6f49 by Jakob Pfender

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.
parent fee4c425
...@@ -203,15 +203,16 @@ GIT_EXTERN(int) git_index_remove(git_index *index, int position); ...@@ -203,15 +203,16 @@ GIT_EXTERN(int) git_index_remove(git_index *index, int position);
/** /**
* Insert an entry into the index. * Insert an entry into the index.
* A full copy (including the 'path' string) of the given * A full copy (including the 'path' string) of the given
* 'source_entry' will be inserted on the index; if the index * 'source_entry' will be inserted on the index; if the
* already contains an entry for the same path, the entry * replace flag is not set and the index already contains
* will be updated. * an entry for the same path, the entry will be updated.
* *
* @param index an existing index object * @param index an existing index object
* @param source_entry new entry object * @param source_entry new entry object
* @param replace if set, existing entries will be replaced
* @return 0 on success, otherwise an error code * @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 * Get a pointer to one of the entries in the index
......
...@@ -330,7 +330,7 @@ int git_index_add(git_index *index, const char *rel_path, int stage) ...@@ -330,7 +330,7 @@ int git_index_add(git_index *index, const char *rel_path, int stage)
entry.flags |= (stage << GIT_IDXENTRY_STAGESHIFT); entry.flags |= (stage << GIT_IDXENTRY_STAGESHIFT);
entry.path = (char *)rel_path; /* do not duplicate; index_insert already does this */ 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) void sort_index(git_index *index)
...@@ -338,7 +338,7 @@ void sort_index(git_index *index) ...@@ -338,7 +338,7 @@ void sort_index(git_index *index)
git_vector_sort(&index->entries); 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; git_index_entry *entry;
size_t path_length; size_t path_length;
...@@ -374,13 +374,15 @@ int git_index_insert(git_index *index, const git_index_entry *source_entry) ...@@ -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 */ /* look if an entry with this path already exists */
position = git_index_find(index, source_entry->path); 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 */ * the index is no longer sorted */
if (position == GIT_ENOTFOUND) { if (!replace || position == GIT_ENOTFOUND) {
if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS) if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS)
return GIT_ENOMEM; return GIT_ENOMEM;
/* if a previous entry exists, replace it */ /* if a previous entry exists and replace is set,
* replace it */
} else { } else {
git_index_entry **entry_array = (git_index_entry **)index->entries.contents; git_index_entry **entry_array = (git_index_entry **)index->entries.contents;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment