From 3c800e0608782a110a88cb74c448bc5d64ddfeec Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Fri, 28 Jun 2019 11:16:27 -0700 Subject: [PATCH] Make history tests more robust history now often writes to the history file asynchronously, but the history test expects to find the text in the file immediately after running the command. Hack a bit in history to make this test more reliable. --- src/history.cpp | 16 ++++++++++------ tests/histfile.expect | 5 ----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/history.cpp b/src/history.cpp index ca14aecdc..3c5e12287 100644 --- a/src/history.cpp +++ b/src/history.cpp @@ -1928,7 +1928,7 @@ void history_t::remove(const wcstring &str) { impl()->remove(str); } void history_t::add_pending_with_file_detection(const wcstring &str, const wcstring &working_dir_slash) { // Find all arguments that look like they could be file paths. - bool impending_exit = false; + bool needs_sync_write = false; parse_node_tree_t tree; parse_tree_from_string(str, parse_flag_none, &tree, NULL); @@ -1948,21 +1948,25 @@ void history_t::add_pending_with_file_detection(const wcstring &str, // Hack hack hack - if the command is likely to trigger an exit, then don't do // background file detection, because we won't be able to write it to our history file // before we exit. + // Also skip it for 'echo'. This is because echo doesn't take file paths, but also + // because the history file test wants to find the commands in the history file + // immediately after running them, so it can't tolerate the asynchronous file detection. if (get_decoration({&tree, &node}) == parse_statement_decoration_exec) { - impending_exit = true; + needs_sync_write = true; } if (maybe_t command = command_for_plain_statement({&tree, &node}, str)) { unescape_string_in_place(&*command, UNESCAPE_DEFAULT); - if (*command == L"exit" || *command == L"reboot") { - impending_exit = true; + if (*command == L"exit" || *command == L"reboot" || *command == L"restart" || + *command == L"echo") { + needs_sync_write = true; } } } } // If we got a path, we'll perform file detection for autosuggestion hinting. - bool wants_file_detection = !potential_paths.empty() && !impending_exit; + bool wants_file_detection = !potential_paths.empty() && !needs_sync_write; auto imp = this->impl(); history_identifier_t identifier = 0; @@ -1987,7 +1991,7 @@ void history_t::add_pending_with_file_detection(const wcstring &str, // If we think we're about to exit, save immediately, regardless of any disabling. This may // cause us to lose file hinting for some commands, but it beats losing history items. imp->add(str, identifier, true /* pending */); - if (impending_exit) { + if (needs_sync_write) { imp->save(); } } diff --git a/tests/histfile.expect b/tests/histfile.expect index 7ac056235..cdd4901c8 100644 --- a/tests/histfile.expect +++ b/tests/histfile.expect @@ -39,11 +39,6 @@ expect_prompt send "$cmd2\r" expect_prompt -# TODO: Figure out why this `history --save` is only needed in one of the -# three Travis CI build environments and neither of my OS X or Ubuntu servers. -send "history --save\r" -expect_prompt - send "grep '^$hist_line' $my_histfile\r" expect_prompt -re "\r\n$hist_line\r\n" { puts "cmd2 found in my histfile"