diff mbox series

[v5,1/3] apply: allow "new file" patches on i-t-a entries

Message ID 20200808074959.35943-2-ray@ameretat.dev (mailing list archive)
State Accepted
Commit 7cfde3fa0f175d6c184d7876576c236b367d97bb
Headers show
Series apply: handle i-t-a entries in index | expand

Commit Message

Raymond E. Pasco Aug. 8, 2020, 7:49 a.m. UTC
diff-files recently changed to treat changes to paths marked "intent to
add" in the index as new file diffs rather than diffs from the empty
blob.  However, apply refuses to apply new file diffs on top of existing
index entries, except in the case of renames. This causes "git add -p",
which uses apply, to fail when attempting to stage hunks from a file
when intent to add has been recorded.

This changes the logic in check_to_create() which checks if an entry
already exists in an index in two ways: first, we only search for an
index entry at all if ok_if_exists is false; second, we check for the
CE_INTENT_TO_ADD flag on any index entries we find and allow the apply
to proceed if it is set.

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Raymond E. Pasco <ray@ameretat.dev>
---
 apply.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Phillip Wood Aug. 8, 2020, 1:47 p.m. UTC | #1
Hi Raymond

On 08/08/2020 08:49, Raymond E. Pasco wrote:
> diff-files recently changed to treat changes to paths marked "intent to
> add" in the index as new file diffs rather than diffs from the empty
> blob.  However, apply refuses to apply new file diffs on top of existing
> index entries, except in the case of renames. This causes "git add -p",
> which uses apply, to fail when attempting to stage hunks from a file
> when intent to add has been recorded.
> 
> This changes the logic in check_to_create() which checks if an entry
> already exists in an index in two ways: first, we only search for an
> index entry at all if ok_if_exists is false; second, we check for the
> CE_INTENT_TO_ADD flag on any index entries we find and allow the apply
> to proceed if it is set.

Thanks for working on this, I got stung by not being able to apply a 
patch because the path was marked i-t-a recently

Best Wishes

Phillip

> 
> Helped-by: Junio C Hamano <gitster@pobox.com>
> Signed-off-by: Raymond E. Pasco <ray@ameretat.dev>
> ---
>   apply.c | 11 +++++++----
>   1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/apply.c b/apply.c
> index 8bff604dbe..4cba4ce71a 100644
> --- a/apply.c
> +++ b/apply.c
> @@ -3747,10 +3747,13 @@ static int check_to_create(struct apply_state *state,
>   {
>   	struct stat nst;
>   
> -	if (state->check_index &&
> -	    index_name_pos(state->repo->index, new_name, strlen(new_name)) >= 0 &&
> -	    !ok_if_exists)
> -		return EXISTS_IN_INDEX;
> +	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->cached)
>   		return 0;
>   
>
diff mbox series

Patch

diff --git a/apply.c b/apply.c
index 8bff604dbe..4cba4ce71a 100644
--- a/apply.c
+++ b/apply.c
@@ -3747,10 +3747,13 @@  static int check_to_create(struct apply_state *state,
 {
 	struct stat nst;
 
-	if (state->check_index &&
-	    index_name_pos(state->repo->index, new_name, strlen(new_name)) >= 0 &&
-	    !ok_if_exists)
-		return EXISTS_IN_INDEX;
+	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->cached)
 		return 0;