git-gui: Allow the user to control the number of context lines in a diff.
[gitweb.git] / git-gui
diff --git a/git-gui b/git-gui
index 05ef8e2e336d8f0d522bc7fcd615817f2c643406..3f74fbb0764edf0260e292ec26cc8d6fb482edd0 100755 (executable)
--- a/git-gui
+++ b/git-gui
@@ -488,7 +488,7 @@ prevent possible confusion.
 
 proc show_diff {path {w {}} {lno {}}} {
        global file_states file_lists
-       global PARENT diff_3way diff_active
+       global PARENT diff_3way diff_active repo_config
        global ui_diff ui_fname_value ui_fstatus_value ui_status_value
 
        if {$diff_active || ![lock_index read]} return
@@ -515,10 +515,16 @@ proc show_diff {path {w {}} {lno {}}} {
        set ui_fstatus_value [mapdesc $m $path]
        set ui_status_value "Loading diff of [escape_path $path]..."
 
-       set cmd [list | git diff-index -p $PARENT -- $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 {
-               set cmd [list | git diff-index -p -c $PARENT $path]
+               lappend cmd -c
        }
        _O {
                if {[catch {
@@ -542,6 +548,10 @@ proc show_diff {path {w {}} {lno {}}} {
        }
        }
 
+       lappend cmd $PARENT
+       lappend cmd --
+       lappend cmd $path
+
        if {[catch {set fd [open $cmd r]} err]} {
                set diff_active 0
                unlock_index
@@ -1143,11 +1153,12 @@ proc display_all_files {} {
 }
 
 proc update_index {pathList} {
-       global update_index_cp ui_status_value
+       global update_index_cp update_index_rsd ui_status_value
 
        if {![lock_index update]} return
 
        set update_index_cp 0
+       set update_index_rsd 0
        set totalCnt [llength $pathList]
        set batch [expr {int($totalCnt * .01) + 1}]
        if {$batch > 25} {set batch 25}
@@ -1170,13 +1181,17 @@ proc update_index {pathList} {
 }
 
 proc write_update_index {fd pathList totalCnt batch} {
-       global update_index_cp ui_status_value
+       global update_index_cp update_index_rsd ui_status_value
        global file_states ui_fname_value
 
        if {$update_index_cp >= $totalCnt} {
                close $fd
                unlock_index
-               set ui_status_value {Ready.}
+               if {$update_index_rsd} {
+                       reshow_diff
+               } else {
+                       set ui_status_value {Ready.}
+               }
                return
        }
 
@@ -1200,7 +1215,7 @@ proc write_update_index {fd pathList totalCnt batch} {
                puts -nonewline $fd "\0"
                display_file $path $new
                if {$ui_fname_value eq $path} {
-                       show_diff $path
+                       set update_index_rsd 1
                }
        }
 
@@ -1753,12 +1768,18 @@ proc do_options {} {
        global repo_config global_config
        global repo_config_new global_config_new
 
-       load_config 1
        array unset repo_config_new
        array unset global_config_new
        foreach name [array names repo_config] {
                set repo_config_new($name) $repo_config($name)
        }
+       load_config 1
+       foreach name [array names repo_config] {
+               switch -- $name {
+               gui.diffcontext {continue}
+               }
+               set repo_config_new($name) $repo_config($name)
+       }
        foreach name [array names global_config] {
                set global_config_new($name) $global_config($name)
        }
@@ -1799,18 +1820,36 @@ proc do_options {} {
        pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5
 
        foreach option {
-               {pullsummary {Show Pull Summary}}
-               {trustmtime {Trust File Modification Timestamps}}
+               {b pullsummary {Show Pull Summary}}
+               {b trustmtime  {Trust File Modification Timestamps}}
+               {i diffcontext {Number of Diff Context Lines}}
                } {
-               set name [lindex $option 0]
-               set text [lindex $option 1]
+               set type [lindex $option 0]
+               set name [lindex $option 1]
+               set text [lindex $option 2]
                foreach f {repo global} {
-                       checkbutton $w.$f.$name -text $text \
-                               -variable ${f}_config_new(gui.$name) \
-                               -onvalue true \
-                               -offvalue false \
-                               -font font_ui
-                       pack $w.$f.$name -side top -anchor w
+                       switch $type {
+                       b {
+                               checkbutton $w.$f.$name -text $text \
+                                       -variable ${f}_config_new(gui.$name) \
+                                       -onvalue true \
+                                       -offvalue false \
+                                       -font font_ui
+                               pack $w.$f.$name -side top -anchor w
+                       }
+                       i {
+                               frame $w.$f.$name
+                               label $w.$f.$name.l -text "$text:" -font font_ui
+                               pack $w.$f.$name.l -side left -anchor w -fill x
+                               spinbox $w.$f.$name.v \
+                                       -textvariable ${f}_config_new(gui.$name) \
+                                       -from 1 -to 99 -increment 1 \
+                                       -width 3 \
+                                       -font font_ui
+                               pack $w.$f.$name.v -side right -anchor e
+                               pack $w.$f.$name -side top -anchor w -fill x
+                       }
+                       }
                }
        }
 
@@ -1876,6 +1915,7 @@ proc do_save_config {w} {
        if {[catch {save_config} err]} {
                error_popup "Failed to completely save options:\n\n$err"
        }
+       reshow_diff
        destroy $w
 }
 
@@ -1957,6 +1997,7 @@ proc apply_config {} {
 
 set default_config(gui.trustmtime) false
 set default_config(gui.pullsummary) true
+set default_config(gui.diffcontext) 5
 set default_config(gui.fontui) [font configure font_ui]
 set default_config(gui.fontdiff) [font configure font_diff]
 set font_descs {
@@ -2306,6 +2347,21 @@ $ui_diff.ctxm add command -label "Decrease Font Size" \
 $ui_diff.ctxm add command -label "Increase Font Size" \
        -font font_ui \
        -command {incr_font_size font_diff 1}
+$ui_diff.ctxm add separator
+$ui_diff.ctxm add command -label "Show Less Context" \
+       -font font_ui \
+       -command {if {$ui_fname_value ne {}
+               && $repo_config(gui.diffcontext) >= 2} {
+               incr repo_config(gui.diffcontext) -1
+               reshow_diff
+       }}
+$ui_diff.ctxm add command -label "Show More Context" \
+       -font font_ui \
+       -command {if {$ui_fname_value ne {}} {
+               incr repo_config(gui.diffcontext)
+               reshow_diff
+       }}
+$ui_diff.ctxm add separator
 $ui_diff.ctxm add command -label {Options...} \
        -font font_ui \
        -command do_options