@@ -134,7 +134,7 @@ static void replace_index_entry(struct index_state *istate, int nr, struct cache
134134
135135void rename_index_entry_at (struct index_state * istate , int nr , const char * new_name )
136136{
137- struct cache_entry * old_entry = istate -> cache [nr ], * new_entry ;
137+ struct cache_entry * old_entry = istate -> cache [nr ], * new_entry , * refreshed ;
138138 int namelen = strlen (new_name );
139139
140140 new_entry = make_empty_cache_entry (istate , namelen );
@@ -147,7 +147,20 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n
147147 cache_tree_invalidate_path (istate , old_entry -> name );
148148 untracked_cache_remove_from_index (istate , old_entry -> name );
149149 remove_index_entry_at (istate , nr );
150- add_index_entry (istate , new_entry , ADD_CACHE_OK_TO_ADD |ADD_CACHE_OK_TO_REPLACE );
150+
151+ /*
152+ * Refresh the new index entry. Using 'refresh_cache_entry' ensures
153+ * we only update stat info if the entry is otherwise up-to-date (i.e.,
154+ * the contents/mode haven't changed). This ensures that we reflect the
155+ * 'ctime' of the rename in the index without (incorrectly) updating
156+ * the cached stat info to reflect unstaged changes on disk.
157+ */
158+ refreshed = refresh_cache_entry (istate , new_entry , CE_MATCH_REFRESH );
159+ if (refreshed && refreshed != new_entry ) {
160+ add_index_entry (istate , refreshed , ADD_CACHE_OK_TO_ADD |ADD_CACHE_OK_TO_REPLACE );
161+ discard_cache_entry (new_entry );
162+ } else
163+ add_index_entry (istate , new_entry , ADD_CACHE_OK_TO_ADD |ADD_CACHE_OK_TO_REPLACE );
151164}
152165
153166void fill_stat_data (struct stat_data * sd , struct stat * st )
0 commit comments