@@ -2925,38 +2925,38 @@ int git_index_read_tree(git_index *index, const git_tree *tree)
29252925 return error ;
29262926}
29272927
2928- int git_index_read_index (
2928+ static int git_index_read_iterator (
29292929 git_index * index ,
2930- const git_index * new_index )
2930+ git_iterator * new_iterator ,
2931+ size_t new_length_hint )
29312932{
29322933 git_vector new_entries = GIT_VECTOR_INIT ,
29332934 remove_entries = GIT_VECTOR_INIT ;
29342935 git_idxmap * new_entries_map = NULL ;
29352936 git_iterator * index_iterator = NULL ;
2936- git_iterator * new_iterator = NULL ;
29372937 git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT ;
29382938 const git_index_entry * old_entry , * new_entry ;
29392939 git_index_entry * entry ;
29402940 size_t i ;
29412941 int error ;
29422942
2943- if ((error = git_vector_init (& new_entries , new_index -> entries .length , index -> entries ._cmp )) < 0 ||
2943+ assert ((new_iterator -> flags & GIT_ITERATOR_DONT_IGNORE_CASE ));
2944+
2945+ if ((error = git_vector_init (& new_entries , new_length_hint , index -> entries ._cmp )) < 0 ||
29442946 (error = git_vector_init (& remove_entries , index -> entries .length , NULL )) < 0 ||
29452947 (error = git_idxmap_alloc (& new_entries_map )) < 0 )
29462948 goto done ;
29472949
2948- if (index -> ignore_case )
2949- kh_resize (idxicase , (khash_t (idxicase ) * ) new_entries_map , new_index -> entries . length );
2950- else
2951- kh_resize (idx , new_entries_map , new_index -> entries . length );
2950+ if (index -> ignore_case && new_length_hint )
2951+ kh_resize (idxicase , (khash_t (idxicase ) * ) new_entries_map , new_length_hint );
2952+ else if ( new_length_hint )
2953+ kh_resize (idx , new_entries_map , new_length_hint );
29522954
29532955 opts .flags = GIT_ITERATOR_DONT_IGNORE_CASE ;
29542956
2955- if ((error = git_iterator_for_index (& index_iterator , git_index_owner (index ), index , & opts )) < 0 ||
2956- (error = git_iterator_for_index (& new_iterator , git_index_owner (new_index ), (git_index * )new_index , & opts )) < 0 )
2957- goto done ;
2958-
2959- if (((error = git_iterator_current (& old_entry , index_iterator )) < 0 &&
2957+ if ((error = git_iterator_for_index (& index_iterator ,
2958+ git_index_owner (index ), index , & opts )) < 0 ||
2959+ ((error = git_iterator_current (& old_entry , index_iterator )) < 0 &&
29602960 error != GIT_ITEROVER ) ||
29612961 ((error = git_iterator_current (& new_entry , new_iterator )) < 0 &&
29622962 error != GIT_ITEROVER ))
@@ -3050,13 +3050,36 @@ int git_index_read_index(
30503050 index_entry_free (entry );
30513051 }
30523052
3053+ clear_uptodate (index );
3054+
30533055 error = 0 ;
30543056
30553057done :
30563058 git_idxmap_free (new_entries_map );
30573059 git_vector_free (& new_entries );
30583060 git_vector_free (& remove_entries );
30593061 git_iterator_free (index_iterator );
3062+ return error ;
3063+ }
3064+
3065+ int git_index_read_index (
3066+ git_index * index ,
3067+ const git_index * new_index )
3068+ {
3069+ git_iterator * new_iterator = NULL ;
3070+ git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT ;
3071+ int error ;
3072+
3073+ opts .flags = GIT_ITERATOR_DONT_IGNORE_CASE ;
3074+
3075+ if ((error = git_iterator_for_index (& new_iterator ,
3076+ git_index_owner (new_index ), (git_index * )new_index , & opts )) < 0 )
3077+ goto done ;
3078+
3079+ error = git_index_read_iterator (index , new_iterator ,
3080+ new_index -> entries .length );
3081+
3082+ done :
30603083 git_iterator_free (new_iterator );
30613084 return error ;
30623085}
0 commit comments