@@ -1127,14 +1127,65 @@ static int verify_clean_subdirectory(struct cache_entry *ce,
11271127 * See if we can find a case-insensitive match in the index that also
11281128 * matches the stat information, and assume it's that other file!
11291129 */
1130- static int icase_exists (struct unpack_trees_options * o , struct cache_entry * dst , struct stat * st )
1130+ static int icase_exists (struct unpack_trees_options * o , const char * name , int len , struct stat * st )
11311131{
11321132 struct cache_entry * src ;
11331133
1134- src = index_name_exists (o -> src_index , dst -> name , ce_namelen ( dst ) , 1 );
1134+ src = index_name_exists (o -> src_index , name , len , 1 );
11351135 return src && !ie_match_stat (o -> src_index , src , st , CE_MATCH_IGNORE_VALID |CE_MATCH_IGNORE_SKIP_WORKTREE );
11361136}
11371137
1138+ static int check_ok_to_remove (const char * name , int len , int dtype ,
1139+ struct cache_entry * ce , struct stat * st ,
1140+ enum unpack_trees_error_types error_type ,
1141+ struct unpack_trees_options * o )
1142+ {
1143+ struct cache_entry * result ;
1144+
1145+ /*
1146+ * It may be that the 'lstat()' succeeded even though
1147+ * target 'ce' was absent, because there is an old
1148+ * entry that is different only in case..
1149+ *
1150+ * Ignore that lstat() if it matches.
1151+ */
1152+ if (ignore_case && icase_exists (o , name , len , st ))
1153+ return 0 ;
1154+
1155+ if (o -> dir && excluded (o -> dir , name , & dtype ))
1156+ /*
1157+ * ce->name is explicitly excluded, so it is Ok to
1158+ * overwrite it.
1159+ */
1160+ return 0 ;
1161+ if (S_ISDIR (st -> st_mode )) {
1162+ /*
1163+ * We are checking out path "foo" and
1164+ * found "foo/." in the working tree.
1165+ * This is tricky -- if we have modified
1166+ * files that are in "foo/" we would lose
1167+ * them.
1168+ */
1169+ if (verify_clean_subdirectory (ce , error_type , o ) < 0 )
1170+ return -1 ;
1171+ return 0 ;
1172+ }
1173+
1174+ /*
1175+ * The previous round may already have decided to
1176+ * delete this path, which is in a subdirectory that
1177+ * is being replaced with a blob.
1178+ */
1179+ result = index_name_exists (& o -> result , name , len , 0 );
1180+ if (result ) {
1181+ if (result -> ce_flags & CE_REMOVE )
1182+ return 0 ;
1183+ }
1184+
1185+ return o -> gently ? -1 :
1186+ add_rejected_path (o , error_type , name );
1187+ }
1188+
11381189/*
11391190 * We do not want to remove or overwrite a working tree file that
11401191 * is not tracked, unless it is ignored.
@@ -1151,55 +1202,13 @@ static int verify_absent_1(struct cache_entry *ce,
11511202 if (has_symlink_or_noent_leading_path (ce -> name , ce_namelen (ce )))
11521203 return 0 ;
11531204
1154- if (!lstat (ce -> name , & st )) {
1155- int dtype = ce_to_dtype (ce );
1156- struct cache_entry * result ;
1157-
1158- /*
1159- * It may be that the 'lstat()' succeeded even though
1160- * target 'ce' was absent, because there is an old
1161- * entry that is different only in case..
1162- *
1163- * Ignore that lstat() if it matches.
1164- */
1165- if (ignore_case && icase_exists (o , ce , & st ))
1166- return 0 ;
1167-
1168- if (o -> dir && excluded (o -> dir , ce -> name , & dtype ))
1169- /*
1170- * ce->name is explicitly excluded, so it is Ok to
1171- * overwrite it.
1172- */
1173- return 0 ;
1174- if (S_ISDIR (st .st_mode )) {
1175- /*
1176- * We are checking out path "foo" and
1177- * found "foo/." in the working tree.
1178- * This is tricky -- if we have modified
1179- * files that are in "foo/" we would lose
1180- * them.
1181- */
1182- if (verify_clean_subdirectory (ce , error_type , o ) < 0 )
1183- return -1 ;
1184- return 0 ;
1185- }
1186-
1187- /*
1188- * The previous round may already have decided to
1189- * delete this path, which is in a subdirectory that
1190- * is being replaced with a blob.
1191- */
1192- result = index_name_exists (& o -> result , ce -> name , ce_namelen (ce ), 0 );
1193- if (result ) {
1194- if (result -> ce_flags & CE_REMOVE )
1195- return 0 ;
1196- }
1197-
1198- return o -> gently ? -1 :
1199- add_rejected_path (o , error_type , ce -> name );
1200- }
1205+ if (!lstat (ce -> name , & st ))
1206+ return check_ok_to_remove (ce -> name , ce_namelen (ce ),
1207+ ce_to_dtype (ce ), ce , & st ,
1208+ error_type , o );
12011209 return 0 ;
12021210}
1211+
12031212static int verify_absent (struct cache_entry * ce ,
12041213 enum unpack_trees_error_types error_type ,
12051214 struct unpack_trees_options * o )
0 commit comments