From: Marco Costalba Date: Sat, 19 May 2007 21:58:54 GMT Subject: Re: [PATCH] Teach 'git-apply --whitespace=strip' to remove empty lines at end of file Message-ID: In-Reply-To: <7vhcq8v97k.fsf@assigned-by-dhcp.cox.net> On 5/19/07, Junio C Hamano wrote: > Marco Costalba writes: > > > Signed-off-by: Marco Costalba > > --- > > 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;