aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Costalba <mcostalba@gmail.com>2007-05-20 14:45:59 +0200
committerJunio C Hamano <junkio@cox.net>2007-05-20 20:36:24 -0700
commitefe7f3586156bff4d29c347a1c41f93627c9f3e3 (patch)
treeeff6e78c2c69e4600ed454718c2ecd93b610c287
parent93d496a560cdcd4f72c8dee1b0b2efa324e1c3bb (diff)
downloadgit-efe7f3586156bff4d29c347a1c41f93627c9f3e3.tar.gz
git-efe7f3586156bff4d29c347a1c41f93627c9f3e3.tar.xz
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: Marco Costalba <mcostalba@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--builtin-apply.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/builtin-apply.c b/builtin-apply.c
index 0399743c4..ac7c82437 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 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.