{"thread":{"id":"37534","subject":"[PATCH 0/3] gitk: save only changed configuration on exit","startedAt":"2014-09-11T05:21:25Z","lastAt":"2014-09-11T20:26:05Z","messageCount":7,"participants":["Max Kirillov","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"249215","messageId":"1410412888-10187-1-git-send-email-max@max630.net","threadId":"37534","inReplyTo":null,"subject":"[PATCH 0/3] gitk: save only changed configuration on exit","fromName":"Max Kirillov","fromEmail":"max@max630.net","sentAt":"2014-09-11T05:21:25Z","receivedAt":"2014-09-11T05:21:25Z","isPatch":true,"sender":{"key":"max@max630.net","avatar":"https://avatars.githubusercontent.com/u/381560?v=4"},"body":"gitk rewrites whole its config on exit. This is inconvenient when there are\nseveral instances running - if user changes something in one instance, it may\nbe discarded depending of the order of closing that instances.\n\nChange saving so that it saves only changed data and tried to preserve other\nexisting data in configuration.\n\nMax Kirillov (3):\n  gitk refactor: remove boilerplate for configuration variables\n  gitk: write only changed configuration variables\n  gitk: merge views with existing ones\n\n gitk | 159 ++++++++++++++++++++++++++++++++++++-------------------------------\n 1 file changed, 86 insertions(+), 73 deletions(-)\n\n-- \n2.0.1.1697.g73c6810\n"},{"id":"249218","messageId":"1410412888-10187-2-git-send-email-max@max630.net","threadId":"37534","inReplyTo":"1410412888-10187-1-git-send-email-max@max630.net","subject":"[PATCH 1/3] gitk refactor: remove boilerplate for configuration variables","fromName":"Max Kirillov","fromEmail":"max@max630.net","sentAt":"2014-09-11T05:21:26Z","receivedAt":"2014-09-11T05:21:26Z","isPatch":true,"sender":{"key":"max@max630.net","avatar":"https://avatars.githubusercontent.com/u/381560?v=4"},"body":"Signed-off-by: Max Kirillov <max@max630.net>\n---\n gitk | 88 ++++++++++++++++----------------------------------------------------\n 1 file changed, 20 insertions(+), 68 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 6fb6cb3..6069afe 100755\n--- a/gitk\n+++ b/gitk\n@@ -2805,23 +2805,11 @@ proc doprogupdate {} {\n }\n \n proc savestuff {w} {\n-    global canv canv2 canv3 mainfont textfont uifont tabstop\n-    global stuffsaved findmergefiles maxgraphpct\n-    global maxwidth showneartags showlocalchanges\n     global viewname viewfiles viewargs viewargscmd viewperm nextviewnum\n-    global cmitmode wrapcomment datetimeformat limitdiffs\n-    global colors uicolor bgcolor fgcolor diffcolors diffcontext selectbgcolor\n-    global uifgcolor uifgdisabledcolor\n-    global headbgcolor headfgcolor headoutlinecolor remotebgcolor\n-    global tagbgcolor tagfgcolor tagoutlinecolor\n-    global reflinecolor filesepbgcolor filesepfgcolor\n-    global mergecolors foundbgcolor currentsearchhitbgcolor\n-    global linehoverbgcolor linehoverfgcolor linehoveroutlinecolor circlecolors\n-    global mainheadcirclecolor workingfilescirclecolor indexcirclecolor\n-    global linkfgcolor circleoutlinecolor\n-    global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk\n-    global hideremotes want_ttk maxrefs visiblerefs\n+    global use_ttk\n+    global stuffsaved\n     global config_file config_file_tmp\n+    global config_variables\n \n     if {$stuffsaved} return\n     if {![winfo viewable .]} return\n@@ -2833,59 +2821,10 @@ proc savestuff {w} {\n \tif {$::tcl_platform(platform) eq {windows}} {\n \t    file attributes $config_file_tmp -hidden true\n \t}\n-\tputs $f [list set mainfont $mainfont]\n-\tputs $f [list set textfont $textfont]\n-\tputs $f [list set uifont $uifont]\n-\tputs $f [list set tabstop $tabstop]\n-\tputs $f [list set findmergefiles $findmergefiles]\n-\tputs $f [list set maxgraphpct $maxgraphpct]\n-\tputs $f [list set maxwidth $maxwidth]\n-\tputs $f [list set cmitmode $cmitmode]\n-\tputs $f [list set wrapcomment $wrapcomment]\n-\tputs $f [list set autoselect $autoselect]\n-\tputs $f [list set autosellen $autosellen]\n-\tputs $f [list set showneartags $showneartags]\n-\tputs $f [list set maxrefs $maxrefs]\n-\tputs $f [list set visiblerefs $visiblerefs]\n-\tputs $f [list set hideremotes $hideremotes]\n-\tputs $f [list set showlocalchanges $showlocalchanges]\n-\tputs $f [list set datetimeformat $datetimeformat]\n-\tputs $f [list set limitdiffs $limitdiffs]\n-\tputs $f [list set uicolor $uicolor]\n-\tputs $f [list set want_ttk $want_ttk]\n-\tputs $f [list set bgcolor $bgcolor]\n-\tputs $f [list set fgcolor $fgcolor]\n-\tputs $f [list set uifgcolor $uifgcolor]\n-\tputs $f [list set uifgdisabledcolor $uifgdisabledcolor]\n-\tputs $f [list set colors $colors]\n-\tputs $f [list set diffcolors $diffcolors]\n-\tputs $f [list set mergecolors $mergecolors]\n-\tputs $f [list set markbgcolor $markbgcolor]\n-\tputs $f [list set diffcontext $diffcontext]\n-\tputs $f [list set selectbgcolor $selectbgcolor]\n-\tputs $f [list set foundbgcolor $foundbgcolor]\n-\tputs $f [list set currentsearchhitbgcolor $currentsearchhitbgcolor]\n-\tputs $f [list set extdifftool $extdifftool]\n-\tputs $f [list set perfile_attrs $perfile_attrs]\n-\tputs $f [list set headbgcolor $headbgcolor]\n-\tputs $f [list set headfgcolor $headfgcolor]\n-\tputs $f [list set headoutlinecolor $headoutlinecolor]\n-\tputs $f [list set remotebgcolor $remotebgcolor]\n-\tputs $f [list set tagbgcolor $tagbgcolor]\n-\tputs $f [list set tagfgcolor $tagfgcolor]\n-\tputs $f [list set tagoutlinecolor $tagoutlinecolor]\n-\tputs $f [list set reflinecolor $reflinecolor]\n-\tputs $f [list set filesepbgcolor $filesepbgcolor]\n-\tputs $f [list set filesepfgcolor $filesepfgcolor]\n-\tputs $f [list set linehoverbgcolor $linehoverbgcolor]\n-\tputs $f [list set linehoverfgcolor $linehoverfgcolor]\n-\tputs $f [list set linehoveroutlinecolor $linehoveroutlinecolor]\n-\tputs $f [list set mainheadcirclecolor $mainheadcirclecolor]\n-\tputs $f [list set workingfilescirclecolor $workingfilescirclecolor]\n-\tputs $f [list set indexcirclecolor $indexcirclecolor]\n-\tputs $f [list set circlecolors $circlecolors]\n-\tputs $f [list set linkfgcolor $linkfgcolor]\n-\tputs $f [list set circleoutlinecolor $circleoutlinecolor]\n+\tforeach var_name $config_variables {\n+\t    upvar #0 $var_name var\n+\t    puts $f [list set $var_name $var]\n+\t}\n \n \tputs $f \"set geometry(main) [wm geometry .]\"\n \tputs $f \"set geometry(state) [wm state .]\"\n@@ -12649,6 +12588,19 @@ catch {\n     source $config_file\n }\n \n+set config_variables {\n+    mainfont textfont uifont tabstop findmergefiles maxgraphpct maxwidth\n+    cmitmode wrapcomment autoselect autosellen showneartags maxrefs visiblerefs\n+    hideremotes showlocalchanges datetimeformat limitdiffs uicolor want_ttk\n+    bgcolor fgcolor uifgcolor uifgdisabledcolor colors diffcolors mergecolors\n+    markbgcolor diffcontext selectbgcolor foundbgcolor currentsearchhitbgcolor\n+    extdifftool perfile_attrs headbgcolor headfgcolor headoutlinecolor\n+    remotebgcolor tagbgcolor tagfgcolor tagoutlinecolor reflinecolor\n+    filesepbgcolor filesepfgcolor linehoverbgcolor linehoverfgcolor\n+    linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor\n+    indexcirclecolor circlecolors linkfgcolor circleoutlinecolor\n+}\n+\n parsefont mainfont $mainfont\n eval font create mainfont [fontflags mainfont]\n eval font create mainfontbold [fontflags mainfont 1]\n-- \n2.0.1.1697.g73c6810\n"},{"id":"249216","messageId":"1410412888-10187-3-git-send-email-max@max630.net","threadId":"37534","inReplyTo":"1410412888-10187-1-git-send-email-max@max630.net","subject":"[PATCH 2/3] gitk: write only changed configuration variables","fromName":"Max Kirillov","fromEmail":"max@max630.net","sentAt":"2014-09-11T05:21:27Z","receivedAt":"2014-09-11T05:21:27Z","isPatch":true,"sender":{"key":"max@max630.net","avatar":"https://avatars.githubusercontent.com/u/381560?v=4"},"body":"If a variable is changed in a concurrent gitk or manually it is\npreserved unless it has changed in this instance\n\nThis change does not affect geometry and views save; geometry does not\nneed it, and views need special merging, which treats each view\nseparately rather that fully replace the shole list.\n\nSigned-off-by: Max Kirillov <max@max630.net>\n---\n gitk | 41 +++++++++++++++++++++++++++++++++--------\n 1 file changed, 33 insertions(+), 8 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 6069afe..6e22024 100755\n--- a/gitk\n+++ b/gitk\n@@ -2804,12 +2804,25 @@ proc doprogupdate {} {\n     }\n }\n \n+proc config_variable_change_cb {name name2 op} {\n+    global config_variable_changed\n+    if {$op eq \"write\"} {\n+\tset config_variable_changed($name) 1\n+    }\n+}\n+\n proc savestuff {w} {\n-    global viewname viewfiles viewargs viewargscmd viewperm nextviewnum\n-    global use_ttk\n     global stuffsaved\n     global config_file config_file_tmp\n-    global config_variables\n+    global config_variables config_variable_changed\n+\n+    upvar #0 viewname current_viewname\n+    upvar #0 viewfiles current_viewfiles\n+    upvar #0 viewargs current_viewargs\n+    upvar #0 viewargscmd current_viewargscmd\n+    upvar #0 viewperm current_viewperm\n+    upvar #0 nextviewnum current_nextviewnum\n+    upvar #0 use_ttk current_use_ttk\n \n     if {$stuffsaved} return\n     if {![winfo viewable .]} return\n@@ -2821,16 +2834,24 @@ proc savestuff {w} {\n \tif {$::tcl_platform(platform) eq {windows}} {\n \t    file attributes $config_file_tmp -hidden true\n \t}\n+\tif {[file exists $config_file]} {\n+\t    source $config_file\n+\t}\n \tforeach var_name $config_variables {\n \t    upvar #0 $var_name var\n-\t    puts $f [list set $var_name $var]\n+\t    upvar 0 $var_name old_var\n+\t    if {!$config_variable_changed($var_name) && [info exists old_var]} {\n+\t\tputs $f [list set $var_name $old_var]\n+\t    } else {\n+\t\tputs $f [list set $var_name $var]\n+\t    }\n \t}\n \n \tputs $f \"set geometry(main) [wm geometry .]\"\n \tputs $f \"set geometry(state) [wm state .]\"\n \tputs $f \"set geometry(topwidth) [winfo width .tf]\"\n \tputs $f \"set geometry(topheight) [winfo height .tf]\"\n-\tif {$use_ttk} {\n+\tif {$current_use_ttk} {\n \t    puts $f \"set geometry(pwsash0) \\\"[.tf.histframe.pwclist sashpos 0] 1\\\"\"\n \t    puts $f \"set geometry(pwsash1) \\\"[.tf.histframe.pwclist sashpos 1] 1\\\"\"\n \t} else {\n@@ -2841,9 +2862,9 @@ proc savestuff {w} {\n \tputs $f \"set geometry(botheight) [winfo height .bleft]\"\n \n \tputs -nonewline $f \"set permviews {\"\n-\tfor {set v 0} {$v < $nextviewnum} {incr v} {\n-\t    if {$viewperm($v)} {\n-\t\tputs $f \"{[list $viewname($v) $viewfiles($v) $viewargs($v) $viewargscmd($v)]}\"\n+\tfor {set v 0} {$v < $current_nextviewnum} {incr v} {\n+\t    if {$current_viewperm($v)} {\n+\t\tputs $f \"{[list $current_viewname($v) $current_viewfiles($v) $current_viewargs($v) $current_viewargscmd($v)]}\"\n \t    }\n \t}\n \tputs $f \"}\"\n@@ -12600,6 +12621,10 @@ set config_variables {\n     linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor\n     indexcirclecolor circlecolors linkfgcolor circleoutlinecolor\n }\n+foreach var $config_variables {\n+    set config_variable_changed($var) 0\n+    trace add variable $var write config_variable_change_cb\n+}\n \n parsefont mainfont $mainfont\n eval font create mainfont [fontflags mainfont]\n-- \n2.0.1.1697.g73c6810\n"},{"id":"249217","messageId":"1410412888-10187-4-git-send-email-max@max630.net","threadId":"37534","inReplyTo":"1410412888-10187-1-git-send-email-max@max630.net","subject":"[PATCH 3/3] gitk: merge views with existing ones","fromName":"Max Kirillov","fromEmail":"max@max630.net","sentAt":"2014-09-11T05:21:28Z","receivedAt":"2014-09-11T05:21:28Z","isPatch":true,"sender":{"key":"max@max630.net","avatar":"https://avatars.githubusercontent.com/u/381560?v=4"},"body":"Only new and modified views are saved; old ones are saved also\nif there are no new, modified or deleted view with same name.\n\nThis allows editing view list in concurrent gitk sessions without\nlosing the changes.\n\nSigned-off-by: Max Kirillov <max@max630.net>\n---\n gitk | 42 +++++++++++++++++++++++++++++++++++++++---\n 1 file changed, 39 insertions(+), 3 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 6e22024..3394415 100755\n--- a/gitk\n+++ b/gitk\n@@ -2807,7 +2807,11 @@ proc doprogupdate {} {\n proc config_variable_change_cb {name name2 op} {\n     global config_variable_changed\n     if {$op eq \"write\"} {\n-\tset config_variable_changed($name) 1\n+\tif {$name2 eq \"\"} {\n+\t    set config_variable_changed($name) 1\n+\t} else {\n+\t    set config_variable_changed($name,$name2) 1\n+\t}\n     }\n }\n \n@@ -2861,12 +2865,38 @@ proc savestuff {w} {\n \tputs $f \"set geometry(botwidth) [winfo width .bleft]\"\n \tputs $f \"set geometry(botheight) [winfo height .bleft]\"\n \n+\tarray set view_save {}\n+\tarray set views {}\n+\tforeach view $permviews {\n+\t    set view_save([lindex $view 0]) 1\n+\t    set views([lindex $view 0]) $view\n+\t}\n \tputs -nonewline $f \"set permviews {\"\n \tfor {set v 0} {$v < $current_nextviewnum} {incr v} {\n-\t    if {$current_viewperm($v)} {\n-\t\tputs $f \"{[list $current_viewname($v) $current_viewfiles($v) $current_viewargs($v) $current_viewargscmd($v)]}\"\n+\t    if {$config_variable_changed(viewname,$v) ||\n+\t\t$config_variable_changed(viewfiles,$v) ||\n+\t\t$config_variable_changed(viewargs,$v) ||\n+\t\t$config_variable_changed(viewargscmd,$v) ||\n+\t\t$config_variable_changed(viewperm,$v)} {\n+\t\tif {$current_viewperm($v)} {\n+\t\t    set views($current_viewname($v)) [list $current_viewname($v) $current_viewfiles($v) $current_viewargs($v) $current_viewargscmd($v)]\n+\t\t} else {\n+\t\t    set view_save($current_viewname($v)) 0\n+\t\t}\n+\t\tlappend views_modified_names $current_viewname($v)\n \t    }\n \t}\n+\t# write old and updated view to their places and append remaining to the end\n+\tforeach view $permviews {\n+\t    set view_name [lindex $view 0]\n+\t    if {$view_save($view_name)} {\n+\t\tputs $f \"{$views($view_name)}\"\n+\t    }\n+\t    unset views($view_name)\n+\t}\n+\tforeach view_name [array names views] {\n+\t    puts $f \"{$views($view_name)}\"\n+\t}\n \tputs $f \"}\"\n \tclose $f\n \tfile rename -force $config_file_tmp $config_file\n@@ -12828,6 +12858,12 @@ if {[info exists permviews]} {\n \taddviewmenu $n\n     }\n }\n+foreach var {viewname viewfiles viewargs viewargscmd viewperm} {\n+    for {set v 0} {$v < $nextviewnum} {incr v} {\n+\tset config_variable_changed($var,$v) 0\n+    }\n+    trace add variable $var write config_variable_change_cb\n+}\n \n if {[tk windowingsystem] eq \"win32\"} {\n     focus -force .\n-- \n2.0.1.1697.g73c6810\n"},{"id":"249239","messageId":"xmqqtx4edqgz.fsf@gitster.dls.corp.google.com","threadId":"37534","inReplyTo":"1410412888-10187-3-git-send-email-max@max630.net","subject":"Re: [PATCH 2/3] gitk: write only changed configuration variables","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2014-09-11T17:19:56Z","receivedAt":"2014-09-11T17:19:56Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Max Kirillov <max@max630.net> writes:\n\n> If a variable is changed in a concurrent gitk or manually it is\n> preserved unless it has changed in this instance\n\nIt would have been easier to understand why this is a desirable\nchange if you stated what problem you are trying to solve before\nthat sentence.  \"If I do X, Y happens, which is bad for reason Z.\nWith this change, Y no longer happens as long as I do not do W.\"\n\n> This change does not affect geometry and views save; geometry does not\n> need it, and views need special merging, which treats each view\n> separately rather that fully replace the shole list.\n\ns/sh/wh/ I presume?\n\n>\n> Signed-off-by: Max Kirillov <max@max630.net>\n> ---\n>  gitk | 41 +++++++++++++++++++++++++++++++++--------\n>  1 file changed, 33 insertions(+), 8 deletions(-)\n>\n> diff --git a/gitk b/gitk\n> index 6069afe..6e22024 100755\n> --- a/gitk\n> +++ b/gitk\n> @@ -2804,12 +2804,25 @@ proc doprogupdate {} {\n>      }\n>  }\n>  \n> +proc config_variable_change_cb {name name2 op} {\n> +    global config_variable_changed\n> +    if {$op eq \"write\"} {\n> +\tset config_variable_changed($name) 1\n> +    }\n> +}\n\nHmm, wouldn't it make more sense to save the original value where\nyou set up the variable trace, and make the savestuff procedure do a\n3-way merge?  That way, when you and the other party changed a\nvariable to a different value, you can give a better diagnosis to\nthe user to know what is going on. If both of you changed to the\nsame value, then the end result would be the same, of course.\n"},{"id":"249248","messageId":"20140911191726.GA5549@wheezy.local","threadId":"37534","inReplyTo":"xmqqtx4edqgz.fsf@gitster.dls.corp.google.com","subject":"Re: [PATCH 2/3] gitk: write only changed configuration variables","fromName":"Max Kirillov","fromEmail":"max@max630.net","sentAt":"2014-09-11T19:17:26Z","receivedAt":"2014-09-11T19:17:26Z","isPatch":true,"sender":{"key":"max@max630.net","avatar":"https://avatars.githubusercontent.com/u/381560?v=4"},"body":"On Thu, Sep 11, 2014 at 10:19:56AM -0700, Junio C Hamano wrote:\n> Max Kirillov <max@max630.net> writes:\n> \n>> If a variable is changed in a concurrent gitk or manually it is\n>> preserved unless it has changed in this instance\n> \n> It would have been easier to understand why this is a desirable\n> change if you stated what problem you are trying to solve before\n> that sentence.  \"If I do X, Y happens, which is bad for reason Z.\n> With this change, Y no longer happens as long as I do not do W.\"\n\nSomething like:\n\n\"\"\"\nWhen gitk contains some changed parameter, and there is\nexisting instance of gitk where the parameter is still old,\nit is reverted to that old value when the instance exits.\n\nAfter the change, a parameter is stored in config only it is\nhas been modified in the exiting instance. Otherwise, the\nvalue which currently is in file is preserved. This allows\nediting the configuration when several instances are\nrunning, and don't get rollback of the modification if some\nother instance where the cinfiguration was not edited is\nclosed last.\n\"\"\"\n\nDoes it looks appropriate?\n\n(Actually, the main motivation was the 3/3 part, for views,\nscalar parameters merging was just low hanging fruit by the\nway)\n\n>> This change does not affect geometry and views save; geometry does not\n>> need it, and views need special merging, which treats each view\n>> separately rather that fully replace the shole list.\n> \n> s/sh/wh/ I presume?\n\nSure. Thanks\n\n>> +proc config_variable_change_cb {name name2 op} {\n>> +    global config_variable_changed\n>> +    if {$op eq \"write\"} {\n>> +\tset config_variable_changed($name) 1\n>> +    }\n>> +}\n> \n> Hmm, wouldn't it make more sense to save the original value where\n> you set up the variable trace, and make the savestuff procedure do a\n> 3-way merge?  That way, when you and the other party changed a\n> variable to a different value, you can give a better diagnosis to\n> the user to know what is going on. If both of you changed to the\n> same value, then the end result would be the same, of course.\n\nThis is going to complicate UI, something like \"closing\nconfirmation dialog\". Not nice. And, I am actually not sure\nit is really needed, because \"the other party\" is me again,\nin another gitk window, and most probably I would want the\nsame change.\n\nThough storing the old value and comparing to it makes sanse\nto do anyway, because trace may produce bogus events, so it\nwould be better to doublecheck has the value actually been\nchanged.\n\n-- \nMax\n"},{"id":"249255","messageId":"xmqq4mwdewf6.fsf@gitster.dls.corp.google.com","threadId":"37534","inReplyTo":"20140911191726.GA5549@wheezy.local","subject":"Re: [PATCH 2/3] gitk: write only changed configuration variables","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2014-09-11T20:26:05Z","receivedAt":"2014-09-11T20:26:05Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Max Kirillov <max@max630.net> writes:\n\n> On Thu, Sep 11, 2014 at 10:19:56AM -0700, Junio C Hamano wrote:\n>> Max Kirillov <max@max630.net> writes:\n>> \n>>> If a variable is changed in a concurrent gitk or manually it is\n>>> preserved unless it has changed in this instance\n>> \n>> It would have been easier to understand why this is a desirable\n>> change if you stated what problem you are trying to solve before\n>> that sentence.  \"If I do X, Y happens, which is bad for reason Z.\n>> With this change, Y no longer happens as long as I do not do W.\"\n>\n> Something like:\n>\n> \"\"\"\n> When gitk contains some changed parameter, and there is\n> existing instance of gitk where the parameter is still old,\n> it is reverted to that old value when the instance exits.\n>\n> After the change, a parameter is stored in config only it is\n> has been modified in the exiting instance. Otherwise, the\n> value which currently is in file is preserved. This allows\n> editing the configuration when several instances are\n> running, and don't get rollback of the modification if some\n> other instance where the cinfiguration was not edited is\n> closed last.\n> \"\"\"\n>\n> Does it looks appropriate?\n\nYeah, except for the phrase \"after the change\" may give me a hiccup\nor two while reading, because it is unclear if \"the change\" refers\nto this patch (which is the intended interpretation) or the change\nmade in one of these two instances of gitk process.\n\nExpressing the behaviour your patch modifies in the imperative mood,\nas if you are ordering our codebase \"to become like so\", would avoid\nsuch a hiccup, i.e./e.g.\n\n\tRe-read the current on-disk configuration variables and\n\toverwrite only the ones changed in this process when saving\n\tthe file, to preserve the changes made by other instances.\n\nor something like that, perhaps?\n\n> Though storing the old value and comparing to it makes sanse\n> to do anyway, because trace may produce bogus events, so it\n> would be better to doublecheck has the value actually been\n> changed.\n\nExactly.\n"}]}