提交 efe7f358 编写于 作者: M Marco Costalba 提交者: Junio C Hamano

Teach 'git-apply --whitespace=strip' to remove empty lines at the end of file

[jc: with an obvious microfix to avoid doing this unless --whitespace=strip]
Signed-off-by: NMarco Costalba <mcostalba@gmail.com>
Signed-off-by: NJunio C Hamano <junkio@cox.net>
上级 93d496a5
......@@ -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 trailing_added_lines = 0;
unsigned long leading, trailing;
int pos, lines;
......@@ -1699,6 +1700,17 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i
else if (first == '+')
first = '-';
}
/*
* Count lines added at the end of the file.
* This is not enough to get things right in case of
* patches generated with --unified=0, but it's a
* useful upper bound.
*/
if (first == '+')
trailing_added_lines++;
else
trailing_added_lines = 0;
switch (first) {
case '\n':
/* Newer GNU diff, empty context line */
......@@ -1738,6 +1750,24 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i
newsize--;
}
if (new_whitespace == strip_whitespace) {
/* Any added empty lines is already cleaned-up here
* becuase of 'strip_whitespace' flag, so just count '\n'
*/
int empty = 0;
while ( empty < trailing_added_lines
&& newsize - empty > 0
&& new[newsize - empty - 1] == '\n')
empty++;
if (empty < trailing_added_lines)
empty--;
/* these are the empty lines added at
* the end of the file, modulo u0 patches.
*/
trailing_added_lines = empty;
}
oldlines = old;
newlines = new;
leading = frag->leading;
......@@ -1770,9 +1800,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 -= trailing_added_lines;
diff = newsize - oldsize;
size = desc->size + diff;
alloc = desc->alloc;
/* Warn if it was necessary to reduce the number
* of context lines.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册