@@ -134,7 +134,7 @@ static void replace_index_entry(struct index_state *istate, int nr, struct cache
134
134
135
135
void rename_index_entry_at (struct index_state * istate , int nr , const char * new_name )
136
136
{
137
- struct cache_entry * old_entry = istate -> cache [nr ], * new_entry ;
137
+ struct cache_entry * old_entry = istate -> cache [nr ], * new_entry , * refreshed ;
138
138
int namelen = strlen (new_name );
139
139
140
140
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
147
147
cache_tree_invalidate_path (istate , old_entry -> name );
148
148
untracked_cache_remove_from_index (istate , old_entry -> name );
149
149
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 );
151
164
}
152
165
153
166
void fill_stat_data (struct stat_data * sd , struct stat * st )
0 commit comments