Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d571a54

Browse files
committed
Merge pull request libgit2#3493 from ethomson/read_index
index: read_index must update hashes
2 parents e0be1d6 + 0bf77e3 commit d571a54

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

src/index.c

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2899,6 +2899,7 @@ int git_index_read_index(
28992899
{
29002900
git_vector new_entries = GIT_VECTOR_INIT,
29012901
remove_entries = GIT_VECTOR_INIT;
2902+
git_idxmap *new_entries_map = NULL;
29022903
git_iterator *index_iterator = NULL;
29032904
git_iterator *new_iterator = NULL;
29042905
git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT;
@@ -2908,9 +2909,15 @@ int git_index_read_index(
29082909
int error;
29092910

29102911
if ((error = git_vector_init(&new_entries, new_index->entries.length, index->entries._cmp)) < 0 ||
2911-
(error = git_vector_init(&remove_entries, index->entries.length, NULL)) < 0)
2912+
(error = git_vector_init(&remove_entries, index->entries.length, NULL)) < 0 ||
2913+
(error = git_idxmap_alloc(&new_entries_map)) < 0)
29122914
goto done;
29132915

2916+
if (index->ignore_case)
2917+
kh_resize(idxicase, (khash_t(idxicase) *) new_entries_map, new_index->entries.length);
2918+
else
2919+
kh_resize(idx, new_entries_map, new_index->entries.length);
2920+
29142921
opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
29152922

29162923
if ((error = git_iterator_for_index(&index_iterator, index, &opts)) < 0 ||
@@ -2924,6 +2931,7 @@ int git_index_read_index(
29242931
goto done;
29252932

29262933
while (true) {
2934+
git_index_entry *add_entry = NULL, *remove_entry = NULL;
29272935
int diff;
29282936

29292937
if (old_entry && new_entry)
@@ -2936,27 +2944,37 @@ int git_index_read_index(
29362944
break;
29372945

29382946
if (diff < 0) {
2939-
git_vector_insert(&remove_entries, (git_index_entry *)old_entry);
2947+
remove_entry = (git_index_entry *)old_entry;
29402948
} else if (diff > 0) {
2941-
if ((error = index_entry_dup(&entry, index, new_entry)) < 0)
2949+
if ((error = index_entry_dup(&add_entry, index, new_entry)) < 0)
29422950
goto done;
2943-
2944-
git_vector_insert(&new_entries, entry);
29452951
} else {
29462952
/* Path and stage are equal, if the OID is equal, keep it to
29472953
* keep the stat cache data.
29482954
*/
29492955
if (git_oid_equal(&old_entry->id, &new_entry->id)) {
2950-
git_vector_insert(&new_entries, (git_index_entry *)old_entry);
2956+
add_entry = (git_index_entry *)old_entry;
29512957
} else {
2952-
if ((error = index_entry_dup(&entry, index, new_entry)) < 0)
2958+
if ((error = index_entry_dup(&add_entry, index, new_entry)) < 0)
29532959
goto done;
29542960

2955-
git_vector_insert(&new_entries, entry);
2956-
git_vector_insert(&remove_entries, (git_index_entry *)old_entry);
2961+
remove_entry = (git_index_entry *)old_entry;
29572962
}
29582963
}
29592964

2965+
if (add_entry) {
2966+
if ((error = git_vector_insert(&new_entries, add_entry)) == 0)
2967+
INSERT_IN_MAP_EX(index, new_entries_map, add_entry, error);
2968+
}
2969+
2970+
if (remove_entry && !error)
2971+
error = git_vector_insert(&remove_entries, remove_entry);
2972+
2973+
if (error < 0) {
2974+
giterr_set(GITERR_INDEX, "failed to insert entry");
2975+
return error;
2976+
}
2977+
29602978
if (diff <= 0) {
29612979
if ((error = git_iterator_advance(&old_entry, index_iterator)) < 0 &&
29622980
error != GIT_ITEROVER)
@@ -2974,6 +2992,7 @@ int git_index_read_index(
29742992
git_index_reuc_clear(index);
29752993

29762994
git_vector_swap(&new_entries, &index->entries);
2995+
new_entries_map = git__swap(index->entries_map, new_entries_map);
29772996

29782997
git_vector_foreach(&remove_entries, i, entry) {
29792998
if (index->tree)
@@ -2985,6 +3004,7 @@ int git_index_read_index(
29853004
error = 0;
29863005

29873006
done:
3007+
git_idxmap_free(new_entries_map);
29883008
git_vector_free(&new_entries);
29893009
git_vector_free(&remove_entries);
29903010
git_iterator_free(index_iterator);

0 commit comments

Comments
 (0)