X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-apply.c;h=c903146bb65e6db4dcb527badf864d98db6aabb3;hb=e1447e38c00bdc1904458cfabb4bb3ffb678a271;hp=6dd0472ae07cac291d26b9e547a92c7c51d569df;hpb=1d7f171c3a456b980d821ee0f68e01535a5f7e36;p=git.git diff --git a/builtin-apply.c b/builtin-apply.c index 6dd0472ae..c903146bb 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -14,14 +14,15 @@ #include "delta.h" #include "builtin.h" -// --check turns on checking that the working tree matches the -// files that are being modified, but doesn't apply the patch -// --stat does just a diffstat, and doesn't actually apply -// --numstat does numeric diffstat, and doesn't actually apply -// --index-info shows the old and new index info for paths if available. -// --index updates the cache as well. -// --cached updates only the cache without ever touching the working tree. -// +/* + * --check turns on checking that the working tree matches the + * files that are being modified, but doesn't apply the patch + * --stat does just a diffstat, and doesn't actually apply + * --numstat does numeric diffstat, and doesn't actually apply + * --index-info shows the old and new index info for paths if available. + * --index updates the cache as well. + * --cached updates only the cache without ever touching the working tree. + */ static const char *prefix; static int prefix_length = -1; static int newfd = -1; @@ -125,6 +126,7 @@ struct patch { unsigned long deflate_origlen; int lines_added, lines_deleted; int score; + int inaccurate_eof:1; struct fragment *fragments; char *result; unsigned long resultsize; @@ -283,8 +285,8 @@ static void parse_traditional_patch(const char *first, const char *second, struc { char *name; - first += 4; // skip "--- " - second += 4; // skip "+++ " + first += 4; /* skip "--- " */ + second += 4; /* skip "+++ " */ if (is_dev_null(first)) { patch->is_new = 1; patch->is_delete = 0; @@ -764,7 +766,7 @@ static int find_header(char *line, unsigned long size, int *hdrsize, struct patc continue; /* - * Make sure we don't find any unconnected patch fragmants. + * Make sure we don't find any unconnected patch fragments. * That's a sign that we didn't find a header, and that a * patch has become corrupted/broken up. */ @@ -989,7 +991,7 @@ static int parse_binary(char *buffer, unsigned long size, struct patch *patch) * so one line can fit up to 13 groups that would decode * to 52 bytes max. The length byte 'A'-'Z' corresponds * to 1-26 bytes, and 'a'-'z' corresponds to 27-52 bytes. - * The end of binary is signalled with an empty line. + * The end of binary is signaled with an empty line. */ int llen, used; struct fragment *fragment; @@ -1333,7 +1335,8 @@ static int apply_line(char *output, const char *patch, int plen) return plen; } -static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag) +static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, + int inaccurate_eof) { int match_beginning, match_end; char *buf = desc->buffer; @@ -1386,13 +1389,11 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag) size -= len; } -#ifdef NO_ACCURATE_DIFF - if (oldsize > 0 && old[oldsize - 1] == '\n' && + if (inaccurate_eof && oldsize > 0 && old[oldsize - 1] == '\n' && newsize > 0 && new[newsize - 1] == '\n') { oldsize--; newsize--; } -#endif oldlines = old; newlines = new; @@ -1614,7 +1615,7 @@ static int apply_fragments(struct buffer_desc *desc, struct patch *patch) return apply_binary(desc, patch); while (frag) { - if (apply_one_fragment(desc, frag) < 0) + if (apply_one_fragment(desc, frag, patch->inaccurate_eof) < 0) return error("patch failed: %s:%ld", name, frag->oldpos); frag = frag->next; @@ -2097,7 +2098,7 @@ static int use_patch(struct patch *p) return 1; } -static int apply_patch(int fd, const char *filename) +static int apply_patch(int fd, const char *filename, int inaccurate_eof) { unsigned long offset, size; char *buffer = read_patch_file(fd, &size); @@ -2113,6 +2114,7 @@ static int apply_patch(int fd, const char *filename) int nr; patch = xcalloc(1, sizeof(*patch)); + patch->inaccurate_eof = inaccurate_eof; nr = parse_chunk(buffer + offset, size, patch); if (nr < 0) break; @@ -2180,6 +2182,8 @@ int cmd_apply(int argc, const char **argv, char **envp) { int i; int read_stdin = 1; + int inaccurate_eof = 0; + const char *whitespace_option = NULL; for (i = 1; i < argc; i++) { @@ -2188,7 +2192,7 @@ int cmd_apply(int argc, const char **argv, char **envp) int fd; if (!strcmp(arg, "-")) { - apply_patch(0, ""); + apply_patch(0, "", inaccurate_eof); read_stdin = 0; continue; } @@ -2265,6 +2269,10 @@ int cmd_apply(int argc, const char **argv, char **envp) parse_whitespace_option(arg + 13); continue; } + if (!strcmp(arg, "--inaccurate-eof")) { + inaccurate_eof = 1; + continue; + } if (check_index && prefix_length < 0) { prefix = setup_git_directory(); @@ -2281,12 +2289,12 @@ int cmd_apply(int argc, const char **argv, char **envp) usage(apply_usage); read_stdin = 0; set_default_whitespace_mode(whitespace_option); - apply_patch(fd, arg); + apply_patch(fd, arg, inaccurate_eof); close(fd); } set_default_whitespace_mode(whitespace_option); if (read_stdin) - apply_patch(0, ""); + apply_patch(0, "", inaccurate_eof); if (whitespace_error) { if (squelch_whitespace_errors && squelch_whitespace_errors < whitespace_error) { @@ -2316,7 +2324,7 @@ int cmd_apply(int argc, const char **argv, char **envp) if (write_index) { if (write_cache(newfd, active_cache, active_nr) || - commit_lock_file(&lock_file)) + close(newfd) || commit_lock_file(&lock_file)) die("Unable to write new index file"); }