Merge bitcoin/bitcoin#22653: refactor: Rename JoinErrors and re-use it

bb56486a17 refactor: Reuse MakeUnorderedList where possible (Hennadii Stepanov)
77a90f03ac refactor: Move MakeUnorderedList into util/string.h to make it reusable (Hennadii Stepanov)
6a5ccd65c7 scripted-diff: Rename JoinErrors in more general MakeUnorderedList (Hennadii Stepanov)

Pull request description:

  A nice `JoinErrors` utility function was introduced in https://github.com/bitcoin-core/gui/pull/379 by Russell Yanofsky.

  This PR renames this function and re-uses it across the code base.

ACKs for top commit:
  Zero-1729:
    Concept ACK bb56486a17
  theStack:
    Code-review ACK bb56486a17
  Talkless:
    utACK bb56486a17
  ryanofsky:
    Code review ACK bb56486a17. Nice deduping, thanks for this!

Tree-SHA512: 6bdbfa61f2ffa69e075f46b733f247c6d5b8486779a1dac064285a199a4bb8bc5ef44eaee37086305646b5c88eb6a11990883219a4a9140a5117ee21ed529bb9
This commit is contained in:
fanquake 2021-08-11 09:56:22 +08:00
commit c3545a7396
No known key found for this signature in database
GPG key ID: 2EEB9F5CC09526C1
4 changed files with 18 additions and 13 deletions

View file

@ -28,6 +28,7 @@
#include <qt/utilitydialog.h> #include <qt/utilitydialog.h>
#include <qt/winshutdownmonitor.h> #include <qt/winshutdownmonitor.h>
#include <uint256.h> #include <uint256.h>
#include <util/string.h>
#include <util/system.h> #include <util/system.h>
#include <util/threadnames.h> #include <util/threadnames.h>
#include <util/translation.h> #include <util/translation.h>
@ -144,11 +145,6 @@ static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTrans
QApplication::installTranslator(&translator); QApplication::installTranslator(&translator);
} }
static std::string JoinErrors(const std::vector<std::string>& errors)
{
return Join(errors, "\n", [](const std::string& error) { return "- " + error; });
}
static bool InitSettings() static bool InitSettings()
{ {
if (!gArgs.GetSettingsPath()) { if (!gArgs.GetSettingsPath()) {
@ -158,13 +154,13 @@ static bool InitSettings()
std::vector<std::string> errors; std::vector<std::string> errors;
if (!gArgs.ReadSettingsFile(&errors)) { if (!gArgs.ReadSettingsFile(&errors)) {
bilingual_str error = _("Settings file could not be read"); bilingual_str error = _("Settings file could not be read");
InitError(Untranslated(strprintf("%s:\n%s\n", error.original, JoinErrors(errors)))); InitError(Untranslated(strprintf("%s:\n%s\n", error.original, MakeUnorderedList(errors))));
QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Reset | QMessageBox::Abort); QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Reset | QMessageBox::Abort);
/*: Explanatory text shown on startup when the settings file cannot be read. /*: Explanatory text shown on startup when the settings file cannot be read.
Prompts user to make a choice between resetting or aborting. */ Prompts user to make a choice between resetting or aborting. */
messagebox.setInformativeText(QObject::tr("Do you want to reset settings to default values, or to abort without making changes?")); messagebox.setInformativeText(QObject::tr("Do you want to reset settings to default values, or to abort without making changes?"));
messagebox.setDetailedText(QString::fromStdString(JoinErrors(errors))); messagebox.setDetailedText(QString::fromStdString(MakeUnorderedList(errors)));
messagebox.setTextFormat(Qt::PlainText); messagebox.setTextFormat(Qt::PlainText);
messagebox.setDefaultButton(QMessageBox::Reset); messagebox.setDefaultButton(QMessageBox::Reset);
switch (messagebox.exec()) { switch (messagebox.exec()) {
@ -180,14 +176,14 @@ static bool InitSettings()
errors.clear(); errors.clear();
if (!gArgs.WriteSettingsFile(&errors)) { if (!gArgs.WriteSettingsFile(&errors)) {
bilingual_str error = _("Settings file could not be written"); bilingual_str error = _("Settings file could not be written");
InitError(Untranslated(strprintf("%s:\n%s\n", error.original, JoinErrors(errors)))); InitError(Untranslated(strprintf("%s:\n%s\n", error.original, MakeUnorderedList(errors))));
QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Ok); QMessageBox messagebox(QMessageBox::Critical, PACKAGE_NAME, QString::fromStdString(strprintf("%s.", error.translated)), QMessageBox::Ok);
/*: Explanatory text shown on startup when the settings file could not be written. /*: Explanatory text shown on startup when the settings file could not be written.
Prompts user to check that we have the ability to write to the file. Prompts user to check that we have the ability to write to the file.
Explains that the user has the option of running without a settings file.*/ Explains that the user has the option of running without a settings file.*/
messagebox.setInformativeText(QObject::tr("A fatal error occured. Check that settings file is writable, or try running with -nosettings.")); messagebox.setInformativeText(QObject::tr("A fatal error occurred. Check that settings file is writable, or try running with -nosettings."));
messagebox.setDetailedText(QString::fromStdString(JoinErrors(errors))); messagebox.setDetailedText(QString::fromStdString(MakeUnorderedList(errors)));
messagebox.setTextFormat(Qt::PlainText); messagebox.setTextFormat(Qt::PlainText);
messagebox.setDefaultButton(QMessageBox::Ok); messagebox.setDefaultButton(QMessageBox::Ok);
messagebox.exec(); messagebox.exec();

View file

@ -36,6 +36,7 @@
#include <txmempool.h> #include <txmempool.h>
#include <undo.h> #include <undo.h>
#include <util/strencodings.h> #include <util/strencodings.h>
#include <util/string.h>
#include <util/system.h> #include <util/system.h>
#include <util/translation.h> #include <util/translation.h>
#include <validation.h> #include <validation.h>
@ -1328,7 +1329,7 @@ static RPCHelpMan verifychain()
"\nVerifies blockchain database.\n", "\nVerifies blockchain database.\n",
{ {
{"checklevel", RPCArg::Type::NUM, RPCArg::DefaultHint{strprintf("%d, range=0-4", DEFAULT_CHECKLEVEL)}, {"checklevel", RPCArg::Type::NUM, RPCArg::DefaultHint{strprintf("%d, range=0-4", DEFAULT_CHECKLEVEL)},
strprintf("How thorough the block verification is:\n - %s", Join(CHECKLEVEL_DOC, "\n- "))}, strprintf("How thorough the block verification is:\n%s", MakeUnorderedList(CHECKLEVEL_DOC))},
{"nblocks", RPCArg::Type::NUM, RPCArg::DefaultHint{strprintf("%d, 0=all", DEFAULT_CHECKBLOCKS)}, "The number of blocks to check."}, {"nblocks", RPCArg::Type::NUM, RPCArg::DefaultHint{strprintf("%d, 0=all", DEFAULT_CHECKBLOCKS)}, "The number of blocks to check."},
}, },
RPCResult{ RPCResult{

View file

@ -64,6 +64,14 @@ inline std::string Join(const std::vector<std::string>& list, const std::string&
return Join<std::string>(list, separator); return Join<std::string>(list, separator);
} }
/**
* Create an unordered multi-line list of items.
*/
inline std::string MakeUnorderedList(const std::vector<std::string>& items)
{
return Join(items, "\n", [](const std::string& item) { return "- " + item; });
}
/** /**
* Check if a string does not contain any embedded NUL (\0) characters * Check if a string does not contain any embedded NUL (\0) characters
*/ */

View file

@ -502,11 +502,11 @@ bool ArgsManager::InitSettings(std::string& error)
std::vector<std::string> errors; std::vector<std::string> errors;
if (!ReadSettingsFile(&errors)) { if (!ReadSettingsFile(&errors)) {
error = strprintf("Failed loading settings file:\n- %s\n", Join(errors, "\n- ")); error = strprintf("Failed loading settings file:\n%s\n", MakeUnorderedList(errors));
return false; return false;
} }
if (!WriteSettingsFile(&errors)) { if (!WriteSettingsFile(&errors)) {
error = strprintf("Failed saving settings file:\n- %s\n", Join(errors, "\n- ")); error = strprintf("Failed saving settings file:\n%s\n", MakeUnorderedList(errors));
return false; return false;
} }
return true; return true;