diff --git a/git-gui.sh b/git-gui.sh
index 0bfd56051dc81d37816f149d37f385ad91d5cd96..aa8f0ba067a0bdb041fc854be3ebf9eb0f7c0f84 100755 (executable)
--- a/git-gui.sh
+++ b/git-gui.sh
}
proc reshow_diff {} {
- global current_diff_path ui_status_value file_states
-
- if {$current_diff_path eq {}
- || [catch {set s $file_states($current_diff_path)}]} {
+ global ui_status_value file_states file_lists
+ global current_diff_path current_diff_side
+
+ set p $current_diff_path
+ if {$p eq {}
+ || $current_diff_side eq {}
+ || [catch {set s $file_states($p)}]
+ || [lsearch -sorted $file_lists($current_diff_side) $p] == -1} {
clear_diff
} else {
- show_diff $current_diff_path
+ show_diff $p $current_diff_side
}
}
display_file $path __
}
-proc show_diff {path {w {}} {lno {}}} {
+proc show_diff {path w {lno {}}} {
global file_states file_lists
global is_3way_diff diff_active repo_config
- global ui_diff current_diff_path ui_status_value
+ global ui_diff ui_status_value ui_index ui_workdir
+ global current_diff_path current_diff_side
if {$diff_active || ![lock_index read]} return
set is_3way_diff 0
set diff_active 1
set current_diff_path $path
+ set current_diff_side $w
set ui_status_value "Loading diff of [escape_path $path]..."
- set cmd [list | git diff-index]
- lappend cmd --no-color
- if {$repo_config(gui.diffcontext) > 0} {
- lappend cmd "-U$repo_config(gui.diffcontext)"
- }
- lappend cmd -p
-
- switch $m {
- MM {
- lappend cmd -c
- }
- _O {
+ # - Git won't give us the diff, there's nothing to compare to!
+ #
+ if {$m eq {_O}} {
if {[catch {
set fd [open $path r]
set content [read $fd]
set ui_status_value {Ready.}
return
}
+
+ set cmd [list | git]
+ if {$w eq $ui_index} {
+ lappend cmd diff-index
+ lappend cmd --cached
+ } elseif {$w eq $ui_workdir} {
+ if {[string index $m 0] eq {U}} {
+ lappend cmd diff
+ } else {
+ lappend cmd diff-files
+ }
}
- lappend cmd [PARENT]
+ lappend cmd -p
+ lappend cmd --no-color
+ if {$repo_config(gui.diffcontext) > 0} {
+ lappend cmd "-U$repo_config(gui.diffcontext)"
+ }
+ if {$w eq $ui_index} {
+ lappend cmd [PARENT]
+ }
lappend cmd --
lappend cmd $path
# -- Cleanup uninteresting diff header lines.
#
if {[string match {diff --git *} $line]} continue
+ if {[string match {diff --cc *} $line]} continue
if {[string match {diff --combined *} $line]} continue
if {[string match {--- *} $line]} continue
if {[string match {+++ *} $line]} continue
#
if {[string match {@@@ *} $line]} {set is_3way_diff 1}
- # -- Reformat a 3 way diff, 'cause its too weird.
- #
- if {$is_3way_diff} {
+ if {[string match {index *} $line]} {
+ set tags {}
+ } elseif {$is_3way_diff} {
set op [string range $line 0 1]
switch -- $op {
+ { } {set tags {}}
{@@} {set tags d_@}
- {++} {set tags d_+ ; set op { +}}
- {--} {set tags d_- ; set op { -}}
- { +} {set tags d_++; set op {++}}
- { -} {set tags d_--; set op {--}}
- {+ } {set tags d_-+; set op {-+}}
- {- } {set tags d_+-; set op {+-}}
- default {set tags {}}
+ { +} {set tags d_s+}
+ { -} {set tags d_s-}
+ {+ } {set tags d_+s}
+ {- } {set tags d_-s}
+ {--} {set tags d_--}
+ {++} {
+ if {[regexp {^\+\+([<>]{7} |={7})} $line _g op]} {
+ set line [string replace $line 0 1 { }]
+ set tags d$op
+ } else {
+ set tags d_++
+ }
+ }
+ default {
+ puts "error: Unhandled 3 way diff marker: {$op}"
+ set tags {}
+ }
}
- set line [string replace $line 0 1 $op]
} else {
- switch -- [string index $line 0] {
- @ {set tags d_@}
- + {set tags d_+}
- - {set tags d_-}
- default {set tags {}}
+ set op [string index $line 0]
+ switch -- $op {
+ { } {set tags {}}
+ {@} {set tags d_@}
+ {-} {set tags d_-}
+ {+} {
+ if {[regexp {^\+([<>]{7} |={7})} $line _g op]} {
+ set line [string replace $line 0 0 { }]
+ set tags d$op
+ } else {
+ set tags d_+
+ }
+ }
+ default {
+ puts "error: Unhandled 2 way diff marker: {$op}"
+ set tags {}
+ }
}
}
$ui_diff insert end $line $tags
set new_m [lindex $s 0]
set icon_name [lindex $s 1]
- display_file_helper $ui_index $path $icon_name \
- [string index $old_m 0] \
- [string index $new_m 0]
- display_file_helper $ui_workdir $path $icon_name \
- [string index $old_m 1] \
- [string index $new_m 1]
+ set o [string index $old_m 0]
+ set n [string index $new_m 0]
+ if {$o eq {U}} {
+ set o _
+ }
+ if {$n eq {U}} {
+ set n _
+ }
+ display_file_helper $ui_index $path $icon_name $o $n
+
+ if {[string index $old_m 0] eq {U}} {
+ set o U
+ } else {
+ set o [string index $old_m 1]
+ }
+ if {[string index $new_m 0] eq {U}} {
+ set n U
+ } else {
+ set n [string index $new_m 1]
+ }
+ display_file_helper $ui_workdir $path $icon_name $o $n
if {$new_m eq {__}} {
unset file_states($path)
set m [lindex $s 0]
set icon_name [lindex $s 1]
- if {[string index $m 0] ne {_}} {
+ set s [string index $m 0]
+ if {$s ne {U} && $s ne {_}} {
display_all_files_helper $ui_index $path \
- $icon_name [string index $m 0]
+ $icon_name $s
+ }
+
+ if {[string index $m 0] eq {U}} {
+ set s U
+ } else {
+ set s [string index $m 1]
}
- if {[string index $m 1] ne {_}} {
+ if {$s ne {_}} {
display_all_files_helper $ui_workdir $path \
- $icon_name [string index $m 1]
+ $icon_name $s
}
}
?D {set new D_}
_O -
AM {set new A_}
- U_ -
+ U? {
+ if {[file exists $path]} {
+ set new M_
+ } else {
+ set new D_
+ }
+ }
?M {set new M_}
?? {continue}
}
set all_icons(_$ui_workdir) file_plain
set all_icons(M$ui_workdir) file_mod
set all_icons(D$ui_workdir) file_question
+set all_icons(U$ui_workdir) file_merge
set all_icons(O$ui_workdir) file_plain
set max_status_desc 0
{DO "Staged for removal, still present"}
{U_ "Requires merge resolution"}
+ {UU "Requires merge resolution"}
{UM "Requires merge resolution"}
{UD "Requires merge resolution"}
} {
pack .vpane.lower.diff.body -side bottom -fill both -expand 1
$ui_diff tag conf d_@ -font font_diffbold
-$ui_diff tag conf d_+ -foreground blue
-$ui_diff tag conf d_- -foreground red
-$ui_diff tag conf d_++ -foreground {#00a000}
-$ui_diff tag conf d_-- -foreground {#a000a0}
-$ui_diff tag conf d_+- \
- -foreground red \
- -background {light goldenrod yellow}
-$ui_diff tag conf d_-+ \
+$ui_diff tag conf d_+ -foreground blue
+$ui_diff tag conf d_- -foreground red
+
+$ui_diff tag conf d_++ -foreground blue
+$ui_diff tag conf d_-- -foreground red
+$ui_diff tag conf d_+s \
-foreground blue \
-background azure2
+$ui_diff tag conf d_-s \
+ -foreground red \
+ -background azure2
+$ui_diff tag conf d_s+ \
+ -foreground blue \
+ -background {light goldenrod yellow}
+$ui_diff tag conf d_s- \
+ -foreground red \
+ -background {light goldenrod yellow}
+
+$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
# -- Diff Body Context Menu
#