Re: git apply: git diff header lacks filename information for git diff --no-index patch
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Oct 4, 2008, 17:48 UTC
- Message-ID
- <alpine.LFD.2.00.0810041031580.3208@nehalem.linux-foundation.org>
- In-Reply-To
- <alpine.LFD.2.00.0810041004290.3208@nehalem.linux-foundation.org>
On Sat, 4 Oct 2008, Linus Torvalds wrote:
> > Ahh, never mind, this one is broken.
Ok, so here's a much better version, I think.
It just refuses to use an invalid name for anything visible in the diff.
Now, this fixes the "git diff --no-index --binary a /dev/null" kind of case (and we'll end up using "a" as the basename), but some other insane cases are impossible to handle. If you do
git diff --no-index --binary a /bin/echo
you'll still get a patch like
diff --git a/a b/bin/echo old mode 100644 new mode 100755 index ...
and "git apply" will refuse to apply it for a couple of reasons, and the diff is simply bogus.
And that, btw, is no longer a bug, I think. It's impossible to know whethe the user meant for the patch to be a rename or not. And as such, refusing to apply it because you don't know what name you should use is probably _exactly_ the right thing to do!
Linus
---- diff.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/diff.c b/diff.c index 9053d4d..197533e 100644 --- a/diff.c +++ b/diff.c @@ -1493,6 +1493,10 @@ static void builtin_diff(const char *name_a, b_prefix = o->b_prefix; } + /* Never use a non-valid filename anywhere if at all possible */ + name_a = DIFF_FILE_VALID(one) ? name_a : name_b; + name_b = DIFF_FILE_VALID(two) ? name_b : name_a; + a_one = quote_two(a_prefix, name_a + (*name_a == '/')); b_two = quote_two(b_prefix, name_b + (*name_b == '/')); lbl[0] = DIFF_FILE_VALID(one) ? a_one : "/dev/null";