git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/8] git-gui: rework handling of diff header
@ 2010-12-09 20:47 Bert Wesarg
  2010-12-09 20:47 ` [PATCH 2/8] git-gui: handle index lines only in the " Bert Wesarg
  2011-01-28  9:43 ` [PATCH 1/8] git-gui: rework handling of diff header Pat Thoyts
  0 siblings, 2 replies; 9+ messages in thread
From: Bert Wesarg @ 2010-12-09 20:47 UTC (permalink / raw)
  To: Pat Thoyts; +Cc: Shawn O. Pearce, git, Bert Wesarg, Johannes Sixt

The fix in ca53c3f (Fix diff parsing for lines starting with "--" or "++",
2008-09-05) got a bug report from Johannes Sixt, that new files in the
index now looks like:

new file mode 100644
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo

The introduced problem was that the 'in-diff-header'-flag was unconditially
disabled. Now it is only disabled when a hunk line is detected. And also
re-enabled when we encounter a new diff header.

The second part solves also the issue reported by me for diffs with file
type changes (i.e. the ''error: Unhandled 2 way diff marker: {d}"', which
comes from the second 'diff --git' line).

Reported-by: Johannes Sixt <j.sixt@viscovery.net>
Reported-by: Bert Wesarg <bert.wesarg@googlemail.com>
Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>

---

Cc: Johannes Sixt <j.sixt@viscovery.net>
---
 foo          |    1 +
 lib/diff.tcl |   18 +++++++++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)
 create mode 100644 foo

diff --git a/foo b/foo
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo
diff --git a/lib/diff.tcl b/lib/diff.tcl
index 9d0dc07..dae6ca6 100644
--- a/lib/diff.tcl
+++ b/lib/diff.tcl
@@ -382,23 +382,35 @@ proc read_diff {fd conflict_size cont_info} {
 		foreach {line markup} [parse_color_line $line] break
 		set line [string map {\033 ^} $line]
 
-		# -- Cleanup uninteresting diff header lines.
+		# -- Check for start of diff header.
+		if {   [string match {diff --git *}      $line]
+		    || [string match {diff --cc *}       $line]
+		    || [string match {diff --combined *} $line]} {
+			set ::current_diff_inheader 1
+		}
+
+		# -- Check for end of diff header (any hunk line will do this).
 		#
+		if {[regexp {^@@+ } $line]} {set ::current_diff_inheader 0}
+
 		if {$::current_diff_inheader} {
+			append current_diff_header $line "\n"
+
+			# -- Cleanup uninteresting diff header lines.
+			#
 			if {   [string match {diff --git *}      $line]
 			    || [string match {diff --cc *}       $line]
 			    || [string match {diff --combined *} $line]
 			    || [string match {--- *}             $line]
 			    || [string match {+++ *}             $line]} {
-				append current_diff_header $line "\n"
 				continue
 			}
 		}
+
 		if {[string match {index *} $line]} continue
 		if {$line eq {deleted file mode 120000}} {
 			set line "deleted symlink"
 		}
-		set ::current_diff_inheader 0
 
 		# -- Automatically detect if this is a 3 way diff.
 		#
-- 
1.7.3.2.1200.ge4bf6

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2011-01-28  9:43 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-09 20:47 [PATCH 1/8] git-gui: rework handling of diff header Bert Wesarg
2010-12-09 20:47 ` [PATCH 2/8] git-gui: handle index lines only in the " Bert Wesarg
2010-12-09 20:47   ` [PATCH 3/8] git-gui: name also new symlinks so Bert Wesarg
2010-12-09 20:47     ` [PATCH 4/8] git-gui: there is no "mode *" diff header line Bert Wesarg
2010-12-09 20:47       ` [PATCH 5/8] git-gui: move 3way diff autodetect up Bert Wesarg
2010-12-09 20:47         ` [PATCH 6/8] git-gui: always reset the current tag Bert Wesarg
2010-12-09 20:47           ` [PATCH 7/8] git-gui: handle special content lines only in the diff header section Bert Wesarg
2010-12-09 20:47             ` [PATCH 8/8] git-gui: handle meta diff header lines only in the " Bert Wesarg
2011-01-28  9:43 ` [PATCH 1/8] git-gui: rework handling of diff header Pat Thoyts

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).