Message ID | CAAHpriMPdahH2xbrrQbeCJPYpLhr6tuvT6xsG3nACmskKF1v2w@mail.gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Bug: With diff.noprefix=true, `git format-patch` creates a patch that `git am` rejects | expand |
On 2022-01-07 16:36:27-0800, Keith Thompson wrote: > The details: I had this in my $HOME/.gitconfig: > > [diff] > noprefix = true > > This caused `git format-patch` *not* to generate the `a/` and `b/` > prefixes in the patch file. Setting "noprefix = false" works around > the problem. > > Here are the first few lines of the resulting patch file: > === > cat 0001-Fix-documented-argv-and-envp-params-for-posix_spawn.patch,000 > >From f4a41189d86bc208a90e754387294b9c4c11cdfc Mon Sep 17 00:00:00 2001 > From: Keith Thompson <Keith.S.Thompson@gmail.com> > Date: Wed, 5 Jan 2022 13:30:16 -0800 > Subject: [PATCH] Fix documented argv and envp params for posix_spawn > > --- > newlib/libc/posix/posix_spawn.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git newlib/libc/posix/posix_spawn.c newlib/libc/posix/posix_spawn.c > index 005471fde..85bfa6477 100644 > --- newlib/libc/posix/posix_spawn.c > +++ newlib/libc/posix/posix_spawn.c > === > > Feeding this patch to `git am` caused it to strip the `newlib/` > prefix from the file name. There doesn't seem to be a way to coax > `git format-patch` to ignore the current diff.noprefix setting, > or `git am` to tolerate the missing prefixes. The -p<num> flag controls how many segments `git am` or `git apply` removes. The default is -p1. `git am -p0` should apply the patch correctly.
diff --git newlib/libc/posix/posix_spawn.c newlib/libc/posix/posix_spawn.c index 005471fde..85bfa6477 100644 --- newlib/libc/posix/posix_spawn.c
Thank you for filling out a Git bug report! Please answer the following questions to help us understand your issue. What did you do before the bug happened? (Steps to reproduce your issue) git format-patch master What did you expect to happen? (Expected behavior) I expected `git format-patch` to create a patch consumable by `git am`. What happened instead? (Actual behavior) `git am` choked on the patch because it was missing the `a/` and `b/` prefixes. For a simple example, a patch affecting only a top-level file, the error was: Applying: Fix typo error: git diff header lacks filename information when removing 1 leading pathname component (line 9) Patch failed at 0001 Fix typo For a patch affecting a file in a subdirectory ("DIR/README"), the error was: Applying: Fix typo error: README: does not exist in index Patch failed at 0001 Fix typo What's different between what you expected and what actually happened? See above. Anything else you want to add: The details: I had this in my $HOME/.gitconfig: [diff] noprefix = true This caused `git format-patch` *not* to generate the `a/` and `b/` prefixes in the patch file. Setting "noprefix = false" works around the problem. Here are the first few lines of the resulting patch file: === cat 0001-Fix-documented-argv-and-envp-params-for-posix_spawn.patch,000 From f4a41189d86bc208a90e754387294b9c4c11cdfc Mon Sep 17 00:00:00 2001 From: Keith Thompson <Keith.S.Thompson@gmail.com> Date: Wed, 5 Jan 2022 13:30:16 -0800 Subject: [PATCH] Fix documented argv and envp params for posix_spawn --- newlib/libc/posix/posix_spawn.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) +++ newlib/libc/posix/posix_spawn.c === Feeding this patch to `git am` caused it to strip the `newlib/` prefix from the file name. There doesn't seem to be a way to coax `git format-patch` to ignore the current diff.noprefix setting, or `git am` to tolerate the missing prefixes. Changing my .gitconfig to set diff.noprefix to false avoids the problem. I could probably have done that in the local repo rather than in my $HOME/.gitconfig . Suggested possible fixes: 1. Make `git format-patch` ignore the `diff.noprefix` setting, or at least provide an option to do so. In my opinion this is the best solution. There's no point in letting `git format-patch` create a patch that `git am` can't handle. 2. Make `git am` tolerate the missing prefixes, perhaps by not removing prefixes that match, or at least provide an option to do so. For example, given a/newlib/libc/posix/posix_spawn.c b/newlib/libc/posix/posix_spawn.c delete the a/ and b/ prefixes, but given newlib/libc/posix/posix_spawn.c newlib/libc/posix/posix_spawn.c leave the path alone because the top-level directory is identical. 3. Make `git format-patch` print a warning if diff.noprefix is true, letting the person creating the patch know how to avoid the problem. 4. Make `git am` recognize this issue and print a warning, letting the recipient of the patch know they need to manually edit the patch or request a new one. (This would still be inconvenient.) This issue is likely to affect other commands including `git apply` and possibly others. Please review the rest of the bug report below. You can delete any lines you don't wish to share. [System Info] git version: git version 2.33.1 cpu: x86_64 built from commit: af6d1d602a8f64164b266364339c4e936d5bbc33 sizeof-long: 8 sizeof-size_t: 8 shell-path: /bin/sh uname: Linux 5.4.0-91-generic #102-Ubuntu SMP Fri Nov 5 16:31:28 UTC 2021 x86_64 compiler info: gnuc: 9.3 libc info: glibc: 2.31 $SHELL (typically, interactive shell): /o/bin/bash