1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-26 11:46:12 +02:00

apply: make i-t-a entries never match worktree

By definition, an intent-to-add index entry can never match the
worktree, because worktrees have no concept of intent-to-add entries.
Therefore, "apply --index" should always fail on intent-to-add paths.

Because check_preimage() calls verify_index_match(), it already fails
for patches other than creation patches, which check_preimage() ignores.
This patch adds a check to check_preimage()'s rough equivalent for
creation patches, check_to_create().

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Raymond E. Pasco <ray@ameretat.dev>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Raymond E. Pasco 2020-08-08 03:49:58 -04:00 committed by Junio C Hamano
parent 7cfde3fa0f
commit e3cc41b4f9

24
apply.c
View File

@ -3740,6 +3740,7 @@ static int check_preimage(struct apply_state *state,
#define EXISTS_IN_INDEX 1
#define EXISTS_IN_WORKTREE 2
#define EXISTS_IN_INDEX_AS_ITA 3
static int check_to_create(struct apply_state *state,
const char *new_name,
@ -3747,11 +3748,21 @@ static int check_to_create(struct apply_state *state,
{
struct stat nst;
if (state->check_index && !ok_if_exists) {
int pos = index_name_pos(state->repo->index, new_name, strlen(new_name));
if (pos >= 0 &&
!(state->repo->index->cache[pos]->ce_flags & CE_INTENT_TO_ADD))
return EXISTS_IN_INDEX;
if (state->check_index && (!ok_if_exists || !state->cached)) {
int pos;
pos = index_name_pos(state->repo->index, new_name, strlen(new_name));
if (pos >= 0) {
struct cache_entry *ce = state->repo->index->cache[pos];
/* allow ITA, as they do not yet exist in the index */
if (!ok_if_exists && !(ce->ce_flags & CE_INTENT_TO_ADD))
return EXISTS_IN_INDEX;
/* ITA entries can never match working tree files */
if (!state->cached && (ce->ce_flags & CE_INTENT_TO_ADD))
return EXISTS_IN_INDEX_AS_ITA;
}
}
if (state->cached)
@ -3938,6 +3949,9 @@ static int check_patch(struct apply_state *state, struct patch *patch)
case EXISTS_IN_INDEX:
return error(_("%s: already exists in index"), new_name);
break;
case EXISTS_IN_INDEX_AS_ITA:
return error(_("%s: does not match index"), new_name);
break;
case EXISTS_IN_WORKTREE:
return error(_("%s: already exists in working directory"),
new_name);