summaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2008-12-09 08:12:28 (GMT)
committerJunio C Hamano <gitster@pobox.com>2008-12-10 06:14:25 (GMT)
commit0c01857df57fe8723714e49459e0c061fcaf056b (patch)
tree59e7a1cfd6771427a9a2855405e3773f81267055 /diff.c
parent51ea440637bca30392dded5a75e23f382ce2f23a (diff)
downloadgit-0c01857df57fe8723714e49459e0c061fcaf056b.zip
git-0c01857df57fe8723714e49459e0c061fcaf056b.tar.gz
git-0c01857df57fe8723714e49459e0c061fcaf056b.tar.bz2
diff: fix handling of binary rewrite diffs
The current emit_rewrite_diff code always writes a text patch without checking whether the content is binary. This means that if you end up with a rewrite diff for a binary file, you get lots of raw binary goo in your patch. Instead, if we have binary files, then let's just skip emit_rewrite_diff altogether. We will already have shown the "dissimilarity index" line, so it is really about the diff contents. If binary diffs are turned off, the "Binary files a/file and b/file differ" message should be the same in either case. If we do have binary patches turned on, there isn't much point in making a less-efficient binary patch that does a total rewrite; no human is going to read it, and since binary patches don't apply with any fuzz anyway, the result of application should be the same. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/diff.c b/diff.c
index e21af3b..50277b8 100644
--- a/diff.c
+++ b/diff.c
@@ -1376,7 +1376,9 @@ static void builtin_diff(const char *name_a,
*/
if ((one->mode ^ two->mode) & S_IFMT)
goto free_ab_and_return;
- if (complete_rewrite) {
+ if (complete_rewrite &&
+ !diff_filespec_is_binary(one) &&
+ !diff_filespec_is_binary(two)) {
emit_rewrite_diff(name_a, name_b, one, two, o);
o->found_changes = 1;
goto free_ab_and_return;