[PATCH] Fix git patch header processing in git-apply.
[git.git] / apply.c
diff --git a/apply.c b/apply.c
index c671d9e..3ebbf6b 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -387,7 +387,7 @@ static char *git_header_name(char *line)
                default:
                        continue;
                case '\n':
-                       break;
+                       return NULL;
                case '\t': case ' ':
                        second = name+len;
                        for (;;) {
@@ -563,7 +563,7 @@ static int find_header(char *line, unsigned long size, int *hdrsize, struct patc
                        struct fragment dummy;
                        if (parse_fragment_header(line, len, &dummy) < 0)
                                continue;
-                       error("patch fragment without header at line %d: %.*s", linenr, len-1, line);
+                       error("patch fragment without header at line %d: %.*s", linenr, (int)len-1, line);
                }
 
                if (size < len + 6)
@@ -968,7 +968,7 @@ static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
 
        while (frag) {
                if (apply_one_fragment(desc, frag) < 0)
-                       return error("patch failed: %s:%d", patch->old_name, frag->oldpos);
+                       return error("patch failed: %s:%ld", patch->old_name, frag->oldpos);
                frag = frag->next;
        }
        return 0;
@@ -1043,8 +1043,12 @@ static int check_patch(struct patch *patch)
                        return error("%s: already exists in working directory", new_name);
                if (errno != ENOENT)
                        return error("%s: %s", new_name, strerror(errno));
-               if (!patch->new_mode)
-                       patch->new_mode = S_IFREG | 0644;
+               if (!patch->new_mode) {
+                       if (patch->is_new)
+                               patch->new_mode = S_IFREG | 0644;
+                       else
+                               patch->new_mode = patch->old_mode;
+               }
        }
 
        if (new_name && old_name) {