Re: [PATCH 1/8] git-gui: rework handling of diff header
From: Pat Thoyts <hidden>
Date: 2016-06-15 22:50:28
Bert Wesarg [off-list ref] writes:
quoted hunk
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
Inlining this in the commit comment causes 'git am' to terminate the comment text early. You should add some leading space when putting text that looks like patch header into this section.
quoted hunk
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 <redacted> Reported-by: Bert Wesarg <redacted> Signed-off-by: Bert Wesarg <redacted> --- Cc: Johannes Sixt <redacted> --- foo | 1 + lib/diff.tcl | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 foodiff --git a/foo b/foo new file mode 100644 index 0000000..257cc56 --- /dev/null +++ b/foo@@ -0,0 +1 @@ +foo
We don't need a 'foo' file :)
quoted hunk
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. #
The patch series 1 to 8 are fine. I've taken them without the foo file mentioned above and adding some spaces to the commit comment as noted above. This replaces a couple of tentative patches we've discussed previously for errors on stderr when symlinks replace files. Thank you - applying to master. -- Pat Thoyts http://www.patthoyts.tk/ PGP fingerprint 2C 6E 98 07 2C 59 C8 97 10 CE 11 E6 04 E0 B9 DD