@@ -2899,6 +2899,7 @@ int git_index_read_index(
2899
2899
{
2900
2900
git_vector new_entries = GIT_VECTOR_INIT ,
2901
2901
remove_entries = GIT_VECTOR_INIT ;
2902
+ git_idxmap * new_entries_map = NULL ;
2902
2903
git_iterator * index_iterator = NULL ;
2903
2904
git_iterator * new_iterator = NULL ;
2904
2905
git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT ;
@@ -2908,9 +2909,15 @@ int git_index_read_index(
2908
2909
int error ;
2909
2910
2910
2911
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 )
2912
2914
goto done ;
2913
2915
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
+
2914
2921
opts .flags = GIT_ITERATOR_DONT_IGNORE_CASE ;
2915
2922
2916
2923
if ((error = git_iterator_for_index (& index_iterator , index , & opts )) < 0 ||
@@ -2924,6 +2931,7 @@ int git_index_read_index(
2924
2931
goto done ;
2925
2932
2926
2933
while (true) {
2934
+ git_index_entry * add_entry = NULL , * remove_entry = NULL ;
2927
2935
int diff ;
2928
2936
2929
2937
if (old_entry && new_entry )
@@ -2936,27 +2944,37 @@ int git_index_read_index(
2936
2944
break ;
2937
2945
2938
2946
if (diff < 0 ) {
2939
- git_vector_insert ( & remove_entries , (git_index_entry * )old_entry ) ;
2947
+ remove_entry = (git_index_entry * )old_entry ;
2940
2948
} 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 )
2942
2950
goto done ;
2943
-
2944
- git_vector_insert (& new_entries , entry );
2945
2951
} else {
2946
2952
/* Path and stage are equal, if the OID is equal, keep it to
2947
2953
* keep the stat cache data.
2948
2954
*/
2949
2955
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 ;
2951
2957
} else {
2952
- if ((error = index_entry_dup (& entry , index , new_entry )) < 0 )
2958
+ if ((error = index_entry_dup (& add_entry , index , new_entry )) < 0 )
2953
2959
goto done ;
2954
2960
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 ;
2957
2962
}
2958
2963
}
2959
2964
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
+
2960
2978
if (diff <= 0 ) {
2961
2979
if ((error = git_iterator_advance (& old_entry , index_iterator )) < 0 &&
2962
2980
error != GIT_ITEROVER )
@@ -2974,6 +2992,7 @@ int git_index_read_index(
2974
2992
git_index_reuc_clear (index );
2975
2993
2976
2994
git_vector_swap (& new_entries , & index -> entries );
2995
+ new_entries_map = git__swap (index -> entries_map , new_entries_map );
2977
2996
2978
2997
git_vector_foreach (& remove_entries , i , entry ) {
2979
2998
if (index -> tree )
@@ -2985,6 +3004,7 @@ int git_index_read_index(
2985
3004
error = 0 ;
2986
3005
2987
3006
done :
3007
+ git_idxmap_free (new_entries_map );
2988
3008
git_vector_free (& new_entries );
2989
3009
git_vector_free (& remove_entries );
2990
3010
git_iterator_free (index_iterator );
0 commit comments