diff options
author | Junio C Hamano <junkio@cox.net> | 2007-05-21 23:57:05 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-05-21 23:57:05 -0700 |
commit | a3342a2f52a5351739577f8773eab2a1db20b651 (patch) | |
tree | 92dbd4a48490ff261729edfbe0f92f9f99fefac7 | |
parent | 23615708e2abef5c293ddee9335950161a038133 (diff) | |
parent | 077e1af5983000266bc7c1423a87b7768ca03754 (diff) | |
download | git-a3342a2f52a5351739577f8773eab2a1db20b651.tar.gz git-a3342a2f52a5351739577f8773eab2a1db20b651.tar.xz |
Merge branch 'mc/ws'
* mc/ws:
git-apply: Fix removal of new trailing blank lines.
Teach 'git-apply --whitespace=strip' to remove empty lines at the end of file
-rw-r--r-- | builtin-apply.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/builtin-apply.c b/builtin-apply.c index 0399743c4..e71789803 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -1671,6 +1671,7 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i char *new = xmalloc(size); const char *oldlines, *newlines; int oldsize = 0, newsize = 0; + int new_blank_lines_at_end = 0; unsigned long leading, trailing; int pos, lines; @@ -1678,6 +1679,7 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i char first; int len = linelen(patch, size); int plen; + int added_blank_line = 0; if (!len) break; @@ -1699,6 +1701,7 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i else if (first == '+') first = '-'; } + switch (first) { case '\n': /* Newer GNU diff, empty context line */ @@ -1716,9 +1719,14 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i break; /* Fall-through for ' ' */ case '+': - if (first != '+' || !no_add) - newsize += apply_line(new + newsize, patch, - plen); + if (first != '+' || !no_add) { + int added = apply_line(new + newsize, patch, + plen); + newsize += added; + if (first == '+' && + added == 1 && new[newsize-1] == '\n') + added_blank_line = 1; + } break; case '@': case '\\': /* Ignore it, we already handled it */ @@ -1728,6 +1736,10 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i error("invalid start of line: '%c'", first); return -1; } + if (added_blank_line) + new_blank_lines_at_end++; + else + new_blank_lines_at_end = 0; patch += len; size -= len; } @@ -1770,9 +1782,16 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i if (match_beginning && offset) offset = -1; if (offset >= 0) { - int diff = newsize - oldsize; - unsigned long size = desc->size + diff; - unsigned long alloc = desc->alloc; + int diff; + unsigned long size, alloc; + + if (new_whitespace == strip_whitespace && + (desc->size - oldsize - offset == 0)) /* end of file? */ + newsize -= new_blank_lines_at_end; + + diff = newsize - oldsize; + size = desc->size + diff; + alloc = desc->alloc; /* Warn if it was necessary to reduce the number * of context lines. |