On 5/19/07, Junio C Hamano [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Marco Costalba [off-list ref] writes:
quoted
Signed-off-by: Marco Costalba <redacted>
---
builtin-apply.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 0399743..f17f838 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1738,6 +1738,10 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, i
newsize--;
}
+ if (new_whitespace == strip_whitespace)
+ while (newsize > 1 && !strncmp(new + newsize - 2, "\n\n", 2))
+ newsize--;
+
oldlines = old;
newlines = new;
leading = frag->leading;
I agree to what you are trying to do, but this patch is wrong.
You are stripping trailing newlines that were NOT introduced by
the patch, but happened to be present in the preimage (and in
the context).
Try it on this test vector:
cat >AAA <<\EOF
a
b
c
d
e
f
g
h
i
j
k
EOF
cat >P.diff <<\EOF
diff --git a/AAA b/AAA
index 59f6a9c..ffb28f5 100644
--- a/AAA
+++ b/AAA
@@ -1,4 +1,4 @@
-a
+A
b
c
d
@@ -6,12 +6,11 @@ d
e
f
+
+
g
h
-i
-
-j
k
EOF
What about this?
builtin-apply.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 9e82757..113c71f 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1746,10 +1746,15 @@ static int apply_one_fragment(struct
buffer_desc *desc, struct fragment *frag, i
newsize--;
}
- if (new_whitespace == strip_whitespace)
- while (newsize > 1 && !strncmp(new + newsize - 2, "\n\n", 2))
- newsize--;
-
+ if (new_whitespace == strip_whitespace) {
+ int cnt1 = 1, cnt2 = 1;
+ while (newsize - cnt1 > 1 && new[newsize - cnt1] == '\n')
+ cnt1++;
+ while (oldsize - cnt2 > 1 && new[newsize - cnt2] == '\n')
+ cnt2++;
+ if (cnt1 > cnt2 && cnt1 > 2)
+ newsize -= cnt1 - cnt2;
+ }
oldlines = old;
newlines = new;
leading = frag->leading;