Re: [PATCH] Teach 'git-apply --whitespace=strip' to remove empty lines at end of file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 5/19/07, Junio C Hamano <junkio@xxxxxxx> wrote:
Marco Costalba <mcostalba@xxxxxxxxx> writes:

> Signed-off-by: Marco Costalba <mcostalba@xxxxxxxxx>
> ---
>   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;
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux