From: Junio C Hamano Date: Fri, 21 Oct 2011 17:49:24 +0000 (-0700) Subject: Merge branch 'jm/maint-apply-detects-corrupt-patch-header' into maint X-Git-Tag: v1.7.7.1~9 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/cec3e186f7b76cdced54286ef1da42b6978c4c8d?ds=inline;hp=-c Merge branch 'jm/maint-apply-detects-corrupt-patch-header' into maint * jm/maint-apply-detects-corrupt-patch-header: fix "git apply --index ..." not to deref NULL --- cec3e186f7b76cdced54286ef1da42b6978c4c8d diff --combined builtin/apply.c index f2edc52818,97ade776f3..aaa39fe17e --- a/builtin/apply.c +++ b/builtin/apply.c @@@ -43,7 -43,6 +43,7 @@@ static int apply = 1 static int apply_in_reverse; static int apply_with_reject; static int apply_verbosely; +static int allow_overlap; static int no_add; static const char *fake_ancestor; static int line_termination = '\n'; @@@ -205,7 -204,6 +205,7 @@@ struct line unsigned hash : 24; unsigned flag : 8; #define LINE_COMMON 1 +#define LINE_PATCHED 2 }; /* @@@ -1407,6 -1405,9 +1407,9 @@@ static int find_header(char *line, unsi "%d leading pathname components (line %d)" , p_value, linenr); patch->old_name = patch->new_name = patch->def_name; } + if (!patch->is_delete && !patch->new_name) + die("git diff header lacks filename information " + "(line %d)", linenr); patch->is_toplevel_relative = 1; *hdrsize = git_hdr_len; return offset; @@@ -1634,7 -1635,7 +1637,7 @@@ static inline int metadata_changes(stru static char *inflate_it(const void *data, unsigned long size, unsigned long inflated_size) { - z_stream stream; + git_zstream stream; void *out; int st; @@@ -2087,8 -2088,7 +2090,8 @@@ static int match_fragment(struct image /* Quick hash check */ for (i = 0; i < preimage_limit; i++) - if (preimage->line[i].hash != img->line[try_lno + i].hash) + if ((img->line[try_lno + i].flag & LINE_PATCHED) || + (preimage->line[i].hash != img->line[try_lno + i].hash)) return 0; if (preimage_limit == preimage->nr) { @@@ -2431,15 -2431,11 +2434,15 @@@ static void update_image(struct image * memcpy(img->line + applied_pos, postimage->line, postimage->nr * sizeof(*img->line)); + if (!allow_overlap) + for (i = 0; i < postimage->nr; i++) + img->line[applied_pos + i].flag |= LINE_PATCHED; img->nr = nr; } static int apply_one_fragment(struct image *img, struct fragment *frag, - int inaccurate_eof, unsigned ws_rule) + int inaccurate_eof, unsigned ws_rule, + int nth_fragment) { int match_beginning, match_end; const char *patch = frag->patch; @@@ -2645,15 -2641,6 +2648,15 @@@ apply = 0; } + if (apply_verbosely && applied_pos != pos) { + int offset = applied_pos - pos; + if (apply_in_reverse) + offset = 0 - offset; + fprintf(stderr, + "Hunk #%d succeeded at %d (offset %d lines).\n", + nth_fragment, applied_pos + 1, offset); + } + /* * Warn if it was necessary to reduce the number * of context lines. @@@ -2801,14 -2788,12 +2804,14 @@@ static int apply_fragments(struct imag const char *name = patch->old_name ? patch->old_name : patch->new_name; unsigned ws_rule = patch->ws_rule; unsigned inaccurate_eof = patch->inaccurate_eof; + int nth = 0; if (patch->is_binary) return apply_binary(img, patch); while (frag) { - if (apply_one_fragment(img, frag, inaccurate_eof, ws_rule)) { + nth++; + if (apply_one_fragment(img, frag, inaccurate_eof, ws_rule, nth)) { error("patch failed: %s:%ld", name, frag->oldpos); if (!apply_with_reject) return -1; @@@ -3890,8 -3875,6 +3893,8 @@@ int cmd_apply(int argc, const char **ar "don't expect at least one line of context"), OPT_BOOLEAN(0, "reject", &apply_with_reject, "leave the rejected hunks in corresponding *.rej files"), + OPT_BOOLEAN(0, "allow-overlap", &allow_overlap, + "allow overlapping hunks"), OPT__VERBOSE(&apply_verbosely, "be verbose"), OPT_BIT(0, "inaccurate-eof", &options, "tolerate incorrectly detected missing new-line at the end of file",