Code

Deal with binary diff output from GNU diff 2.8.7
authorJunio C Hamano <junkio@cox.net>
Fri, 18 Nov 2005 04:46:29 +0000 (20:46 -0800)
committerJunio C Hamano <junkio@cox.net>
Fri, 18 Nov 2005 05:14:29 +0000 (21:14 -0800)
Some vintage of diff says just "Files X and Y differ\n", instead
of "Binary files X and Y differ\n", so catch both patterns.

Signed-off-by: Junio C Hamano <junkio@cox.net>
apply.c

diff --git a/apply.c b/apply.c
index 129edb18890196b2947c1e3add85ce5ef9bb0ee7..50be8f3e22d0906d09410b89ebc8d06f928ba631 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -893,12 +893,24 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
        patchsize = parse_single_patch(buffer + offset + hdrsize, size - offset - hdrsize, patch);
 
        if (!patchsize) {
-               static const char binhdr[] = "Binary files ";
-
-               if (sizeof(binhdr) - 1 < size - offset - hdrsize &&
-                   !memcmp(binhdr, buffer + hdrsize + offset,
-                           sizeof(binhdr)-1))
-                       patch->is_binary = 1;
+               static const char *binhdr[] = {
+                       "Binary files ",
+                       "Files ",
+                       NULL,
+               };
+               int i;
+               int hd = hdrsize + offset;
+               unsigned long llen = linelen(buffer + hd, size - hd);
+
+               if (!memcmp(" differ\n", buffer + hd + llen - 8, 8))
+                       for (i = 0; binhdr[i]; i++) {
+                               int len = strlen(binhdr[i]);
+                               if (len < size - hd &&
+                                   !memcmp(binhdr[i], buffer + hd, len)) {
+                                       patch->is_binary = 1;
+                                       break;
+                               }
+                       }
 
                /* Empty patch cannot be applied if:
                 * - it is a binary patch and we do not do binary_replace, or