X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=apply.c;h=8a3ead6c949ecc0a493f9525580fd90d6bc6ebcd;hb=d565b3412a0242e2c729bd77d18c74ecd57184dc;hp=e02e760be2c4e55659187b362406a129fd908f22;hpb=33f4d087a95a537095371a2fe02b96787518f389;p=git.git diff --git a/apply.c b/apply.c index e02e760b..8a3ead6c 100644 --- a/apply.c +++ b/apply.c @@ -437,6 +437,8 @@ static int parse_git_header(char *line, int len, unsigned int size, struct patch { "copy to ", gitdiff_copydst }, { "rename old ", gitdiff_renamesrc }, { "rename new ", gitdiff_renamedst }, + { "rename from ", gitdiff_renamesrc }, + { "rename to ", gitdiff_renamedst }, { "similarity index ", gitdiff_similarity }, { "dissimilarity index ", gitdiff_dissimilarity }, { "", gitdiff_unrecognized }, @@ -566,10 +568,13 @@ static int find_header(char *line, unsigned long size, int *hdrsize, struct patc */ if (!memcmp("diff --git ", line, 11)) { int git_hdr_len = parse_git_header(line, len, size, patch); - if (git_hdr_len < 0) + if (git_hdr_len <= len) continue; - if (!patch->old_name && !patch->new_name) - die("git diff header lacks filename information (line %d)", linenr); + if (!patch->old_name && !patch->new_name) { + if (!patch->def_name) + die("git diff header lacks filename information (line %d)", linenr); + patch->old_name = patch->new_name = patch->def_name; + } *hdrsize = git_hdr_len; return offset; } @@ -628,8 +633,11 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s if (patch->is_new != !oldlines) return error("new file depends on old contents"); - if (patch->is_delete != !newlines) - return error("deleted file still has contents"); + if (patch->is_delete != !newlines) { + if (newlines) + return error("deleted file still has contents"); + fprintf(stderr, "** warning: file %s becomes empty but is not deleted\n", patch->new_name); + } /* Parse the thing.. */ line += len; @@ -743,9 +751,11 @@ static void show_stats(struct patch *patch) del = patch->lines_deleted; total = add + del; - total = (total * max + max_change / 2) / max_change; - add = (add * max + max_change / 2) / max_change; - del = total - add; + if (max_change > 0) { + total = (total * max + max_change / 2) / max_change; + add = (add * max + max_change / 2) / max_change; + del = total - add; + } printf(" %-*s |%5d %.*s%.*s\n", len, name, patch->lines_added + patch->lines_deleted, add, pluses, del, minuses); @@ -984,7 +994,7 @@ static int check_patch(struct patch *patch) int changed; if (lstat(old_name, &st) < 0) - return error("%s: %s\n", strerror(errno)); + return error("%s: %s", old_name, strerror(errno)); if (check_index) { int pos = cache_name_pos(old_name, strlen(old_name)); if (pos < 0) @@ -995,6 +1005,7 @@ static int check_patch(struct patch *patch) } if (patch->is_new < 0) patch->is_new = 0; + st.st_mode = ntohl(create_ce_mode(st.st_mode)); if (!patch->old_mode) patch->old_mode = st.st_mode; if ((st.st_mode ^ patch->old_mode) & S_IFMT) @@ -1186,6 +1197,9 @@ static void write_out_one_result(struct patch *patch) static void write_out_results(struct patch *list) { + if (!list) + die("No changes"); + while (list) { write_out_one_result(list); list = list->next;