summaryrefslogtreecommitdiff
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
parentc35a561a9c0ea5f3190141c7ccf28720c100485a (diff)
downloadzsh-d0fe73c5fb87ff8388837a508b903f7e93b0b2c0.tar.gz
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.
-rw-r--r--ChangeLog5
-rw-r--r--Src/hist.c17
2 files changed, 20 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 524f54242..f9b765aca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-11 Peter Stephenson <p.stephenson@samsung.com>
+
+ * 31815: Src/hist.c: more fallout from 31789: we need to save
+ using pushed history file before we pop.
+
2013-10-10 Peter Stephenson <p.stephenson@samsung.com>
* 31810: Test/E02xtrace.ztst: tests for simple cases of XTRACE
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 */
/*