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";