]> git.ipfire.org Git - thirdparty/git.git/commitdiff
git-gui: support for diff3 conflict style
authorBert Wesarg <bert.wesarg@googlemail.com>
Wed, 2 Oct 2019 07:36:02 +0000 (09:36 +0200)
committerPratyush Yadav <me@yadavpratyush.com>
Thu, 3 Oct 2019 21:56:15 +0000 (03:26 +0530)
This adds highlight support for the diff3 conflict style.

The common pre-image will be reversed to --, because it has been removed
and replaced with ours or theirs side respectively.

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
Signed-off-by: Pratyush Yadav <me@yadavpratyush.com>
git-gui.sh
lib/diff.tcl

index fd476b69993c68ddd58e274ae97e0f91c0086951..6d80f82c129f9d882f12dcf3820dd372be9110db 100755 (executable)
@@ -3581,6 +3581,9 @@ $ui_diff tag conf d_s- \
 $ui_diff tag conf d< \
        -foreground orange \
        -font font_diffbold
+$ui_diff tag conf d| \
+       -foreground orange \
+       -font font_diffbold
 $ui_diff tag conf d= \
        -foreground orange \
        -font font_diffbold
index 0fd46003b2f5c3fb3a707cc994578077fa75215b..871ad488c2a1c010c8a9edd66ae6a6bfd9d4213e 100644 (file)
@@ -347,6 +347,10 @@ proc start_show_diff {cont_info {add_opts {}}} {
        }
 
        set ::current_diff_inheader 1
+       # Detect pre-image lines of the diff3 conflict-style. They are just
+       # '++' lines which is not bijective. Thus, we need to maintain a state
+       # across lines.
+       set ::conflict_in_pre_image 0
        fconfigure $fd \
                -blocking 0 \
                -encoding [get_path_encoding $path] \
@@ -449,11 +453,23 @@ proc read_diff {fd conflict_size cont_info} {
                        {--} {set tags d_--}
                        {++} {
                                set regexp [string map [list %conflict_size $conflict_size]\
-                                                               {^\+\+([<>=]){%conflict_size}(?: |$)}]
+                                                               {^\+\+([<>=|]){%conflict_size}(?: |$)}]
                                if {[regexp $regexp $line _g op]} {
                                        set is_conflict_diff 1
                                        set line [string replace $line 0 1 {  }]
                                        set tags d$op
+
+                                       # The ||| conflict-marker marks the start of the pre-image.
+                                       # All those lines are also prefixed with '++'. Thus we need
+                                       # to maintain this state.
+                                       set ::conflict_in_pre_image [expr {$op eq {|}}]
+                               } elseif {$::conflict_in_pre_image} {
+                                       # This is a pre-image line. It is the one which both sides
+                                       # are based on. As it has also the '++' line start, it is
+                                       # normally shown as 'added'. Invert this to '--' to make
+                                       # it a 'removed' line.
+                                       set line [string replace $line 0 1 {--}]
+                                       set tags d_--
                                } else {
                                        set tags d_++
                                }