Re: [PATCH] Teach 'git-apply --whitespace=strip' to remove empty lines at end of file
On 5/19/07, Junio C Hamano <junkio@cox.net> wrote:
Show 78 quoted lines
> Marco Costalba <mcostalba@gmail.com> writes:
>
> > Signed-off-by: Marco Costalba <mcostalba@gmail.com>
> > ---
> > 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;