git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Bug: With diff.noprefix=true, `git format-patch` creates a patch that `git am` rejects
@ 2022-01-08  0:36 Keith Thompson
  2022-01-08  2:45 ` Gwyneth Morgan
  0 siblings, 1 reply; 2+ messages in thread
From: Keith Thompson @ 2022-01-08  0:36 UTC (permalink / raw)
  To: git; +Cc: Keith Thompson

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(-)

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.

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Bug: With diff.noprefix=true, `git format-patch` creates a patch that `git am` rejects
  2022-01-08  0:36 Bug: With diff.noprefix=true, `git format-patch` creates a patch that `git am` rejects Keith Thompson
@ 2022-01-08  2:45 ` Gwyneth Morgan
  0 siblings, 0 replies; 2+ messages in thread
From: Gwyneth Morgan @ 2022-01-08  2:45 UTC (permalink / raw)
  To: Keith Thompson; +Cc: git

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.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-01-08  2:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-08  0:36 Bug: With diff.noprefix=true, `git format-patch` creates a patch that `git am` rejects Keith Thompson
2022-01-08  2:45 ` Gwyneth Morgan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).