am: fix patch format detection for Thunderbird "Save As" emails
[gitweb.git] / builtin-apply.c
index 541493e1ba81462f4b01bb99c2840938bae02e4f..2a1004d025fcfdea4d317ef3236ff6bc76e3e65a 100644 (file)
@@ -404,6 +404,9 @@ static char *squash_slash(char *name)
 {
        int i = 0, j = 0;
 
+       if (!name)
+               return NULL;
+
        while (name[i]) {
                if ((name[j++] = name[i++]) == '/')
                        while (name[i] == '/')
@@ -416,7 +419,10 @@ static char *squash_slash(char *name)
 static char *find_name(const char *line, char *def, int p_value, int terminate)
 {
        int len;
-       const char *start = line;
+       const char *start = NULL;
+
+       if (p_value == 0)
+               start = line;
 
        if (*line == '"') {
                struct strbuf name = STRBUF_INIT;
@@ -686,7 +692,7 @@ static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name,
                if (isnull)
                        die("git apply: bad git-diff - expected /dev/null, got %s on line %d", name, linenr);
                another = find_name(line, NULL, p_value, TERM_TAB);
-               if (!another || memcmp(another, name, len))
+               if (!another || memcmp(another, name, len + 1))
                        die("git apply: bad git-diff - inconsistent %s filename on line %d", oldnew, linenr);
                free(another);
                return orig_name;
@@ -1199,7 +1205,8 @@ static int find_header(char *line, unsigned long size, int *hdrsize, struct patc
                                continue;
                        if (!patch->old_name && !patch->new_name) {
                                if (!patch->def_name)
-                                       die("git diff header lacks filename information (line %d)", linenr);
+                                       die("git diff header lacks filename information when removing "
+                                           "%d leading pathname components (line %d)" , p_value, linenr);
                                patch->old_name = patch->new_name = patch->def_name;
                        }
                        patch->is_toplevel_relative = 1;