Hi Raymond
On 08/08/2020 08:49, Raymond E. Pasco wrote:
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.
I'm not sure I understand the logic for this. If I run 'git add -N
<path>' and <path> does not exist in the worktree what's the reason to
stop a patch that creates <path> from applying?
I was relieved to see from the next patch that this does not affect
--cached even though the documentation says it implies --index. It might
be worth mentioning that in the commit message. Also it would be easier
to follow if the tests were in the same patch (this is what we usually do).
How this does it affect --check? `git add -p` uses --check to verify
that hunks that the user has edited still apply. It does not let the
user edit the hunk for a newly added file at the moment but that is
something I'm thinking of adding.
Best Wishes
Phillip
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@xxxxxxxxx>
Signed-off-by: Raymond E. Pasco <ray@xxxxxxxxxxxx>
---
apply.c | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/apply.c b/apply.c
index 4cba4ce71a..c5ecb64102 100644
--- a/apply.c
+++ b/apply.c
@@ -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);