Re: [PATCH v5 1/3] apply: allow "new file" patches on i-t-a entries
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Aug 8, 2020, 13:47 UTC
- Message-ID
- <ce8ba994-2b0c-ecb6-51f0-44b5058bb0b1@gmail.com>
- In-Reply-To
- <20200808074959.35943-2-ray@ameretat.dev>
Hi Raymond
On 08/08/2020 08:49, Raymond E. Pasco wrote:
Show 12 quoted lines
> 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
Show 30 quoted lines
>
> 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;
>
>