repl: log errors writing to history file

These errors are now logged and explicitly ignored, rather than
implicitly ignored.

Change-Id: Ia26015466a17f2b11952df5317a4d150d79dc184
This commit is contained in:
Qyriad 2024-05-19 12:57:14 -06:00
parent 20981461d4
commit 3f9e7107d1
2 changed files with 21 additions and 2 deletions

View file

@ -1,6 +1,8 @@
#include <cstdio>
#include <iostream>
#include <string>
#include <string_view>
#include <cerrno>
#ifdef READLINE
#include <readline/history.h>
@ -176,15 +178,27 @@ bool ReadlineLikeInteracter::getLine(std::string & input, ReplPromptType promptT
if (!s)
return false;
write_history(historyFile.c_str());
this->writeHistory();
input += s;
input += '\n';
return true;
}
void ReadlineLikeInteracter::writeHistory()
{
if (write_history(historyFile.c_str()) != 0) {
// write_history returns the result of fclose() (which also flushes).
// We should explicitly ignore these errors, but log them so the user
// isn't confused why their history is getting eaten.
int const fcloseErr = errno;
std::string_view const errMsg(std::strerror(fcloseErr));
warn("ignoring error writing repl history to %s: %s", this->historyFile, errMsg);
}
}
ReadlineLikeInteracter::~ReadlineLikeInteracter()
{
write_history(historyFile.c_str());
this->writeHistory();
}
AutomationInteracter::Guard AutomationInteracter::init(detail::ReplCompleterMixin *)

View file

@ -42,6 +42,11 @@ public:
}
virtual Guard init(detail::ReplCompleterMixin * repl) override;
virtual bool getLine(std::string & input, ReplPromptType promptType) override;
/** Writes the current history to the history file.
*
* This function logs but ignores errors from readline's write_history().
*/
virtual void writeHistory();
virtual ~ReadlineLikeInteracter() override;
};