about summary refs log tree commit diff
path: root/Src/hist.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2013-10-11 11:13:03 +0100
committerPeter Stephenson <pws@zsh.org>2013-10-11 11:13:03 +0100
commitd0fe73c5fb87ff8388837a508b903f7e93b0b2c0 (patch)
treeaec6a5956070320ea729d48c3887065ca9b4fff7 /Src/hist.c
parentc35a561a9c0ea5f3190141c7ccf28720c100485a (diff)
downloadzsh-d0fe73c5fb87ff8388837a508b903f7e93b0b2c0.tar.gz
zsh-d0fe73c5fb87ff8388837a508b903f7e93b0b2c0.tar.xz
zsh-d0fe73c5fb87ff8388837a508b903f7e93b0b2c0.zip
31815: another fix for INCAPPENDHISTORY change.
We need to save immediately if something is pushed on the history stack
to ensure we use the right file before popping.
Diffstat (limited to 'Src/hist.c')
-rw-r--r--Src/hist.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/Src/hist.c b/Src/hist.c
index bd650e81e..ed9560952 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -937,12 +937,21 @@ hbegin(int dohist)
     /*
      * For INCAPPENDHISTORY, when interactive, save the history here
      * as it gives a better estimate of the times of commands.
+     *
      * If SHAREHISTORY is also set continue to do so in the
      * standard place, because that's safer about reading and
      * rewriting history atomically.
+     *
+     * The histsave_stack_pos test won't usually fail here.
+     * We need to test the opposite for the hend() case because we
+     * need to save in the history file we've switched to, but then
+     * we pop immediately after that so the variable becomes zero.
+     * We will already have saved the line and restored the history
+     * so that (correctly) nothing happens here.  But it shows
+     * I thought about it.
      */
     if (isset(INCAPPENDHISTORY) && !isset(SHAREHISTORY) &&
-	!(histactive & HA_NOINC) && !strin)
+	!(histactive & HA_NOINC) && !strin && histsave_stack_pos == 0)
 	savehistfile(hf, 0, HFILE_USE_OPTIONS | HFILE_FAST);
 }
 
@@ -1348,7 +1357,11 @@ hend(Eprog prog)
     chline = hptr = NULL;
     chwords = NULL;
     histactive = 0;
-    if (isset(SHAREHISTORY) && histfileIsLocked())
+    /*
+     * For normal INCAPPENDHISTORY case and reasoning, see hbegin().
+     */
+    if (isset(SHAREHISTORY) ? histfileIsLocked() :
+	(isset(INCAPPENDHISTORY) && histsave_stack_pos != 0))
 	savehistfile(hf, 0, HFILE_USE_OPTIONS | HFILE_FAST);
     unlockhistfile(hf); /* It's OK to call this even if we aren't locked */
     /*