[PATCH] Teach 'git-apply --whitespace=strip' to remove empty lines at the end of file
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
---
This one seems to pass all the tests.
builtin-apply.c | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 0399743..a96f669 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1671,6 +1671,7 @@ static int apply_one_fragment(struct buffer_desc *desc,
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,15 @@ static int apply_one_fragment(struct buffer_desc *desc,
else if (first == '+')
first = '-';
}
+ /*
+ * Only fragments that add lines at the bottom
+ * of a file end with a list of '+' lines
+ */
+ if (first == '+')
+ trailing_added_lines++;
+ else
+ trailing_added_lines = 0;
+
switch (first) {
case '\n':
/* Newer GNU diff, empty context line */
@@ -1738,6 +1748,18 @@ static int apply_one_fragment(struct buffer_desc *desc,
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 - 2 > 0
+ && new[newsize - empty - 2] == '\n')
+ empty++;
+
+ newsize -= empty;
+ }
oldlines = old;
newlines = new;
leading = frag->leading;
--
1.5.2.rc3.90.gf33e-dirty