Git development
 help / color / mirror / Atom feed
From: Junio C Hamano <junkio@cox.net>
To: Linus Torvalds <torvalds@osdl.org>
Cc: git@vger.kernel.org
Subject: [PATCH 1/2] apply.c: handle incomplete lines correctly.
Date: Fri, 22 Jul 2005 09:56:39 -0700	[thread overview]
Message-ID: <7vsly6wzi0.fsf@assigned-by-dhcp.cox.net> (raw)

The parsing code had a bug that failed to recognize an
incomplete line at the end of a fragment, and the fragment
application code had a comparison bug to recognize such.  Fix
them to handle incomplete lines correctly.

Add a test script for patches with various combinations of
complete and incomplete lines to make sure the fix works.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---

 apply.c               |    9 ++++++++-
 t/t4101-apply-nonl.sh |   32 ++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletions(-)
 create mode 100755 t/t4101-apply-nonl.sh

9b378103b8ba89d697cdf368d29a6113929b127a
diff --git a/apply.c b/apply.c
--- a/apply.c
+++ b/apply.c
@@ -679,6 +679,13 @@ static int parse_fragment(char *line, un
 			break;
 		}
 	}
+	/* If a fragment ends with an incomplete line, we failed to include
+	 * it in the above loop because we hit oldlines == newlines == 0
+	 * before seeing it.
+	 */
+	if (12 < size && !memcmp(line, "\\ No newline", 12))
+		offset += linelen(line, size);
+
 	patch->lines_added += added;
 	patch->lines_deleted += deleted;
 	return offset;
@@ -900,7 +907,7 @@ static int apply_one_fragment(struct buf
 		 * last one (which is the newline, of course).
 		 */
 		plen = len-1;
-		if (len > size && patch[len] == '\\')
+		if (len < size && patch[len] == '\\')
 			plen--;
 		switch (*patch) {
 		case ' ':
diff --git a/t/t4101-apply-nonl.sh b/t/t4101-apply-nonl.sh
new file mode 100755
--- /dev/null
+++ b/t/t4101-apply-nonl.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (c) 2005 Junio C Hamano
+#
+
+test_description='git-apply should handle files with incomplete lines.
+
+'
+. ./test-lib.sh
+
+# setup
+
+(echo a; echo b) >frotz.0
+(echo a; echo b; echo c) >frotz.1
+(echo a; echo b | tr -d '\012') >frotz.2
+(echo a; echo c; echo b | tr -d '\012') >frotz.3
+
+for i in 0 1 2 3
+do
+  for j in 0 1 2 3
+  do
+    test $i -eq $j && continue
+    diff -u frotz.$i frotz.$j |
+    sed -e '
+	/^---/s|.*|--- a/frotz|
+	/^+++/s|.*|+++ b/frotz|' >diff.$i-$j
+    cat frotz.$i >frotz
+    test_expect_success \
+        "apply diff between $i and $j" \
+	"git-apply <diff.$i-$j && diff frotz.$j frotz"
+  done
+done

                 reply	other threads:[~2005-07-22 16:56 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7vsly6wzi0.fsf@assigned-by-dhcp.cox.net \
    --to=junkio@cox.net \
    --cc=git@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox