@@ -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
29873006done :
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