Skip to content

Commit 7ebc4c6

Browse files
committed
Merge bitcoin-core#379: Prompt to reset settings when settings.json cannot be read
1ee6d0b gui: Prompt to reset settings when settings.json cannot be read (Russell Yanofsky) Pull request description: Currently the GUI shows confusing error messages when `settings.json` can't be read or written on startup. This causes the unrecoverable read error described in bitcoin/bitcoin#21340 and write error described bitcoin/bitcoin#21974. Current error read message looks like: ![current](https://user-images.githubusercontent.com/7133040/124977362-638ffc80-dffe-11eb-9edd-89135a9bc602.png) This PR tries to clarify the error dialog, and adds an option to just clear the settings and reset them to default: ![new-read-error](https://user-images.githubusercontent.com/7133040/124977636-b669b400-dffe-11eb-8d35-02eda95f48c0.png) ![new-read-details](https://user-images.githubusercontent.com/7133040/124977644-bb2e6800-dffe-11eb-9209-11c1c3d7be40.png) Additionally the PR also shows a slightly better error message when there is an error trying to write the settings file. This error probably should occur less frequently, but it is easy to improve, and it should be good to make the write error consistent with the read error. The new write error dialog looks like: ![new-write-error](https://user-images.githubusercontent.com/7133040/124978016-3bed6400-dfff-11eb-9d79-9b2e9bbc4369.png) ![new-write-details](https://user-images.githubusercontent.com/7133040/124978025-3db72780-dfff-11eb-8df5-741f75a402d9.png) ACKs for top commit: jarolrod: ACK 1ee6d0b Zero-1729: ACK 1ee6d0b hebasto: ACK 1ee6d0b, tested on Linux Mint 20.2 (Qt 5.12.8). Tree-SHA512: fb57a0a0d032e3f8219fff49a4de69b4c962bf0b448544ccf9d8d4d45c5bd209e23653d4f13300b9e534b9c03de159498bef1658e95defe3ab6a8ecac57d592c
2 parents d67330d + 1ee6d0b commit 7ebc4c6

File tree

1 file changed

+54
-3
lines changed

1 file changed

+54
-3
lines changed

src/qt/bitcoin.cpp

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,58 @@ static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTrans
144144
QApplication::installTranslator(&translator);
145145
}
146146

147+
static std::string JoinErrors(const std::vector<std::string>& errors)
148+
{
149+
return Join(errors, "\n", [](const std::string& error) { return "- " + error; });
150+
}
151+
152+
static bool InitSettings()
153+
{
154+
if (!gArgs.GetSettingsPath()) {
155+
return true; // Do nothing if settings file disabled.
156+
}
157+
158+
std::vector<std::string> errors;
159+
if (!gArgs.ReadSettingsFile(&errors)) {
160+
bilingual_str error = _("Settings file could not be read");
161+
InitError(Untranslated(strprintf("%s:\n%s\n", error.original, JoinErrors(errors))));
162+
163+
QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Reset | QMessageBox::Abort);
164+
/*: Explanatory text shown on startup when the settings file cannot be read.
165+
Prompts user to make a choice between resetting or aborting. */
166+
messagebox.setInformativeText(QObject::tr("Do you want to reset settings to default values, or to abort without making changes?"));
167+
messagebox.setDetailedText(QString::fromStdString(JoinErrors(errors)));
168+
messagebox.setTextFormat(Qt::PlainText);
169+
messagebox.setDefaultButton(QMessageBox::Reset);
170+
switch (messagebox.exec()) {
171+
case QMessageBox::Reset:
172+
break;
173+
case QMessageBox::Abort:
174+
return false;
175+
default:
176+
assert(false);
177+
}
178+
}
179+
180+
errors.clear();
181+
if (!gArgs.WriteSettingsFile(&errors)) {
182+
bilingual_str error = _("Settings file could not be written");
183+
InitError(Untranslated(strprintf("%s:\n%s\n", error.original, JoinErrors(errors))));
184+
185+
QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Ok);
186+
/*: Explanatory text shown on startup when the settings file could not be written.
187+
Prompts user to check that we have the ability to write to the file.
188+
Explains that the user has the option of running without a settings file.*/
189+
messagebox.setInformativeText(QObject::tr("A fatal error occured. Check that settings file is writable, or try running with -nosettings."));
190+
messagebox.setDetailedText(QString::fromStdString(JoinErrors(errors)));
191+
messagebox.setTextFormat(Qt::PlainText);
192+
messagebox.setDefaultButton(QMessageBox::Ok);
193+
messagebox.exec();
194+
return false;
195+
}
196+
return true;
197+
}
198+
147199
/* qDebug() message handler --> debug.log */
148200
void DebugMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &msg)
149201
{
@@ -512,9 +564,8 @@ int GuiMain(int argc, char* argv[])
512564
// Parse URIs on command line -- this can affect Params()
513565
PaymentServer::ipcParseCommandLine(argc, argv);
514566
#endif
515-
if (!gArgs.InitSettings(error)) {
516-
InitError(Untranslated(error));
517-
QMessageBox::critical(nullptr, PACKAGE_NAME, QObject::tr("Error initializing settings: %1").arg(QString::fromStdString(error)));
567+
568+
if (!InitSettings()) {
518569
return EXIT_FAILURE;
519570
}
520571

0 commit comments

Comments
 (0)