Re: [PATCH v3] Teach git apply to respect core.fileMode settings
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Dec 24, 2023, 13:42 UTC
- Message-ID
- <82dadb69-5016-dec6-3699-4d994ea7929d@gmx.de>
- In-Reply-To
- <pull.1620.v3.git.1703066893657.gitgitgadget@gmail.com>
Hi,
On Wed, 20 Dec 2023, Chandra Pratap via GitGitGadget wrote:
Show 16 quoted lines
> diff --git a/apply.c b/apply.c
> index 3d69fec836d..58f26c40413 100644
> --- a/apply.c
> +++ b/apply.c
> @@ -3778,8 +3778,12 @@ static int check_preimage(struct apply_state *state,
> return error_errno("%s", old_name);
> }
>
> - if (!state->cached && !previous)
> - st_mode = ce_mode_from_stat(*ce, st->st_mode);
> + if (!state->cached && !previous) {
> + if (!trust_executable_bit)
> + st_mode = *ce ? (*ce)->ce_mode : patch->old_mode;
> + else
> + st_mode = ce_mode_from_stat(*ce, st->st_mode);
> + }I noticed a CI breakage in t2106.3 in `seen` that seems to be caused by this, and I can make it go away with this patch:
-- snip -- From 5c2a709b629d396528dabe2f92bf3d4deb5bbdb2 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin <johannes.schindelin@gmx.de> Date: Sun, 24 Dec 2023 14:01:49 +0100 Subject: [PATCH] fixup! Teach git apply to respect core.fileMode settings
As pointed out e.g. by t2016.3(git checkout -p), if the patch is to be applied in reverse (`git apply -R`), then the `old_mode` is actually 0, and we must use `new_mode` instead.
While at it, add some defensive code to ignore `ce_mode` should it be 0.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- apply.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/apply.c b/apply.c index 58f26c404136..5ad06ef2f843 100644 --- a/apply.c +++ b/apply.c @@ -3780,7 +3780,9 @@ static int check_preimage(struct apply_state *state, if (!state->cached && !previous) { if (!trust_executable_bit) - st_mode = *ce ? (*ce)->ce_mode : patch->old_mode; + st_mode = *ce && (*ce)->ce_mode ? (*ce)->ce_mode : + (state->apply_in_reverse ? + patch->new_mode : patch->old_mode); else st_mode = ce_mode_from_stat(*ce, st->st_mode); } -- snap -- I guess you can slap on that `Reviewed-by:` footer again, after all... ;-) Ciao, Johannes