Thread (10 messages) flat view 10 messages, 4 authors, 2016-06-15

Re: git apply: git diff header lacks filename information for git diff --no-index patch

From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2016-06-15 22:45:26
Subsystem: the rest · Maintainer: Linus Torvalds


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";
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help