gitk: Only write changed configuration variables
[gitweb.git] / gitk
diff --git a/gitk b/gitk
index d42f28340f717410c2600cb18c53b1817ea9f240..3425066fa8dcf633a1266e4de019e1e2ca225877 100755 (executable)
--- a/gitk
+++ b/gitk
@@ -2783,12 +2783,38 @@ proc doprogupdate {} {
     }
 }
 
+proc config_init_trace {name} {
+    global config_variable_changed config_variable_original
+
+    upvar #0 $name var
+    set config_variable_changed($name) 0
+    set config_variable_original($name) $var
+}
+
+proc config_variable_change_cb {name name2 op} {
+    global config_variable_changed config_variable_original
+
+    upvar #0 $name var
+    if {$op eq "write" &&
+       (![info exists config_variable_original($name)] ||
+        $config_variable_original($name) ne $var)} {
+       set config_variable_changed($name) 1
+    }
+}
+
 proc savestuff {w} {
-    global viewname viewfiles viewargs viewargscmd viewperm nextviewnum
-    global use_ttk
     global stuffsaved
     global config_file config_file_tmp
-    global config_variables
+    global config_variables config_variable_changed
+    global viewchanged
+
+    upvar #0 viewname current_viewname
+    upvar #0 viewfiles current_viewfiles
+    upvar #0 viewargs current_viewargs
+    upvar #0 viewargscmd current_viewargscmd
+    upvar #0 viewperm current_viewperm
+    upvar #0 nextviewnum current_nextviewnum
+    upvar #0 use_ttk current_use_ttk
 
     if {$stuffsaved} return
     if {![winfo viewable .]} return
@@ -2800,16 +2826,24 @@ proc savestuff {w} {
        if {$::tcl_platform(platform) eq {windows}} {
            file attributes $config_file_tmp -hidden true
        }
+       if {[file exists $config_file]} {
+           source $config_file
+       }
        foreach var_name $config_variables {
            upvar #0 $var_name var
-           puts $f [list set $var_name $var]
+           upvar 0 $var_name old_var
+           if {!$config_variable_changed($var_name) && [info exists old_var]} {
+               puts $f [list set $var_name $old_var]
+           } else {
+               puts $f [list set $var_name $var]
+           }
        }
 
        puts $f "set geometry(main) [wm geometry .]"
        puts $f "set geometry(state) [wm state .]"
        puts $f "set geometry(topwidth) [winfo width .tf]"
        puts $f "set geometry(topheight) [winfo height .tf]"
-       if {$use_ttk} {
+       if {$current_use_ttk} {
            puts $f "set geometry(pwsash0) \"[.tf.histframe.pwclist sashpos 0] 1\""
            puts $f "set geometry(pwsash1) \"[.tf.histframe.pwclist sashpos 1] 1\""
        } else {
@@ -2819,11 +2853,33 @@ proc savestuff {w} {
        puts $f "set geometry(botwidth) [winfo width .bleft]"
        puts $f "set geometry(botheight) [winfo height .bleft]"
 
+       array set view_save {}
+       array set views {}
+       if {![info exists permviews]} { set permviews {} }
+       foreach view $permviews {
+           set view_save([lindex $view 0]) 1
+           set views([lindex $view 0]) $view
+       }
        puts -nonewline $f "set permviews {"
-       for {set v 0} {$v < $nextviewnum} {incr v} {
-           if {$viewperm($v)} {
-               puts $f "{[list $viewname($v) $viewfiles($v) $viewargs($v) $viewargscmd($v)]}"
+       for {set v 1} {$v < $current_nextviewnum} {incr v} {
+           if {$viewchanged($v)} {
+               if {$current_viewperm($v)} {
+                   set views($current_viewname($v)) [list $current_viewname($v) $current_viewfiles($v) $current_viewargs($v) $current_viewargscmd($v)]
+               } else {
+                   set view_save($current_viewname($v)) 0
+               }
+           }
+       }
+       # write old and updated view to their places and append remaining to the end
+       foreach view $permviews {
+           set view_name [lindex $view 0]
+           if {$view_save($view_name)} {
+               puts $f "{$views($view_name)}"
            }
+           unset views($view_name)
+       }
+       foreach view_name [array names views] {
+           puts $f "{$views($view_name)}"
        }
        puts $f "}"
        close $f
@@ -4245,7 +4301,7 @@ proc allviewmenus {n op args} {
 
 proc newviewok {top n {apply 0}} {
     global nextviewnum newviewperm newviewname newishighlight
-    global viewname viewfiles viewperm selectedview curview
+    global viewname viewfiles viewperm viewchanged selectedview curview
     global viewargs viewargscmd newviewopts viewhlmenu
 
     if {[catch {
@@ -4266,6 +4322,7 @@ proc newviewok {top n {apply 0}} {
        incr nextviewnum
        set viewname($n) $newviewname($n)
        set viewperm($n) $newviewopts($n,perm)
+       set viewchanged($n) 1
        set viewfiles($n) $files
        set viewargs($n) $newargs
        set viewargscmd($n) $newviewopts($n,cmd)
@@ -4278,6 +4335,7 @@ proc newviewok {top n {apply 0}} {
     } else {
        # editing an existing view
        set viewperm($n) $newviewopts($n,perm)
+       set viewchanged($n) 1
        if {$newviewname($n) ne $viewname($n)} {
            set viewname($n) $newviewname($n)
            doviewmenu .bar.view 5 [list showview $n] \
@@ -4300,7 +4358,7 @@ proc newviewok {top n {apply 0}} {
 }
 
 proc delview {} {
-    global curview viewperm hlview selectedhlview
+    global curview viewperm hlview selectedhlview viewchanged
 
     if {$curview == 0} return
     if {[info exists hlview] && $hlview == $curview} {
@@ -4309,6 +4367,7 @@ proc delview {} {
     }
     allviewmenus $curview delete
     set viewperm($curview) 0
+    set viewchanged($curview) 1
     showview 0
 }
 
@@ -12129,6 +12188,10 @@ set config_variables {
     linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor
     indexcirclecolor circlecolors linkfgcolor circleoutlinecolor
 }
+foreach var $config_variables {
+    config_init_trace $var
+    trace add variable $var write config_variable_change_cb
+}
 
 parsefont mainfont $mainfont
 eval font create mainfont [fontflags mainfont]
@@ -12256,6 +12319,7 @@ set highlight_related [mc "None"]
 set highlight_files {}
 set viewfiles(0) {}
 set viewperm(0) 0
+set viewchanged(0) 0
 set viewargs(0) {}
 set viewargscmd(0) {}
 
@@ -12314,6 +12378,7 @@ if {$cmdline_files ne {} || $revtreeargs ne {} || $revtreeargscmd ne {}} {
     set viewargs(1) $revtreeargs
     set viewargscmd(1) $revtreeargscmd
     set viewperm(1) 0
+    set viewchanged(1) 0
     set vdatemode(1) 0
     addviewmenu 1
     .bar.view entryconf [mca "Edit view..."] -state normal
@@ -12329,6 +12394,7 @@ if {[info exists permviews]} {
        set viewargs($n) [lindex $v 2]
        set viewargscmd($n) [lindex $v 3]
        set viewperm($n) 1
+       set viewchanged($n) 0
        addviewmenu $n
     }
 }