Skip to content

Commit 6838d1a

Browse files
Clemens Buchachergitster
authored andcommitted
add function check_ok_to_remove()
This wraps some inline code into the function check_ok_to_remove(), which will later be used for leading path components as well. Signed-off-by: Clemens Buchacher <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 175659b commit 6838d1a

File tree

1 file changed

+58
-49
lines changed

1 file changed

+58
-49
lines changed

unpack-trees.c

Lines changed: 58 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
12031212
static int verify_absent(struct cache_entry *ce,
12041213
enum unpack_trees_error_types error_type,
12051214
struct unpack_trees_options *o)

0 commit comments

Comments
 (0)