From 3d5b1032a193419cfa7406f0e42a7621994d70af Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 17 Apr 2020 15:07:44 -0600 Subject: [PATCH 001/120] logError, logWarning; Logger functions; switch to Verbosity enum --- src/error-demo/error-demo.cc | 67 ++++++++++++++++++------------------ src/libstore/daemon.cc | 4 +++ src/libutil/error.cc | 50 +++++++++++++++++++-------- src/libutil/error.hh | 19 +++++----- src/libutil/logging.cc | 18 ++++++++++ src/libutil/logging.hh | 30 ++++++++++------ src/nix/progress-bar.cc | 6 ++++ 7 files changed, 128 insertions(+), 66 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index a9ff6057c..b7dd4cc22 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -1,4 +1,4 @@ -#include "error.hh" +#include "logging.hh" #include "nixexpr.hh" #include @@ -8,24 +8,25 @@ int main() { using namespace nix; + std::unique_ptr logger(makeDefaultLogger()); + + verbosity = lvlError; + // In each program where errors occur, this has to be set. ErrorInfo::programName = std::optional("error-demo"); // Error in a program; no hint and no nix code. - printErrorInfo( - ErrorInfo { .level = elError, - .name = "name", + logError( + ErrorInfo { .name = "name", .description = "error description", }); // Warning with name, description, and hint. // The hintfmt function makes all the substituted text yellow. - printErrorInfo( - ErrorInfo { .level = elWarning, - .name = "name", + logWarning( + ErrorInfo { .name = "name", .description = "error description", - .hint = std::optional( - hintfmt("there was a %1%", "warning")), + .hint = hintfmt("there was a %1%", "warning"), }); @@ -34,32 +35,32 @@ int main() SymbolTable testTable; auto problem_file = testTable.create("myfile.nix"); - printErrorInfo( - ErrorInfo{ - .level = elWarning, - .name = "warning name", - .description = "warning description", - .hint = hintfmt("this hint has %1% templated %2%!!", "yellow", "values"), - .nixCode = NixCode { - .errPos = Pos(problem_file, 40, 13), - .prevLineOfCode = std::nullopt, - .errLineOfCode = "this is the problem line of code", - .nextLineOfCode = std::nullopt - }}); + logWarning( + ErrorInfo { .name = "warning name", + .description = "warning description", + .hint = hintfmt("this hint has %1% templated %2%!!", + "yellow", + "values"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13), + .prevLineOfCode = std::nullopt, + .errLineOfCode = "this is the problem line of code", + .nextLineOfCode = std::nullopt + }}); // Error with previous and next lines of code. - printErrorInfo( - ErrorInfo{ - .level = elError, - .name = "error name", - .description = "error description", - .hint = hintfmt("this hint has %1% templated %2%!!", "yellow", "values"), - .nixCode = NixCode { - .errPos = Pos(problem_file, 40, 13), - .prevLineOfCode = std::optional("previous line of code"), - .errLineOfCode = "this is the problem line of code", - .nextLineOfCode = std::optional("next line of code"), - }}); + logError( + ErrorInfo { .name = "error name", + .description = "error description", + .hint = hintfmt("this hint has %1% templated %2%!!", + "yellow", + "values"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13), + .prevLineOfCode = std::optional("previous line of code"), + .errLineOfCode = "this is the problem line of code", + .nextLineOfCode = std::optional("next line of code"), + }}); return 0; diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index 8e9f9d71b..c8daef57c 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -73,6 +73,10 @@ struct TunnelLogger : public Logger enqueueMsg(*buf.s); } + void logEI(const ErrorInfo & ei) override + { + } + /* startWork() means that we're starting an operation for which we want to send out stderr to the client. */ void startWork() diff --git a/src/libutil/error.cc b/src/libutil/error.cc index a5571d4ec..779f519c0 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -2,6 +2,7 @@ #include #include +#include "serialise.hh" namespace nix { @@ -66,25 +67,45 @@ void printCodeLines(const string &prefix, const NixCode &nixCode) } } -void printErrorInfo(const ErrorInfo &einfo) +std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) { int errwidth = 80; string prefix = " "; string levelString; switch (einfo.level) { - case ErrLevel::elError: { + case Verbosity::lvlError: { levelString = ANSI_RED; levelString += "error:"; levelString += ANSI_NORMAL; break; } - case ErrLevel::elWarning: { + case Verbosity::lvlWarn: { levelString = ANSI_YELLOW; levelString += "warning:"; levelString += ANSI_NORMAL; break; } + case Verbosity::lvlInfo: { + levelString = ANSI_YELLOW; + levelString += "info:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlTalkative: + case Verbosity::lvlChatty: + case Verbosity::lvlVomit: { + levelString = ANSI_GREEN; + levelString += "info:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlDebug: { + levelString = ANSI_YELLOW; + levelString += "debug:"; + levelString += ANSI_NORMAL; + break; + } default: { levelString = fmt("invalid error level: %1%", einfo.level); break; @@ -99,7 +120,7 @@ void printErrorInfo(const ErrorInfo &einfo) dashes.append("-"); // divider. - std::cout << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL, + out << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL, prefix, levelString, "---", @@ -115,32 +136,33 @@ void printErrorInfo(const ErrorInfo &einfo) ? string(" ") + showErrPos(einfo.nixCode->errPos) : ""; - std::cout << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL, + out << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL, prefix, einfo.nixCode->errPos.nixFile, eline) << std::endl; - std::cout << prefix << std::endl; + out << prefix << std::endl; } else { - std::cout << fmt("%1%from command line argument", prefix) << std::endl; - std::cout << prefix << std::endl; + out << fmt("%1%from command line argument", prefix) << std::endl; + out << prefix << std::endl; } } // description - std::cout << prefix << einfo.description << std::endl; - std::cout << prefix << std::endl; + out << prefix << einfo.description << std::endl; + out << prefix << std::endl; // lines of code. if (einfo.nixCode->errLineOfCode != "") { printCodeLines(prefix, *einfo.nixCode); - std::cout << prefix << std::endl; + out << prefix << std::endl; } // hint if (einfo.hint.has_value()) { - std::cout << prefix << *einfo.hint << std::endl; - std::cout << prefix << std::endl; + out << prefix << *einfo.hint << std::endl; + out << prefix << std::endl; } -} + return out; +} } diff --git a/src/libutil/error.hh b/src/libutil/error.hh index f402b692e..0419a1b52 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -11,9 +11,14 @@ namespace nix { typedef enum { - elWarning, - elError -} ErrLevel; + lvlError = 0, + lvlWarn, + lvlInfo, + lvlTalkative, + lvlChatty, + lvlDebug, + lvlVomit +} Verbosity; struct ErrPos { @@ -101,7 +106,7 @@ inline hintformat hintfmt(const std::string & fs, const Args & ... args) // ErrorInfo. struct ErrorInfo { - ErrLevel level; + Verbosity level; string name; string description; std::optional hint; @@ -110,11 +115,7 @@ struct ErrorInfo static std::optional programName; }; -// -------------------------------------------------------- -// error printing - -// just to cout for now. -void printErrorInfo(const ErrorInfo &einfo); +std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo); } diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index fa5c84a27..98f500a65 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -3,6 +3,7 @@ #include #include +#include namespace nix { @@ -57,6 +58,14 @@ public: writeToStderr(prefix + filterANSIEscapes(fs.s, !tty) + "\n"); } + void logEI(const ErrorInfo & ei) override + { + std::stringstream oss; + oss << ei; + + log(ei.level, oss.str()); + } + void startActivity(ActivityId act, Verbosity lvl, ActivityType type, const std::string & s, const Fields & fields, ActivityId parent) override @@ -135,6 +144,15 @@ struct JSONLogger : Logger write(json); } + void logEI(const ErrorInfo & ei) override + { + // nlohmann::json json; + // json["action"] = "msg"; + // json["level"] = lvl; + // json["msg"] = fs.s; + // write(json); + } + void startActivity(ActivityId act, Verbosity lvl, ActivityType type, const std::string & s, const Fields & fields, ActivityId parent) override { diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index beb5e6b64..ba6f39ac9 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -1,19 +1,10 @@ #pragma once #include "types.hh" +#include "error.hh" namespace nix { -typedef enum { - lvlError = 0, - lvlWarn, - lvlInfo, - lvlTalkative, - lvlChatty, - lvlDebug, - lvlVomit -} Verbosity; - typedef enum { actUnknown = 0, actCopyPath = 100, @@ -70,6 +61,13 @@ public: log(lvlInfo, fs); } + virtual void logEI(const ErrorInfo &ei) = 0; + + void logEI(Verbosity lvl, ErrorInfo ei) { + ei.level = lvl; + logEI(ei); + } + virtual void warn(const std::string & msg); virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type, @@ -157,6 +155,18 @@ extern Verbosity verbosity; /* suppress msgs > this */ #define debug(args...) printMsg(lvlDebug, args) #define vomit(args...) printMsg(lvlVomit, args) +#define logErrorInfo(level, errorInfo...) \ + do { \ + if (level <= nix::verbosity) { \ + logger->logEI(level, errorInfo); \ + } \ + } while (0) + +#define logError(errorInfo...) logErrorInfo(lvlError, errorInfo) +#define logWarning(errorInfo...) logErrorInfo(lvlWarn, errorInfo) + + + template inline void warn(const std::string & fs, const Args & ... args) { diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc index 26631416c..41f3d4cd7 100644 --- a/src/nix/progress-bar.cc +++ b/src/nix/progress-bar.cc @@ -124,6 +124,12 @@ public: log(*state, lvl, fs.s); } + void logEI(const ErrorInfo &ei) override + { + auto state(state_.lock()); + // log(*state, lvl, ei.as_str()); + } + void log(State & state, Verbosity lvl, const std::string & s) { if (state.active) { From 4697552948b4d9b958b0e8f8ff1b68b5e9608e4e Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 17 Apr 2020 15:50:46 -0600 Subject: [PATCH 002/120] demoing other error levels than warn/error; rename line and file fields in errPos --- src/error-demo/error-demo.cc | 37 ++++++++++++++++++++++++-- src/libutil/error.cc | 50 +++++++++++++++++++++--------------- src/libutil/error.hh | 8 +++--- src/libutil/logging.cc | 39 ++++++++++++++++++++++++---- 4 files changed, 103 insertions(+), 31 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index b7dd4cc22..14027278d 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -8,13 +8,46 @@ int main() { using namespace nix; - std::unique_ptr logger(makeDefaultLogger()); + makeDefaultLogger(); - verbosity = lvlError; + verbosity = lvlVomit; // In each program where errors occur, this has to be set. ErrorInfo::programName = std::optional("error-demo"); + // For completeness sake, info through vomit levels. + // But this is maybe a heavy format for those. + logger->logEI( + ErrorInfo { .level = lvlInfo, + .name = "Info name", + .description = "Info description", + }); + + logger->logEI( + ErrorInfo { .level = lvlTalkative, + .name = "Talkative name", + .description = "Talkative description", + }); + + logger->logEI( + ErrorInfo { .level = lvlChatty, + .name = "Chatty name", + .description = "Chatty description", + }); + + logger->logEI( + ErrorInfo { .level = lvlDebug, + .name = "Debug name", + .description = "Debug description", + }); + + logger->logEI( + ErrorInfo { .level = lvlVomit, + .name = "Vomit name", + .description = "Vomit description", + }); + + // Error in a program; no hint and no nix code. logError( ErrorInfo { .name = "name", diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 779f519c0..0e07c0d98 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -17,9 +17,9 @@ std::ostream& operator<<(std::ostream &os, const hintformat &hf) string showErrPos(const ErrPos &errPos) { if (errPos.column > 0) { - return fmt("(%1%:%2%)", errPos.lineNumber, errPos.column); + return fmt("(%1%:%2%)", errPos.line, errPos.column); } else { - return fmt("(%1%)", errPos.lineNumber); + return fmt("(%1%)", errPos.line); }; } @@ -29,7 +29,7 @@ void printCodeLines(const string &prefix, const NixCode &nixCode) if (nixCode.prevLineOfCode.has_value()) { std::cout << fmt("%1% %|2$5d|| %3%", prefix, - (nixCode.errPos.lineNumber - 1), + (nixCode.errPos.line - 1), *nixCode.prevLineOfCode) << std::endl; } @@ -37,7 +37,7 @@ void printCodeLines(const string &prefix, const NixCode &nixCode) // line of code containing the error.%2$+5d% std::cout << fmt("%1% %|2$5d|| %3%", prefix, - (nixCode.errPos.lineNumber), + (nixCode.errPos.line), nixCode.errLineOfCode) << std::endl; @@ -61,7 +61,7 @@ void printCodeLines(const string &prefix, const NixCode &nixCode) if (nixCode.nextLineOfCode.has_value()) { std::cout << fmt("%1% %|2$5d|| %3%", prefix, - (nixCode.errPos.lineNumber + 1), + (nixCode.errPos.line + 1), *nixCode.nextLineOfCode) << std::endl; } @@ -87,16 +87,26 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) break; } case Verbosity::lvlInfo: { - levelString = ANSI_YELLOW; + levelString = ANSI_GREEN; levelString += "info:"; levelString += ANSI_NORMAL; break; } - case Verbosity::lvlTalkative: - case Verbosity::lvlChatty: + case Verbosity::lvlTalkative: { + levelString = ANSI_GREEN; + levelString += "talk:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlChatty: { + levelString = ANSI_GREEN; + levelString += "chat:"; + levelString += ANSI_NORMAL; + break; + } case Verbosity::lvlVomit: { levelString = ANSI_GREEN; - levelString += "info:"; + levelString += "vomit:"; levelString += ANSI_NORMAL; break; } @@ -121,25 +131,25 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) // divider. out << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL, - prefix, - levelString, - "---", - einfo.name, - dashes, - einfo.programName.value_or("")) - << std::endl; + prefix, + levelString, + "---", + einfo.name, + dashes, + einfo.programName.value_or("")) + << std::endl; // filename. if (einfo.nixCode.has_value()) { - if (einfo.nixCode->errPos.nixFile != "") { + if (einfo.nixCode->errPos.file != "") { string eline = einfo.nixCode->errLineOfCode != "" ? string(" ") + showErrPos(einfo.nixCode->errPos) : ""; out << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL, - prefix, - einfo.nixCode->errPos.nixFile, - eline) << std::endl; + prefix, + einfo.nixCode->errPos.file, + eline) << std::endl; out << prefix << std::endl; } else { out << fmt("%1%from command line argument", prefix) << std::endl; diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 0419a1b52..63778ebda 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -22,16 +22,16 @@ typedef enum { struct ErrPos { - int lineNumber; + int line; int column; - string nixFile; + string file; template ErrPos& operator=(const P &pos) { - lineNumber = pos.line; + line = pos.line; column = pos.column; - nixFile = pos.file; + file = pos.file; return *this; } diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 98f500a65..4a8b98640 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -146,11 +146,40 @@ struct JSONLogger : Logger void logEI(const ErrorInfo & ei) override { - // nlohmann::json json; - // json["action"] = "msg"; - // json["level"] = lvl; - // json["msg"] = fs.s; - // write(json); + // add fields like Pos info and etc? + std::ostringstream oss; + oss << ei; + + nlohmann::json json; + json["action"] = "msg"; + json["level"] = ei.level; + json["msg"] = oss.str(); + + // Extra things that COULD go into json. Useful? + // TODO: decide if useful. + // TODO: make a json obj that goes into json["msg"]? + json["name"] = ei.name; + json["description"] = ei.description; + if (ei.hint.has_value()) + { + json["hint"] = ei.hint->str(); + } + if (ei.nixCode.has_value()) + { + if (ei.nixCode->errPos.line != 0) + json["line"] = ei.nixCode->errPos.line; + if (ei.nixCode->errPos.column != 0) + json["column"] = ei.nixCode->errPos.column; + if (ei.nixCode->errPos.file != "") + json["file"] = ei.nixCode->errPos.file; + if (ei.nixCode->prevLineOfCode.has_value()) + json["prevLineOfCode"] = *ei.nixCode->prevLineOfCode; + json["errLineOfCode"] = ei.nixCode->errLineOfCode; + if (ei.nixCode->nextLineOfCode.has_value()) + json["nextLineOfCode"] = *ei.nixCode->nextLineOfCode; + } + + write(json); } void startActivity(ActivityId act, Verbosity lvl, ActivityType type, From 15e9564fd1e11b3797f0188a494aa66d4622dfb0 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sun, 19 Apr 2020 17:16:51 -0600 Subject: [PATCH 003/120] logEI for tunnelLogger and progressbar --- src/libstore/daemon.cc | 8 ++++++++ src/nix/progress-bar.cc | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index c8daef57c..d985f151b 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -75,6 +75,14 @@ struct TunnelLogger : public Logger void logEI(const ErrorInfo & ei) override { + if (ei.level > verbosity) return; + + std::stringstream oss; + oss << ei; + + StringSink buf; + buf << STDERR_NEXT << oss.str() << "\n"; // (fs.s + "\n"); + enqueueMsg(*buf.s); } /* startWork() means that we're starting an operation for which we diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc index 41f3d4cd7..b1226d550 100644 --- a/src/nix/progress-bar.cc +++ b/src/nix/progress-bar.cc @@ -127,7 +127,11 @@ public: void logEI(const ErrorInfo &ei) override { auto state(state_.lock()); - // log(*state, lvl, ei.as_str()); + + std::stringstream oss; + oss << ei; + + log(*state, ei.level, oss.str()); } void log(State & state, Verbosity lvl, const std::string & s) From d3052197feababc312fd874e08ae48050d985eb3 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 21 Apr 2020 13:25:41 -0600 Subject: [PATCH 004/120] add ErrorInfo to BaseError --- src/libutil/error.cc | 2 +- src/libutil/error.hh | 122 --------------------------------------- src/libutil/fmt.hh | 127 +++++++++++++++++++++++++++++++++++++++++ src/libutil/logging.hh | 1 - src/libutil/types.hh | 125 ++++++++++++++++++++-------------------- src/libutil/util.hh | 1 - 6 files changed, 192 insertions(+), 186 deletions(-) delete mode 100644 src/libutil/error.hh create mode 100644 src/libutil/fmt.hh diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 0e07c0d98..41595b0df 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -1,4 +1,4 @@ -#include "error.hh" +#include "types.hh" #include #include diff --git a/src/libutil/error.hh b/src/libutil/error.hh deleted file mode 100644 index 63778ebda..000000000 --- a/src/libutil/error.hh +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef error_hh -#define error_hh - -#include "ansicolor.hh" -#include -#include -#include -#include "types.hh" - -namespace nix -{ - -typedef enum { - lvlError = 0, - lvlWarn, - lvlInfo, - lvlTalkative, - lvlChatty, - lvlDebug, - lvlVomit -} Verbosity; - -struct ErrPos -{ - int line; - int column; - string file; - - template - ErrPos& operator=(const P &pos) - { - line = pos.line; - column = pos.column; - file = pos.file; - return *this; - } - - template - ErrPos(const P &p) - { - *this = p; - } -}; - -struct NixCode -{ - ErrPos errPos; - std::optional prevLineOfCode; - string errLineOfCode; - std::optional nextLineOfCode; -}; - -// ---------------------------------------------------------------- -// format function for hints. same as fmt, except templated values -// are always in yellow. - -template -struct yellowify -{ - yellowify(T &s) : value(s) {} - T &value; -}; - -template -std::ostream& operator<<(std::ostream &out, const yellowify &y) -{ - return out << ANSI_YELLOW << y.value << ANSI_NORMAL; -} - -class hintformat -{ -public: - hintformat(string format) :fmt(format) - { - fmt.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); - } - template - hintformat& operator%(const T &value) - { - fmt % yellowify(value); - return *this; - } - - std::string str() const - { - return fmt.str(); - } - - template - friend class AddHint; -private: - format fmt; -}; - -std::ostream& operator<<(std::ostream &os, const hintformat &hf); - -template -inline hintformat hintfmt(const std::string & fs, const Args & ... args) -{ - hintformat f(fs); - formatHelper(f, args...); - return f; -} - -// ------------------------------------------------- -// ErrorInfo. -struct ErrorInfo -{ - Verbosity level; - string name; - string description; - std::optional hint; - std::optional nixCode; - - static std::optional programName; -}; - -std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo); - -} - -#endif diff --git a/src/libutil/fmt.hh b/src/libutil/fmt.hh new file mode 100644 index 000000000..08edffee0 --- /dev/null +++ b/src/libutil/fmt.hh @@ -0,0 +1,127 @@ +#pragma once + +#include +#include +#include "ansicolor.hh" + + +namespace nix { + + +/* Inherit some names from other namespaces for convenience. */ +using std::string; +using boost::format; + + +/* A variadic template that does nothing. Useful to call a function + for all variadic arguments but ignoring the result. */ +struct nop { template nop(T...) {} }; + + +struct FormatOrString +{ + string s; + FormatOrString(const string & s) : s(s) { }; + template + FormatOrString(const F & f) : s(f.str()) { }; + FormatOrString(const char * s) : s(s) { }; +}; + + +/* A helper for formatting strings. ‘fmt(format, a_0, ..., a_n)’ is + equivalent to ‘boost::format(format) % a_0 % ... % + ... a_n’. However, ‘fmt(s)’ is equivalent to ‘s’ (so no %-expansion + takes place). */ + +template +inline void formatHelper(F & f) +{ +} + +template +inline void formatHelper(F & f, const T & x, const Args & ... args) +{ + formatHelper(f % x, args...); +} + +inline std::string fmt(const std::string & s) +{ + return s; +} + +inline std::string fmt(const char * s) +{ + return s; +} + +inline std::string fmt(const FormatOrString & fs) +{ + return fs.s; +} + +template +inline std::string fmt(const std::string & fs, const Args & ... args) +{ + boost::format f(fs); + f.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); + formatHelper(f, args...); + return f.str(); +} + +// ----------------------------------------------------------------------------- +// format function for hints in errors. same as fmt, except templated values +// are always in yellow. + +template +struct yellowify +{ + yellowify(T &s) : value(s) {} + T &value; +}; + +template +std::ostream& operator<<(std::ostream &out, const yellowify &y) +{ + return out << ANSI_YELLOW << y.value << ANSI_NORMAL; +} + +class hintformat +{ +public: + hintformat(const string &format) :fmt(format) + { + fmt.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); + } + template + hintformat& operator%(const T &value) + { + fmt % yellowify(value); + return *this; + } + hintformat(const hintformat &hf) + : fmt(hf.fmt) + {} + + + std::string str() const + { + return fmt.str(); + } + + template + friend class AddHint; +private: + format fmt; +}; + +std::ostream& operator<<(std::ostream &os, const hintformat &hf); + +template +inline hintformat hintfmt(const std::string & fs, const Args & ... args) +{ + hintformat f(fs); + formatHelper(f, args...); + return f; +} + +} diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index ba6f39ac9..8269e2e1a 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -1,7 +1,6 @@ #pragma once #include "types.hh" -#include "error.hh" namespace nix { diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 981af528b..633c6bdf7 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -3,13 +3,13 @@ #include "ref.hh" -#include #include #include #include #include +#include -#include +#include "fmt.hh" /* Before 4.7, gcc's std::exception uses empty throw() specifiers for * its (virtual) destructor and what() in c++11 mode, in violation of spec @@ -20,73 +20,66 @@ #endif #endif - namespace nix { - -/* Inherit some names from other namespaces for convenience. */ -using std::string; using std::list; using std::set; using std::vector; -using boost::format; +typedef enum { + lvlError = 0, + lvlWarn, + lvlInfo, + lvlTalkative, + lvlChatty, + lvlDebug, + lvlVomit +} Verbosity; -/* A variadic template that does nothing. Useful to call a function - for all variadic arguments but ignoring the result. */ -struct nop { template nop(T...) {} }; - - -struct FormatOrString +struct ErrPos { - string s; - FormatOrString(const string & s) : s(s) { }; - template - FormatOrString(const F & f) : s(f.str()) { }; - FormatOrString(const char * s) : s(s) { }; + int line; + int column; + string file; + + template + ErrPos& operator=(const P &pos) + { + line = pos.line; + column = pos.column; + file = pos.file; + return *this; + } + + template + ErrPos(const P &p) + { + *this = p; + } }; - -/* A helper for formatting strings. ‘fmt(format, a_0, ..., a_n)’ is - equivalent to ‘boost::format(format) % a_0 % ... % - ... a_n’. However, ‘fmt(s)’ is equivalent to ‘s’ (so no %-expansion - takes place). */ - -template -inline void formatHelper(F & f) +struct NixCode { -} + ErrPos errPos; + std::optional prevLineOfCode; + string errLineOfCode; + std::optional nextLineOfCode; +}; -template -inline void formatHelper(F & f, const T & x, const Args & ... args) +// ------------------------------------------------- +// ErrorInfo. +struct ErrorInfo { - formatHelper(f % x, args...); -} + Verbosity level; + string name; + string description; + std::optional hint; + std::optional nixCode; -inline std::string fmt(const std::string & s) -{ - return s; -} - -inline std::string fmt(const char * s) -{ - return s; -} - -inline std::string fmt(const FormatOrString & fs) -{ - return fs.s; -} - -template -inline std::string fmt(const std::string & fs, const Args & ... args) -{ - boost::format f(fs); - f.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); - formatHelper(f, args...); - return f.str(); -} + static std::optional programName; +}; +std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo); /* BaseError should generally not be caught, as it has Interrupted as a subclass. Catch Error instead. */ @@ -94,33 +87,42 @@ class BaseError : public std::exception { protected: string prefix_; // used for location traces etc. - string err; + ErrorInfo err; public: unsigned int status = 1; // exit status template BaseError(unsigned int status, const Args & ... args) - : err(fmt(args...)) + : err(hintfmt(args...)) , status(status) { } template BaseError(const Args & ... args) - : err(fmt(args...)) + : err { .level = lvlError, + .hint = hintfmt(args...) + } + { + } + + BaseError(ErrorInfo e) + : err(e) { } #ifdef EXCEPTION_NEEDS_THROW_SPEC ~BaseError() throw () { }; - const char * what() const throw () { return err.c_str(); } + const char * what() const throw () { return err.description.c_str(); } #else - const char * what() const noexcept { return err.c_str(); } + const char * what() const noexcept { return err.description.c_str(); } #endif - const string & msg() const { return err; } + const string & msg() const { return err.description; } const string & prefix() const { return prefix_; } BaseError & addPrefix(const FormatOrString & fs); + + const ErrorInfo & info() const { return err; } }; #define MakeError(newClass, superClass) \ @@ -139,7 +141,8 @@ public: template SysError(const Args & ... args) - : Error(addErrno(fmt(args...))) + : Error(args...) // TODO addErrNo for hintfmt + // : Error(addErrno(hintfmt(args...))) { } private: diff --git a/src/libutil/util.hh b/src/libutil/util.hh index fb9a7ed38..636f3ba6c 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -3,7 +3,6 @@ #include "types.hh" #include "logging.hh" #include "ansicolor.hh" -#include "error.hh" #include #include From e4fb9a38493a041861fe5c75bc8ddd129a2e5262 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 21 Apr 2020 17:07:07 -0600 Subject: [PATCH 005/120] remove 'format' from Error constructor calls --- src/libexpr/attr-path.cc | 16 +-- src/libexpr/eval-inline.hh | 6 +- src/libexpr/eval.cc | 23 ++--- src/libexpr/nixexpr.cc | 2 +- src/libexpr/nixexpr.hh | 4 +- src/libexpr/parser.y | 32 +++--- src/libexpr/primops.cc | 124 +++++++++++------------ src/libexpr/primops/fetchGit.cc | 2 +- src/libexpr/primops/fetchMercurial.cc | 2 +- src/libexpr/value-to-json.cc | 4 +- src/libmain/shared.cc | 10 +- src/libmain/shared.hh | 6 +- src/libstore/binary-cache-store.cc | 8 +- src/libstore/build.cc | 98 +++++++++--------- src/libstore/builtins/buildenv.cc | 10 +- src/libstore/builtins/fetchurl.cc | 4 +- src/libstore/daemon.cc | 2 +- src/libstore/derivations.cc | 6 +- src/libstore/download.cc | 6 +- src/libstore/download.hh | 6 +- src/libstore/gc.cc | 44 ++++---- src/libstore/local-binary-cache-store.cc | 2 +- src/libstore/local-fs-store.cc | 6 +- src/libstore/local-store.cc | 48 ++++----- src/libstore/nar-accessor.cc | 6 +- src/libstore/nar-info.cc | 2 +- src/libstore/optimise-store.cc | 24 ++--- src/libstore/pathlocks.cc | 8 +- src/libstore/profiles.cc | 8 +- src/libstore/references.cc | 2 +- src/libstore/remote-fs-accessor.cc | 2 +- src/libstore/remote-store.cc | 4 +- src/libstore/s3-binary-cache-store.cc | 8 +- src/libstore/sqlite.cc | 2 +- src/libstore/store-api.cc | 4 +- src/libutil/archive.cc | 19 ++-- src/libutil/args.cc | 9 +- src/libutil/compression.cc | 2 +- src/libutil/fmt.hh | 6 +- src/libutil/types.hh | 4 +- src/libutil/util.cc | 50 ++++----- src/nix-channel/nix-channel.cc | 30 ++++-- src/nix-daemon/nix-daemon.cc | 43 ++++---- src/nix-env/nix-env.cc | 55 +++++----- src/nix-instantiate/nix-instantiate.cc | 4 +- src/nix-prefetch-url/nix-prefetch-url.cc | 10 +- src/nix-store/nix-store.cc | 38 +++---- src/nix/cat.cc | 4 +- src/nix/hash.cc | 2 +- src/nix/ls.cc | 2 +- src/nix/repl.cc | 8 +- src/nix/run.cc | 4 +- 52 files changed, 424 insertions(+), 407 deletions(-) diff --git a/src/libexpr/attr-path.cc b/src/libexpr/attr-path.cc index 76d101b98..9a9531a3f 100644 --- a/src/libexpr/attr-path.cc +++ b/src/libexpr/attr-path.cc @@ -19,7 +19,7 @@ static Strings parseAttrPath(const string & s) ++i; while (1) { if (i == s.end()) - throw Error(format("missing closing quote in selection path '%1%'") % s); + throw Error("missing closing quote in selection path '%1%'", s); if (*i == '"') break; cur.push_back(*i++); } @@ -60,11 +60,11 @@ std::pair findAlongAttrPath(EvalState & state, const string & attr if (v->type != tAttrs) throw TypeError( - format("the expression selected by the selection path '%1%' should be a set but is %2%") - % attrPath % showType(*v)); - + "the expression selected by the selection path '%1%' should be a set but is %2%", + attrPath, + showType(*v)); if (attr.empty()) - throw Error(format("empty attribute name in selection path '%1%'") % attrPath); + throw Error("empty attribute name in selection path '%1%'", attrPath); Bindings::iterator a = v->attrs->find(state.symbols.create(attr)); if (a == v->attrs->end()) @@ -77,9 +77,9 @@ std::pair findAlongAttrPath(EvalState & state, const string & attr if (!v->isList()) throw TypeError( - format("the expression selected by the selection path '%1%' should be a list but is %2%") - % attrPath % showType(*v)); - + "the expression selected by the selection path '%1%' should be a list but is %2%", + attrPath, + showType(*v)); if (attrIndex >= v->listSize()) throw AttrPathNotFound("list index %1% in selection path '%2%' is out of range", attrIndex, attrPath); diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh index c27116e3b..4d82ccf09 100644 --- a/src/libexpr/eval-inline.hh +++ b/src/libexpr/eval-inline.hh @@ -9,18 +9,18 @@ namespace nix { LocalNoInlineNoReturn(void throwEvalError(const char * s, const Pos & pos)) { - throw EvalError(format(s) % pos); + throw EvalError(s, pos); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v)) { - throw TypeError(format(s) % showType(v)); + throw TypeError(s, showType(v)); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v, const Pos & pos)) { - throw TypeError(format(s) % showType(v) % pos); + throw TypeError(s, showType(v), pos); } diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index dac32b6f5..516c25b02 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -493,52 +493,52 @@ Value & EvalState::getBuiltin(const string & name) LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2)) { - throw EvalError(format(s) % s2); + throw EvalError(s, s2); } LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const Pos & pos)) { - throw EvalError(format(s) % s2 % pos); + throw EvalError(s, s2, pos); } LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const string & s3)) { - throw EvalError(format(s) % s2 % s3); + throw EvalError(s, s2, s3); } LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const string & s3, const Pos & pos)) { - throw EvalError(format(s) % s2 % s3 % pos); + throw EvalError(s, s2, s3, pos); } LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, const Pos & p1, const Pos & p2)) { - throw EvalError(format(s) % sym % p1 % p2); + throw EvalError(s, sym, p1, p2); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos)) { - throw TypeError(format(s) % pos); + throw TypeError(s, pos); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s1)) { - throw TypeError(format(s) % s1); + throw TypeError(s, s1); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const ExprLambda & fun, const Symbol & s2, const Pos & pos)) { - throw TypeError(format(s) % fun.showNamePos() % s2 % pos); + throw TypeError(s, fun.showNamePos(), s2, pos); } LocalNoInlineNoReturn(void throwAssertionError(const char * s, const string & s1, const Pos & pos)) { - throw AssertionError(format(s) % s1 % pos); + throw AssertionError(s, s1, pos); } LocalNoInlineNoReturn(void throwUndefinedVarError(const char * s, const string & s1, const Pos & pos)) { - throw UndefinedVarError(format(s) % s1 % pos); + throw UndefinedVarError(s, s1, pos); } LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2)) @@ -1883,8 +1883,7 @@ void EvalState::printStats() string ExternalValueBase::coerceToString(const Pos & pos, PathSet & context, bool copyMore, bool copyToStore) const { - throw TypeError(format("cannot coerce %1% to a string, at %2%") % - showType() % pos); + throw TypeError("cannot coerce %1% to a string, at %2%", showType(), pos); } diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index 63cbef1dd..a9955f6df 100644 --- a/src/libexpr/nixexpr.cc +++ b/src/libexpr/nixexpr.cc @@ -267,7 +267,7 @@ void ExprVar::bindVars(const StaticEnv & env) /* Otherwise, the variable must be obtained from the nearest enclosing `with'. If there is no `with', then we can issue an "undefined variable" error now. */ - if (withLevel == -1) throw UndefinedVarError(format("undefined variable '%1%' at %2%") % name % pos); + if (withLevel == -1) throw UndefinedVarError("undefined variable '%1%' at %2%", name, pos); fromWith = true; this->level = withLevel; diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index f7e9105a4..79e3f90e5 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -234,9 +234,7 @@ struct ExprLambda : Expr : pos(pos), arg(arg), matchAttrs(matchAttrs), formals(formals), body(body) { if (!arg.empty() && formals && formals->argNames.find(arg) != formals->argNames.end()) - throw ParseError(format("duplicate formal function argument '%1%' at %2%") - % arg % pos); - }; + throw ParseError("duplicate formal function argument '%1%' at %2%", arg, pos); }; void setName(Symbol & name); string showNamePos() const; COMMON_METHODS diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 9c769e803..3767532d5 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -64,15 +64,15 @@ namespace nix { static void dupAttr(const AttrPath & attrPath, const Pos & pos, const Pos & prevPos) { - throw ParseError(format("attribute '%1%' at %2% already defined at %3%") - % showAttrPath(attrPath) % pos % prevPos); + throw ParseError("attribute '%1%' at %2% already defined at %3%", + showAttrPath(attrPath), pos, prevPos); } static void dupAttr(Symbol attr, const Pos & pos, const Pos & prevPos) { - throw ParseError(format("attribute '%1%' at %2% already defined at %3%") - % attr % pos % prevPos); + throw ParseError("attribute '%1%' at %2% already defined at %3%", + attr, pos, prevPos); } @@ -140,8 +140,8 @@ static void addAttr(ExprAttrs * attrs, AttrPath & attrPath, static void addFormal(const Pos & pos, Formals * formals, const Formal & formal) { if (!formals->argNames.insert(formal.name).second) - throw ParseError(format("duplicate formal function argument '%1%' at %2%") - % formal.name % pos); + throw ParseError("duplicate formal function argument '%1%' at %2%", + formal.name, pos); formals->formals.push_front(formal); } @@ -327,8 +327,7 @@ expr_function { $$ = new ExprWith(CUR_POS, $2, $4); } | LET binds IN expr_function { if (!$2->dynamicAttrs.empty()) - throw ParseError(format("dynamic attributes not allowed in let at %1%") - % CUR_POS); + throw ParseError("dynamic attributes not allowed in let at %1%", CUR_POS); $$ = new ExprLet($2, $4); } | expr_if @@ -475,8 +474,8 @@ attrs $$->push_back(AttrName(str->s)); delete str; } else - throw ParseError(format("dynamic attributes not allowed in inherit at %1%") - % makeCurPos(@2, data)); + throw ParseError("dynamic attributes not allowed in inherit at %1%", + makeCurPos(@2, data)); } | { $$ = new AttrPath; } ; @@ -670,11 +669,10 @@ Path EvalState::findFile(SearchPath & searchPath, const string & path, const Pos Path res = r.second + suffix; if (pathExists(res)) return canonPath(res); } - format f = format( + string f = "file '%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)" - + string(pos ? ", at %2%" : "")); - f.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); - throw ThrownError(f % path % pos); + + string(pos ? ", at %2%" : ""); + throw ThrownError(f, path, pos); } @@ -691,7 +689,8 @@ std::pair EvalState::resolveSearchPathElem(const SearchPathEl request.unpack = true; res = { true, getDownloader()->downloadCached(store, request).path }; } catch (DownloadError & e) { - printError(format("warning: Nix search path entry '%1%' cannot be downloaded, ignoring") % elem.second); + // TODO: change to warn()? + printError("warning: Nix search path entry '%1%' cannot be downloaded, ignoring", elem.second); res = { false, "" }; } } else { @@ -699,7 +698,8 @@ std::pair EvalState::resolveSearchPathElem(const SearchPathEl if (pathExists(path)) res = { true, path }; else { - printError(format("warning: Nix search path entry '%1%' does not exist, ignoring") % elem.second); + // TODO: change to warn()? + printError("warning: Nix search path entry '%1%' does not exist, ignoring", elem.second); res = { false, "" }; } } diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 8de234951..13eb1ba58 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -94,8 +94,8 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError(format("cannot import '%1%', since path '%2%' is not valid, at %3%") - % path % e.path % pos); + throw EvalError("cannot import '%1%', since path '%2%' is not valid, at %3%", + path, e.path, pos); } Path realPath = state.checkSourcePath(state.toRealPath(path, context)); @@ -171,8 +171,8 @@ void prim_importNative(EvalState & state, const Pos & pos, Value * * args, Value try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError(format("cannot import '%1%', since path '%2%' is not valid, at %3%") - % path % e.path % pos); + throw EvalError("cannot import '%1%', since path '%2%' is not valid, at %3%" + , path, e.path, pos); } path = state.checkSourcePath(path); @@ -181,17 +181,17 @@ void prim_importNative(EvalState & state, const Pos & pos, Value * * args, Value void *handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_LOCAL); if (!handle) - throw EvalError(format("could not open '%1%': %2%") % path % dlerror()); + throw EvalError("could not open '%1%': %2%", path, dlerror()); dlerror(); ValueInitializer func = (ValueInitializer) dlsym(handle, sym.c_str()); if(!func) { char *message = dlerror(); if (message) - throw EvalError(format("could not load symbol '%1%' from '%2%': %3%") % sym % path % message); + throw EvalError("could not load symbol '%1%' from '%2%': %3%", sym, path, message); else - throw EvalError(format("symbol '%1%' from '%2%' resolved to NULL when a function pointer was expected") - % sym % path); + throw EvalError("symbol '%1%' from '%2%' resolved to NULL when a function pointer was expected" + , sym, path); } (func)(state, v); @@ -207,7 +207,7 @@ void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v) auto elems = args[0]->listElems(); auto count = args[0]->listSize(); if (count == 0) { - throw EvalError(format("at least one argument to 'exec' required, at %1%") % pos); + throw EvalError("at least one argument to 'exec' required, at %1%", pos); } PathSet context; auto program = state.coerceToString(pos, *elems[0], context, false, false); @@ -218,8 +218,8 @@ void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v) try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError(format("cannot execute '%1%', since path '%2%' is not valid, at %3%") - % program % e.path % pos); + throw EvalError("cannot execute '%1%', since path '%2%' is not valid, at %3%" + , program, e.path, pos); } auto output = runProgram(program, true, commandArgs); @@ -227,13 +227,13 @@ void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v) try { parsed = state.parseExprFromString(output, pos.file); } catch (Error & e) { - e.addPrefix(format("While parsing the output from '%1%', at %2%\n") % program % pos); + e.addPrefix(fmt("While parsing the output from '%1%', at %2%\n", program, pos)); throw; } try { state.eval(parsed, v); } catch (Error & e) { - e.addPrefix(format("While evaluating the output from '%1%', at %2%\n") % program % pos); + e.addPrefix(fmt("While evaluating the output from '%1%', at %2%\n", program, pos)); throw; } } @@ -339,7 +339,7 @@ struct CompareValues if (v1->type == tInt && v2->type == tFloat) return v1->integer < v2->fpoint; if (v1->type != v2->type) - throw EvalError(format("cannot compare %1% with %2%") % showType(*v1) % showType(*v2)); + throw EvalError("cannot compare %1% with %2%", showType(*v1), showType(*v2)); switch (v1->type) { case tInt: return v1->integer < v2->integer; @@ -350,7 +350,7 @@ struct CompareValues case tPath: return strcmp(v1->path, v2->path) < 0; default: - throw EvalError(format("cannot compare %1% with %2%") % showType(*v1) % showType(*v2)); + throw EvalError("cannot compare %1% with %2%", showType(*v1), showType(*v2)); } } }; @@ -371,7 +371,7 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar Bindings::iterator startSet = args[0]->attrs->find(state.symbols.create("startSet")); if (startSet == args[0]->attrs->end()) - throw EvalError(format("attribute 'startSet' required, at %1%") % pos); + throw EvalError("attribute 'startSet' required, at %1%", pos); state.forceList(*startSet->value, pos); ValueList workSet; @@ -382,7 +382,7 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar Bindings::iterator op = args[0]->attrs->find(state.symbols.create("operator")); if (op == args[0]->attrs->end()) - throw EvalError(format("attribute 'operator' required, at %1%") % pos); + throw EvalError("attribute 'operator' required, at %1%", pos); state.forceValue(*op->value); /* Construct the closure by applying the operator to element of @@ -401,7 +401,7 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar Bindings::iterator key = e->attrs->find(state.symbols.create("key")); if (key == e->attrs->end()) - throw EvalError(format("attribute 'key' required, at %1%") % pos); + throw EvalError("attribute 'key' required, at %1%", pos); state.forceValue(*key->value); if (!doneKeys.insert(key->value).second) continue; @@ -431,7 +431,7 @@ static void prim_abort(EvalState & state, const Pos & pos, Value * * args, Value { PathSet context; string s = state.coerceToString(pos, *args[0], context); - throw Abort(format("evaluation aborted with the following error message: '%1%'") % s); + throw Abort("evaluation aborted with the following error message: '%1%'", s); } @@ -506,9 +506,9 @@ static void prim_trace(EvalState & state, const Pos & pos, Value * * args, Value { state.forceValue(*args[0]); if (args[0]->type == tString) - printError(format("trace: %1%") % args[0]->string.s); + printError("trace: %1%", args[0]->string.s); else - printError(format("trace: %1%") % *args[0]); + printError("trace: %1%", *args[0]); state.forceValue(*args[1]); v = *args[1]; } @@ -533,13 +533,13 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * /* Figure out the name first (for stack backtraces). */ Bindings::iterator attr = args[0]->attrs->find(state.sName); if (attr == args[0]->attrs->end()) - throw EvalError(format("required attribute 'name' missing, at %1%") % pos); + throw EvalError("required attribute 'name' missing, at %1%", pos); string drvName; Pos & posDrvName(*attr->pos); try { drvName = state.forceStringNoCtx(*attr->value, pos); } catch (Error & e) { - e.addPrefix(format("while evaluating the derivation attribute 'name' at %1%:\n") % posDrvName); + e.addPrefix(fmt("while evaluating the derivation attribute 'name' at %1%:\n", posDrvName)); throw; } @@ -583,18 +583,18 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * outputs.clear(); for (auto & j : ss) { if (outputs.find(j) != outputs.end()) - throw EvalError(format("duplicate derivation output '%1%', at %2%") % j % posDrvName); + throw EvalError("duplicate derivation output '%1%', at %2%", j, posDrvName); /* !!! Check whether j is a valid attribute name. */ /* Derivations cannot be named ‘drv’, because then we'd have an attribute ‘drvPath’ in the resulting set. */ if (j == "drv") - throw EvalError(format("invalid derivation output name 'drv', at %1%") % posDrvName); + throw EvalError("invalid derivation output name 'drv', at %1%", posDrvName); outputs.insert(j); } if (outputs.empty()) - throw EvalError(format("derivation cannot have an empty set of outputs, at %1%") % posDrvName); + throw EvalError("derivation cannot have an empty set of outputs, at %1%", posDrvName); }; try { @@ -706,9 +706,9 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * /* Do we have all required attributes? */ if (drv.builder == "") - throw EvalError(format("required attribute 'builder' missing, at %1%") % posDrvName); + throw EvalError("required attribute 'builder' missing, at %1%", posDrvName); if (drv.platform == "") - throw EvalError(format("required attribute 'system' missing, at %1%") % posDrvName); + throw EvalError("required attribute 'system' missing, at %1%", posDrvName); /* Check whether the derivation name is valid. */ if (isDerivation(drvName)) @@ -717,7 +717,7 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * if (outputHash) { /* Handle fixed-output derivations. */ if (outputs.size() != 1 || *(outputs.begin()) != "out") - throw Error(format("multiple outputs are not supported in fixed-output derivations, at %1%") % posDrvName); + throw Error("multiple outputs are not supported in fixed-output derivations, at %1%", posDrvName); HashType ht = outputHashAlgo.empty() ? htUnknown : parseHashType(outputHashAlgo); Hash h(*outputHash, ht); @@ -818,7 +818,7 @@ static void prim_storePath(EvalState & state, const Pos & pos, Value * * args, V e.g. nix-push does the right thing. */ if (!state.store->isStorePath(path)) path = canonPath(path, true); if (!state.store->isInStore(path)) - throw EvalError(format("path '%1%' is not in the Nix store, at %2%") % path % pos); + throw EvalError("path '%1%' is not in the Nix store, at %2%", path, pos); Path path2 = state.store->toStorePath(path); if (!settings.readOnlyMode) state.store->ensurePath(state.store->parseStorePath(path2)); @@ -834,9 +834,9 @@ static void prim_pathExists(EvalState & state, const Pos & pos, Value * * args, try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError(format( - "cannot check the existence of '%1%', since path '%2%' is not valid, at %3%") - % path % e.path % pos); + throw EvalError( + "cannot check the existence of '%1%', since path '%2%' is not valid, at %3%", + path, e.path, pos); } try { @@ -879,12 +879,12 @@ static void prim_readFile(EvalState & state, const Pos & pos, Value * * args, Va try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError(format("cannot read '%1%', since path '%2%' is not valid, at %3%") - % path % e.path % pos); + throw EvalError("cannot read '%1%', since path '%2%' is not valid, at %3%" + , path, e.path, pos); } string s = readFile(state.checkSourcePath(state.toRealPath(path, context))); if (s.find((char) 0) != string::npos) - throw Error(format("the contents of the file '%1%' cannot be represented as a Nix string") % path); + throw Error("the contents of the file '%1%' cannot be represented as a Nix string", path); mkString(v, s.c_str()); } @@ -908,7 +908,7 @@ static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Va i = v2.attrs->find(state.symbols.create("path")); if (i == v2.attrs->end()) - throw EvalError(format("attribute 'path' missing, at %1%") % pos); + throw EvalError("attribute 'path' missing, at %1%", pos); PathSet context; string path = state.coerceToString(pos, *i->value, context, false, false); @@ -916,8 +916,8 @@ static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Va try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError(format("cannot find '%1%', since path '%2%' is not valid, at %3%") - % path % e.path % pos); + throw EvalError("cannot find '%1%', since path '%2%' is not valid, at %3%", + path, e.path, pos); } searchPath.emplace_back(prefix, path); @@ -934,7 +934,7 @@ static void prim_hashFile(EvalState & state, const Pos & pos, Value * * args, Va string type = state.forceStringNoCtx(*args[0], pos); HashType ht = parseHashType(type); if (ht == htUnknown) - throw Error(format("unknown hash type '%1%', at %2%") % type % pos); + throw Error("unknown hash type '%1%', at %2%", type, pos); PathSet context; // discarded Path p = state.coerceToPath(pos, *args[1], context); @@ -950,8 +950,8 @@ static void prim_readDir(EvalState & state, const Pos & pos, Value * * args, Val try { state.realiseContext(ctx); } catch (InvalidPathError & e) { - throw EvalError(format("cannot read '%1%', since path '%2%' is not valid, at %3%") - % path % e.path % pos); + throw EvalError("cannot read '%1%', since path '%2%' is not valid, at %3%", + path, e.path, pos); } DirEntries entries = readDirectory(state.checkSourcePath(path)); @@ -1021,7 +1021,7 @@ static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Valu for (auto path : context) { if (path.at(0) != '/') - throw EvalError(format("in 'toFile': the file '%1%' cannot refer to derivation outputs, at %2%") % name % pos); + throw EvalError("in 'toFile': the file '%1%' cannot refer to derivation outputs, at %2%", name, pos); refs.insert(state.store->parseStorePath(path)); } @@ -1089,11 +1089,11 @@ static void prim_filterSource(EvalState & state, const Pos & pos, Value * * args PathSet context; Path path = state.coerceToPath(pos, *args[1], context); if (!context.empty()) - throw EvalError(format("string '%1%' cannot refer to other paths, at %2%") % path % pos); + throw EvalError("string '%1%' cannot refer to other paths, at %2%", path, pos); state.forceValue(*args[0]); if (args[0]->type != tLambda) - throw TypeError(format("first argument in call to 'filterSource' is not a function but %1%, at %2%") % showType(*args[0]) % pos); + throw TypeError("first argument in call to 'filterSource' is not a function but %1%, at %2%", showType(*args[0]), pos); addPath(state, pos, std::string(baseNameOf(path)), path, args[0], true, Hash(), v); } @@ -1113,7 +1113,7 @@ static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value PathSet context; path = state.coerceToPath(*attr.pos, *attr.value, context); if (!context.empty()) - throw EvalError(format("string '%1%' cannot refer to other paths, at %2%") % path % *attr.pos); + throw EvalError("string '%1%' cannot refer to other paths, at %2%", path, *attr.pos); } else if (attr.name == state.sName) name = state.forceStringNoCtx(*attr.value, *attr.pos); else if (n == "filter") { @@ -1124,10 +1124,10 @@ static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value else if (n == "sha256") expectedHash = Hash(state.forceStringNoCtx(*attr.value, *attr.pos), htSHA256); else - throw EvalError(format("unsupported argument '%1%' to 'addPath', at %2%") % attr.name % *attr.pos); + throw EvalError("unsupported argument '%1%' to 'addPath', at %2%", attr.name, *attr.pos); } if (path.empty()) - throw EvalError(format("'path' required, at %1%") % pos); + throw EvalError("'path' required, at %1%", pos); if (name.empty()) name = baseNameOf(path); @@ -1185,7 +1185,7 @@ void prim_getAttr(EvalState & state, const Pos & pos, Value * * args, Value & v) // !!! Should we create a symbol here or just do a lookup? Bindings::iterator i = args[1]->attrs->find(state.symbols.create(attr)); if (i == args[1]->attrs->end()) - throw EvalError(format("attribute '%1%' missing, at %2%") % attr % pos); + throw EvalError("attribute '%1%' missing, at %2%", attr, pos); // !!! add to stack trace? if (state.countCalls && i->pos) state.attrSelects[*i->pos]++; state.forceValue(*i->value); @@ -1265,14 +1265,14 @@ static void prim_listToAttrs(EvalState & state, const Pos & pos, Value * * args, Bindings::iterator j = v2.attrs->find(state.sName); if (j == v2.attrs->end()) - throw TypeError(format("'name' attribute missing in a call to 'listToAttrs', at %1%") % pos); + throw TypeError("'name' attribute missing in a call to 'listToAttrs', at %1%", pos); string name = state.forceStringNoCtx(*j->value, pos); Symbol sym = state.symbols.create(name); if (seen.insert(sym).second) { Bindings::iterator j2 = v2.attrs->find(state.symbols.create(state.sValue)); if (j2 == v2.attrs->end()) - throw TypeError(format("'value' attribute missing in a call to 'listToAttrs', at %1%") % pos); + throw TypeError("'value' attribute missing in a call to 'listToAttrs', at %1%", pos); v.attrs->push_back(Attr(sym, j2->value, j2->pos)); } @@ -1346,7 +1346,7 @@ static void prim_functionArgs(EvalState & state, const Pos & pos, Value * * args { state.forceValue(*args[0]); if (args[0]->type != tLambda) - throw TypeError(format("'functionArgs' requires a function, at %1%") % pos); + throw TypeError("'functionArgs' requires a function, at %1%", pos); if (!args[0]->lambda.fun->matchAttrs) { state.mkAttrs(v, 0); @@ -1396,7 +1396,7 @@ static void elemAt(EvalState & state, const Pos & pos, Value & list, int n, Valu { state.forceList(list, pos); if (n < 0 || (unsigned int) n >= list.listSize()) - throw Error(format("list index %1% is out of bounds, at %2%") % n % pos); + throw Error("list index %1% is out of bounds, at %2%", n, pos); state.forceValue(*list.listElems()[n]); v = *list.listElems()[n]; } @@ -1423,7 +1423,7 @@ static void prim_tail(EvalState & state, const Pos & pos, Value * * args, Value { state.forceList(*args[0], pos); if (args[0]->listSize() == 0) - throw Error(format("'tail' called on an empty list, at %1%") % pos); + throw Error("'tail' called on an empty list, at %1%", pos); state.mkList(v, args[0]->listSize() - 1); for (unsigned int n = 0; n < v.listSize(); ++n) v.listElems()[n] = args[0]->listElems()[n + 1]; @@ -1564,7 +1564,7 @@ static void prim_genList(EvalState & state, const Pos & pos, Value * * args, Val auto len = state.forceInt(*args[1], pos); if (len < 0) - throw EvalError(format("cannot create list of size %1%, at %2%") % len % pos); + throw EvalError("cannot create list of size %1%, at %2%", len, pos); state.mkList(v, len); @@ -1722,7 +1722,7 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value & state.forceValue(*args[1], pos); NixFloat f2 = state.forceFloat(*args[1], pos); - if (f2 == 0) throw EvalError(format("division by zero, at %1%") % pos); + if (f2 == 0) throw EvalError("division by zero, at %1%", pos); if (args[0]->type == tFloat || args[1]->type == tFloat) { mkFloat(v, state.forceFloat(*args[0], pos) / state.forceFloat(*args[1], pos)); @@ -1731,7 +1731,7 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value & NixInt i2 = state.forceInt(*args[1], pos); /* Avoid division overflow as it might raise SIGFPE. */ if (i1 == std::numeric_limits::min() && i2 == -1) - throw EvalError(format("overflow in integer division, at %1%") % pos); + throw EvalError("overflow in integer division, at %1%", pos); mkInt(v, i1 / i2); } } @@ -1787,7 +1787,7 @@ static void prim_substring(EvalState & state, const Pos & pos, Value * * args, V PathSet context; string s = state.coerceToString(pos, *args[2], context); - if (start < 0) throw EvalError(format("negative start position in 'substring', at %1%") % pos); + if (start < 0) throw EvalError("negative start position in 'substring', at %1%", pos); mkString(v, (unsigned int) start >= s.size() ? "" : string(s, start, len), context); } @@ -1807,7 +1807,7 @@ static void prim_hashString(EvalState & state, const Pos & pos, Value * * args, string type = state.forceStringNoCtx(*args[0], pos); HashType ht = parseHashType(type); if (ht == htUnknown) - throw Error(format("unknown hash type '%1%', at %2%") % type % pos); + throw Error("unknown hash type '%1%', at %2%", type, pos); PathSet context; // discarded string s = state.forceString(*args[1], context, pos); @@ -1950,7 +1950,7 @@ static void prim_replaceStrings(EvalState & state, const Pos & pos, Value * * ar state.forceList(*args[0], pos); state.forceList(*args[1], pos); if (args[0]->listSize() != args[1]->listSize()) - throw EvalError(format("'from' and 'to' arguments to 'replaceStrings' have different lengths, at %1%") % pos); + throw EvalError("'from' and 'to' arguments to 'replaceStrings' have different lengths, at %1%", pos); vector from; from.reserve(args[0]->listSize()); @@ -2072,11 +2072,11 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v, else if (n == "name") request.name = state.forceStringNoCtx(*attr.value, *attr.pos); else - throw EvalError(format("unsupported argument '%1%' to '%2%', at %3%") % attr.name % who % attr.pos); + throw EvalError("unsupported argument '%1%' to '%2%', at %3%", attr.name, who, attr.pos); } if (request.uri.empty()) - throw EvalError(format("'url' argument required, at %1%") % pos); + throw EvalError("'url' argument required, at %1%", pos); } else request.uri = state.forceStringNoCtx(*args[0], pos); diff --git a/src/libexpr/primops/fetchGit.cc b/src/libexpr/primops/fetchGit.cc index 4aee1073e..480cc1adc 100644 --- a/src/libexpr/primops/fetchGit.cc +++ b/src/libexpr/primops/fetchGit.cc @@ -221,7 +221,7 @@ static void prim_fetchGit(EvalState & state, const Pos & pos, Value * * args, Va } if (url.empty()) - throw EvalError(format("'url' argument required, at %1%") % pos); + throw EvalError("'url' argument required, at %1%", pos); } else url = state.coerceToString(pos, *args[0], context, false, false); diff --git a/src/libexpr/primops/fetchMercurial.cc b/src/libexpr/primops/fetchMercurial.cc index db274fa4f..76029f548 100644 --- a/src/libexpr/primops/fetchMercurial.cc +++ b/src/libexpr/primops/fetchMercurial.cc @@ -191,7 +191,7 @@ static void prim_fetchMercurial(EvalState & state, const Pos & pos, Value * * ar } if (url.empty()) - throw EvalError(format("'url' argument required, at %1%") % pos); + throw EvalError("'url' argument required, at %1%", pos); } else url = state.coerceToString(pos, *args[0], context, false, false); diff --git a/src/libexpr/value-to-json.cc b/src/libexpr/value-to-json.cc index 5fe8570ad..6ec8315ba 100644 --- a/src/libexpr/value-to-json.cc +++ b/src/libexpr/value-to-json.cc @@ -79,7 +79,7 @@ void printValueAsJSON(EvalState & state, bool strict, break; default: - throw TypeError(format("cannot convert %1% to JSON") % showType(v)); + throw TypeError("cannot convert %1% to JSON", showType(v)); } } @@ -93,7 +93,7 @@ void printValueAsJSON(EvalState & state, bool strict, void ExternalValueBase::printValueAsJSON(EvalState & state, bool strict, JSONPlaceholder & out, PathSet & context) const { - throw TypeError(format("cannot convert %1% to JSON") % showType()); + throw TypeError("cannot convert %1% to JSON", showType()); } diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index d41e772e9..f7ab56271 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -75,7 +75,7 @@ string getArg(const string & opt, Strings::iterator & i, const Strings::iterator & end) { ++i; - if (i == end) throw UsageError(format("'%1%' requires an argument") % opt); + if (i == end) throw UsageError("'%1%' requires an argument", opt); return *i; } @@ -229,7 +229,7 @@ bool LegacyArgs::processArgs(const Strings & args, bool finish) Strings ss(args); auto pos = ss.begin(); if (!parseArg(pos, ss.end())) - throw UsageError(format("unexpected argument '%1%'") % args.front()); + throw UsageError("unexpected argument '%1%'", args.front()); return true; } @@ -273,7 +273,7 @@ void showManPage(const string & name) restoreSignals(); setenv("MANPATH", settings.nixManDir.c_str(), 1); execlp("man", "man", name.c_str(), nullptr); - throw SysError(format("command 'man %1%' failed") % name.c_str()); + throw SysError("command 'man %1%' failed", name.c_str()); } @@ -301,7 +301,7 @@ int handleExceptions(const string & programName, std::function fun) % e.what() % programName); return 1; } catch (BaseError & e) { - printError(format(error + "%1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg()); + printError(error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); if (e.prefix() != "" && !settings.showTrace) printError("(use '--show-trace' to show detailed location information)"); return e.status; @@ -338,7 +338,7 @@ RunPager::RunPager() execlp("pager", "pager", nullptr); execlp("less", "less", nullptr); execlp("more", "more", nullptr); - throw SysError(format("executing '%1%'") % pager); + throw SysError("executing '%1%'", pager); }); pid.setKillSignal(SIGINT); diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index b49574652..f558247c0 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -56,7 +56,7 @@ template N getIntArg(const string & opt, Strings::iterator & i, const Strings::iterator & end, bool allowUnit) { ++i; - if (i == end) throw UsageError(format("'%1%' requires an argument") % opt); + if (i == end) throw UsageError("'%1%' requires an argument", opt); string s = *i; N multiplier = 1; if (allowUnit && !s.empty()) { @@ -66,13 +66,13 @@ template N getIntArg(const string & opt, else if (u == 'M') multiplier = 1ULL << 20; else if (u == 'G') multiplier = 1ULL << 30; else if (u == 'T') multiplier = 1ULL << 40; - else throw UsageError(format("invalid unit specifier '%1%'") % u); + else throw UsageError("invalid unit specifier '%1%'", u); s.resize(s.size() - 1); } } N n; if (!string2Int(s, n)) - throw UsageError(format("'%1%' requires an integer argument") % opt); + throw UsageError("'%1%' requires an integer argument", opt); return n * multiplier; } diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc index 3a2d84861..4b7385c6b 100644 --- a/src/libstore/binary-cache-store.cc +++ b/src/libstore/binary-cache-store.cc @@ -40,14 +40,14 @@ void BinaryCacheStore::init() upsertFile(cacheInfoFile, "StoreDir: " + storeDir + "\n", "text/x-nix-cache-info"); } else { for (auto & line : tokenizeString(*cacheInfo, "\n")) { - size_t colon = line.find(':'); - if (colon == std::string::npos) continue; + size_t colon= line.find(':'); + if (colon ==std::string::npos) continue; auto name = line.substr(0, colon); auto value = trim(line.substr(colon + 1, std::string::npos)); if (name == "StoreDir") { if (value != storeDir) - throw Error(format("binary cache '%s' is for Nix stores with prefix '%s', not '%s'") - % getUri() % value % storeDir); + throw Error("binary cache '%s' is for Nix stores with prefix '%s', not '%s'", + getUri(), value, storeDir); } else if (name == "WantMassQuery") { wantMassQuery.setDefault(value == "1" ? "true" : "false"); } else if (name == "Priority") { diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 527d7ac42..2301adb16 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -453,7 +453,7 @@ static void commonChildInit(Pipe & logPipe) that e.g. ssh cannot open /dev/tty) and it doesn't receive terminal signals. */ if (setsid() == -1) - throw SysError(format("creating a new session")); + throw SysError("creating a new session"); /* Dup the write side of the logger pipe into stderr. */ if (dup2(logPipe.writeSide.get(), STDERR_FILENO) == -1) @@ -466,7 +466,7 @@ static void commonChildInit(Pipe & logPipe) /* Reroute stdin to /dev/null. */ int fdDevNull = open(pathNullDevice.c_str(), O_RDWR); if (fdDevNull == -1) - throw SysError(format("cannot open '%1%'") % pathNullDevice); + throw SysError("cannot open '%1%'", pathNullDevice); if (dup2(fdDevNull, STDIN_FILENO) == -1) throw SysError("cannot dup null device into stdin"); close(fdDevNull); @@ -488,7 +488,7 @@ void handleDiffHook( auto diffRes = runProgram(diffHookOptions); if (!statusOk(diffRes.first)) - throw ExecError(diffRes.first, fmt("diff-hook program '%1%' %2%", diffHook, statusToString(diffRes.first))); + throw ExecError(diffRes.first, "diff-hook program '%1%' %2%", diffHook, statusToString(diffRes.first)); if (diffRes.second != "") printError(chomp(diffRes.second)); @@ -534,8 +534,8 @@ UserLock::UserLock() /* Get the members of the build-users-group. */ struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str()); if (!gr) - throw Error(format("the group '%1%' specified in 'build-users-group' does not exist") - % settings.buildUsersGroup); + throw Error("the group '%1%' specified in 'build-users-group' does not exist", + settings.buildUsersGroup); gid = gr->gr_gid; /* Copy the result of getgrnam. */ @@ -546,8 +546,8 @@ UserLock::UserLock() } if (users.empty()) - throw Error(format("the build users group '%1%' has no members") - % settings.buildUsersGroup); + throw Error("the build users group '%1%' has no members", + settings.buildUsersGroup); /* Find a user account that isn't currently in use for another build. */ @@ -556,8 +556,8 @@ UserLock::UserLock() struct passwd * pw = getpwnam(i.c_str()); if (!pw) - throw Error(format("the user '%1%' in the group '%2%' does not exist") - % i % settings.buildUsersGroup); + throw Error("the user '%1%' in the group '%2%' does not exist", + i, settings.buildUsersGroup); createDirs(settings.nixStateDir + "/userpool"); @@ -565,7 +565,7 @@ UserLock::UserLock() AutoCloseFD fd = open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600); if (!fd) - throw SysError(format("opening user lock '%1%'") % fnUserLock); + throw SysError("opening user lock '%1%'", fnUserLock); if (lockFile(fd.get(), ltWrite, false)) { fdUserLock = std::move(fd); @@ -574,8 +574,8 @@ UserLock::UserLock() /* Sanity check... */ if (uid == getuid() || uid == geteuid()) - throw Error(format("the Nix user should not be a member of '%1%'") - % settings.buildUsersGroup); + throw Error("the Nix user should not be a member of '%1%'", + settings.buildUsersGroup); #if __linux__ /* Get the list of supplementary groups of this build user. This @@ -585,7 +585,7 @@ UserLock::UserLock() int err = getgrouplist(pw->pw_name, pw->pw_gid, supplementaryGIDs.data(), &ngroups); if (err == -1) - throw Error(format("failed to get list of supplementary groups for '%1%'") % pw->pw_name); + throw Error("failed to get list of supplementary groups for '%1%'", pw->pw_name); supplementaryGIDs.resize(ngroups); #endif @@ -594,9 +594,9 @@ UserLock::UserLock() } } - throw Error(format("all build users are currently in use; " - "consider creating additional users and adding them to the '%1%' group") - % settings.buildUsersGroup); + throw Error("all build users are currently in use; " + "consider creating additional users and adding them to the '%1%' group", + settings.buildUsersGroup); } @@ -1985,7 +1985,7 @@ void DerivationGoal::startBuilder() string s = get(drv->env, "exportReferencesGraph").value_or(""); Strings ss = tokenizeString(s); if (ss.size() % 2 != 0) - throw BuildError(format("odd number of tokens in 'exportReferencesGraph': '%1%'") % s); + throw BuildError("odd number of tokens in 'exportReferencesGraph': '%1%'", s); for (Strings::iterator i = ss.begin(); i != ss.end(); ) { string fileName = *i++; static std::regex regex("[A-Za-z_][A-Za-z0-9_.-]*"); @@ -2034,7 +2034,7 @@ void DerivationGoal::startBuilder() worker.store.computeFSClosure(worker.store.parseStorePath(worker.store.toStorePath(i.second.source)), closure); } catch (InvalidPath & e) { } catch (Error & e) { - throw Error(format("while processing 'sandbox-paths': %s") % e.what()); + throw Error("while processing 'sandbox-paths': %s", e.what()); } for (auto & i : closure) { auto p = worker.store.printStorePath(i); @@ -2081,10 +2081,10 @@ void DerivationGoal::startBuilder() printMsg(lvlChatty, format("setting up chroot environment in '%1%'") % chrootRootDir); if (mkdir(chrootRootDir.c_str(), 0750) == -1) - throw SysError(format("cannot create '%1%'") % chrootRootDir); + throw SysError("cannot create '%1%'", chrootRootDir); if (buildUser && chown(chrootRootDir.c_str(), 0, buildUser->getGID()) == -1) - throw SysError(format("cannot change ownership of '%1%'") % chrootRootDir); + throw SysError("cannot change ownership of '%1%'", chrootRootDir); /* Create a writable /tmp in the chroot. Many builders need this. (Of course they should really respect $TMPDIR @@ -2128,7 +2128,7 @@ void DerivationGoal::startBuilder() chmod_(chrootStoreDir, 01775); if (buildUser && chown(chrootStoreDir.c_str(), 0, buildUser->getGID()) == -1) - throw SysError(format("cannot change ownership of '%1%'") % chrootStoreDir); + throw SysError("cannot change ownership of '%1%'", chrootStoreDir); for (auto & i : inputPaths) { auto p = worker.store.printStorePath(i); @@ -2161,7 +2161,7 @@ void DerivationGoal::startBuilder() if (needsHashRewrite()) { if (pathExists(homeDir)) - throw Error(format("directory '%1%' exists; please remove it") % homeDir); + throw Error("directory '%1%' exists; please remove it", homeDir); /* We're not doing a chroot build, but we have some valid output paths. Since we can't just overwrite or delete @@ -2206,8 +2206,7 @@ void DerivationGoal::startBuilder() if (line == "extra-sandbox-paths" || line == "extra-chroot-dirs") { state = stExtraChrootDirs; } else { - throw Error(format("unknown pre-build hook command '%1%'") - % line); + throw Error("unknown pre-build hook command '%1%'", line); } } else if (state == stExtraChrootDirs) { if (line == "") { @@ -2967,7 +2966,7 @@ void DerivationGoal::chownToBuilder(const Path & path) { if (!buildUser) return; if (chown(path.c_str(), buildUser->getUID(), buildUser->getGID()) == -1) - throw SysError(format("cannot change ownership of '%1%'") % path); + throw SysError("cannot change ownership of '%1%'", path); } @@ -3104,7 +3103,7 @@ void DerivationGoal::runChild() /* Bind-mount chroot directory to itself, to treat it as a different filesystem from /, as needed for pivot_root. */ if (mount(chrootRootDir.c_str(), chrootRootDir.c_str(), 0, MS_BIND, 0) == -1) - throw SysError(format("unable to bind mount '%1%'") % chrootRootDir); + throw SysError("unable to bind mount '%1%'", chrootRootDir); /* Bind-mount the sandbox's Nix store onto itself so that we can mark it as a "shared" subtree, allowing bind @@ -3238,16 +3237,16 @@ void DerivationGoal::runChild() /* Do the chroot(). */ if (chdir(chrootRootDir.c_str()) == -1) - throw SysError(format("cannot change directory to '%1%'") % chrootRootDir); + throw SysError("cannot change directory to '%1%'", chrootRootDir); if (mkdir("real-root", 0) == -1) throw SysError("cannot create real-root directory"); if (pivot_root(".", "real-root") == -1) - throw SysError(format("cannot pivot old root directory onto '%1%'") % (chrootRootDir + "/real-root")); + throw SysError("cannot pivot old root directory onto '%1%'", (chrootRootDir + "/real-root")); if (chroot(".") == -1) - throw SysError(format("cannot change root directory to '%1%'") % chrootRootDir); + throw SysError("cannot change root directory to '%1%'", chrootRootDir); if (umount2("real-root", MNT_DETACH) == -1) throw SysError("cannot unmount real root filesystem"); @@ -3268,7 +3267,7 @@ void DerivationGoal::runChild() #endif if (chdir(tmpDirInSandbox.c_str()) == -1) - throw SysError(format("changing into '%1%'") % tmpDir); + throw SysError("changing into '%1%'", tmpDir); /* Close all other file descriptors. */ closeMostFDs({STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO}); @@ -3407,9 +3406,9 @@ void DerivationGoal::runChild() sandboxProfile += "(allow file-read* file-write* process-exec\n"; for (auto & i : dirsInChroot) { if (i.first != i.second.source) - throw Error(format( - "can't map '%1%' to '%2%': mismatched impure paths not supported on Darwin") - % i.first % i.second.source); + throw Error( + "can't map '%1%' to '%2%': mismatched impure paths not supported on Darwin", + i.first, i.second.source); string path = i.first; struct stat st; @@ -3500,7 +3499,7 @@ void DerivationGoal::runChild() else if (drv->builder == "builtin:unpack-channel") builtinUnpackChannel(drv2); else - throw Error(format("unsupported builtin function '%1%'") % string(drv->builder, 8)); + throw Error("unsupported builtin function '%1%'", string(drv->builder, 8)); _exit(0); } catch (std::exception & e) { writeFull(STDERR_FILENO, "error: " + string(e.what()) + "\n"); @@ -3510,7 +3509,7 @@ void DerivationGoal::runChild() execve(builder, stringsToCharPtrs(args).data(), stringsToCharPtrs(envStrs).data()); - throw SysError(format("executing '%1%'") % drv->builder); + throw SysError("executing '%1%'", drv->builder); } catch (std::exception & e) { writeFull(STDERR_FILENO, "\1while setting up the build environment: " + string(e.what()) + "\n"); @@ -3595,7 +3594,7 @@ void DerivationGoal::registerOutputs() replaceValidPath(path, actualPath); else if (buildMode != bmCheck && rename(actualPath.c_str(), worker.store.toRealPath(path).c_str()) == -1) - throw SysError(format("moving build output '%1%' from the sandbox to the Nix store") % path); + throw SysError("moving build output '%1%' from the sandbox to the Nix store", path); } if (buildMode != bmCheck) actualPath = worker.store.toRealPath(path); } @@ -3616,13 +3615,13 @@ void DerivationGoal::registerOutputs() user. */ if ((!S_ISLNK(st.st_mode) && (st.st_mode & (S_IWGRP | S_IWOTH))) || (buildUser && st.st_uid != buildUser->getUID())) - throw BuildError(format("suspicious ownership or permission on '%1%'; rejecting this build output") % path); + throw BuildError("suspicious ownership or permission on '%1%'; rejecting this build output", path); #endif /* Apply hash rewriting if necessary. */ bool rewritten = false; if (!outputRewrites.empty()) { - printError(format("warning: rewriting hashes in '%1%'; cross fingers") % path); + printError("warning: rewriting hashes in '%1%'; cross fingers", path); /* Canonicalise first. This ensures that the path we're rewriting doesn't contain a hard link to /etc/shadow or @@ -3654,7 +3653,8 @@ void DerivationGoal::registerOutputs() /* The output path should be a regular file without execute permission. */ if (!S_ISREG(st.st_mode) || (st.st_mode & S_IXUSR) != 0) throw BuildError( - format("output path '%1%' should be a non-executable regular file") % path); + "output path '%1%' should be a non-executable regular file", + path); } /* Check the hash. In hash mode, move the path produced by @@ -3715,7 +3715,7 @@ void DerivationGoal::registerOutputs() Path dst = worker.store.toRealPath(path + checkSuffix); deletePath(dst); if (rename(actualPath.c_str(), dst.c_str())) - throw SysError(format("renaming '%1%' to '%2%'") % actualPath % dst); + throw SysError("renaming '%1%' to '%2%'", actualPath, dst); handleDiffHook( buildUser ? buildUser->getUID() : getuid(), @@ -4014,7 +4014,7 @@ Path DerivationGoal::openLogFile() settings.compressLog ? ".bz2" : ""); fdLogFile = open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC, 0666); - if (!fdLogFile) throw SysError(format("creating log file '%1%'") % logFileName); + if (!fdLogFile) throw SysError("creating log file '%1%'", logFileName); logFileSink = std::make_shared(fdLogFile.get()); @@ -4522,7 +4522,6 @@ void SubstitutionGoal::handleEOF(int fd) if (fd == outPipe.readSide.get()) worker.wakeUp(shared_from_this()); } - ////////////////////////////////////////////////////////////////////// @@ -4739,9 +4738,9 @@ void Worker::run(const Goals & _topGoals) if (!children.empty() || !waitingForAWhile.empty()) waitForInput(); else { - if (awake.empty() && 0 == settings.maxBuildJobs) throw Error( - "unable to start any build; either increase '--max-jobs' " - "or enable remote builds"); + if (awake.empty() && 0 == settings.maxBuildJobs) + throw Error("unable to start any build; either increase '--max-jobs' " + "or enable remote builds"); assert(!awake.empty()); } } @@ -4754,7 +4753,6 @@ void Worker::run(const Goals & _topGoals) assert(!settings.keepGoing || children.empty()); } - void Worker::waitForInput() { printMsg(lvlVomit, "waiting for children"); @@ -4895,6 +4893,9 @@ void Worker::waitForInput() } + + + unsigned int Worker::exitStatus() { /* @@ -4994,7 +4995,6 @@ void LocalStore::buildPaths(const std::vector & drvPaths, throw Error(worker.exitStatus(), "build of %s failed", showPaths(failed)); } - BuildResult LocalStore::buildDerivation(const StorePath & drvPath, const BasicDerivation & drv, BuildMode buildMode) { @@ -5055,4 +5055,8 @@ void LocalStore::repairPath(const StorePath & path) } + } + + + diff --git a/src/libstore/builtins/buildenv.cc b/src/libstore/builtins/buildenv.cc index 1b802d908..000769094 100644 --- a/src/libstore/builtins/buildenv.cc +++ b/src/libstore/builtins/buildenv.cc @@ -72,15 +72,15 @@ static void createLinks(State & state, const Path & srcDir, const Path & dstDir, if (!S_ISDIR(lstat(target).st_mode)) throw Error("collision between '%1%' and non-directory '%2%'", srcFile, target); if (unlink(dstFile.c_str()) == -1) - throw SysError(format("unlinking '%1%'") % dstFile); + throw SysError("unlinking '%1%'", dstFile); if (mkdir(dstFile.c_str(), 0755) == -1) - throw SysError(format("creating directory '%1%'")); + throw SysError("creating directory '%1%'", dstFile); createLinks(state, target, dstFile, state.priorities[dstFile]); createLinks(state, srcFile, dstFile, priority); continue; } } else if (errno != ENOENT) - throw SysError(format("getting status of '%1%'") % dstFile); + throw SysError("getting status of '%1%'", dstFile); } else { @@ -99,11 +99,11 @@ static void createLinks(State & state, const Path & srcDir, const Path & dstDir, if (prevPriority < priority) continue; if (unlink(dstFile.c_str()) == -1) - throw SysError(format("unlinking '%1%'") % dstFile); + throw SysError("unlinking '%1%'", dstFile); } else if (S_ISDIR(dstSt.st_mode)) throw Error("collision between non-directory '%1%' and directory '%2%'", srcFile, dstFile); } else if (errno != ENOENT) - throw SysError(format("getting status of '%1%'") % dstFile); + throw SysError("getting status of '%1%'", dstFile); } createSymlink(srcFile, dstFile); diff --git a/src/libstore/builtins/fetchurl.cc b/src/libstore/builtins/fetchurl.cc index f6ae5d2e6..223ed1fba 100644 --- a/src/libstore/builtins/fetchurl.cc +++ b/src/libstore/builtins/fetchurl.cc @@ -18,7 +18,7 @@ void builtinFetchurl(const BasicDerivation & drv, const std::string & netrcData) auto getAttr = [&](const string & name) { auto i = drv.env.find(name); - if (i == drv.env.end()) throw Error(format("attribute '%s' missing") % name); + if (i == drv.env.end()) throw Error("attribute '%s' missing", name); return i->second; }; @@ -54,7 +54,7 @@ void builtinFetchurl(const BasicDerivation & drv, const std::string & netrcData) auto executable = drv.env.find("executable"); if (executable != drv.env.end() && executable->second == "1") { if (chmod(storePath.c_str(), 0755) == -1) - throw SysError(format("making '%1%' executable") % storePath); + throw SysError("making '%1%' executable", storePath); } }; diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index d985f151b..f8b449e5e 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -747,7 +747,7 @@ static void performOp(TunnelLogger * logger, ref store, } default: - throw Error(format("invalid operation %1%") % op); + throw Error("invalid operation %1%", op); } } diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc index 973ddc86a..f35b8cc43 100644 --- a/src/libstore/derivations.cc +++ b/src/libstore/derivations.cc @@ -87,7 +87,7 @@ static void expect(std::istream & str, const string & s) char s2[s.size()]; str.read(s2, s.size()); if (string(s2, s.size()) != s) - throw FormatError(format("expected string '%1%'") % s); + throw FormatError("expected string '%1%'", s); } @@ -114,7 +114,7 @@ static Path parsePath(std::istream & str) { string s = parseString(str); if (s.size() == 0 || s[0] != '/') - throw FormatError(format("bad path '%1%' in derivation") % s); + throw FormatError("bad path '%1%' in derivation", s); return s; } @@ -196,7 +196,7 @@ Derivation readDerivation(const Store & store, const Path & drvPath) try { return parseDerivation(store, readFile(drvPath)); } catch (FormatError & e) { - throw Error(format("error parsing derivation '%1%': %2%") % drvPath % e.msg()); + throw Error("error parsing derivation '%1%': %2%", drvPath, e.msg()); } } diff --git a/src/libstore/download.cc b/src/libstore/download.cc index 5967d0425..7d0cb449b 100644 --- a/src/libstore/download.cc +++ b/src/libstore/download.cc @@ -113,7 +113,7 @@ struct CurlDownloader : public Downloader if (requestHeaders) curl_slist_free_all(requestHeaders); try { if (!done) - fail(DownloadError(Interrupted, format("download of '%s' was interrupted") % request.uri)); + fail(DownloadError(Interrupted, "download of '%s' was interrupted", request.uri)); } catch (...) { ignoreException(); } @@ -518,7 +518,7 @@ struct CurlDownloader : public Downloader int running; CURLMcode mc = curl_multi_perform(curlm, &running); if (mc != CURLM_OK) - throw nix::Error(format("unexpected error from curl_multi_perform(): %s") % curl_multi_strerror(mc)); + throw nix::Error("unexpected error from curl_multi_perform(): %s", curl_multi_strerror(mc)); /* Set the promises of any finished requests. */ CURLMsg * msg; @@ -548,7 +548,7 @@ struct CurlDownloader : public Downloader vomit("download thread waiting for %d ms", sleepTimeMs); mc = curl_multi_wait(curlm, extraFDs, 1, sleepTimeMs, &numfds); if (mc != CURLM_OK) - throw nix::Error(format("unexpected error from curl_multi_wait(): %s") % curl_multi_strerror(mc)); + throw nix::Error("unexpected error from curl_multi_wait(): %s", curl_multi_strerror(mc)); nextWakeup = std::chrono::steady_clock::time_point(); diff --git a/src/libstore/download.hh b/src/libstore/download.hh index 5a131c704..8141928d2 100644 --- a/src/libstore/download.hh +++ b/src/libstore/download.hh @@ -128,8 +128,10 @@ class DownloadError : public Error { public: Downloader::Error error; - DownloadError(Downloader::Error error, const FormatOrString & fs) - : Error(fs), error(error) + + template + DownloadError(Downloader::Error error, const Args & ... args) + : Error(args...), error(error) { } }; diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 0c3d89611..27bd3f3e9 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -38,7 +38,7 @@ AutoCloseFD LocalStore::openGCLock(LockType lockType) AutoCloseFD fdGCLock = open(fnGCLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600); if (!fdGCLock) - throw SysError(format("opening global GC lock '%1%'") % fnGCLock); + throw SysError("opening global GC lock '%1%'", fnGCLock); if (!lockFile(fdGCLock.get(), lockType, false)) { printError(format("waiting for the big garbage collector lock...")); @@ -65,8 +65,8 @@ static void makeSymlink(const Path & link, const Path & target) /* Atomically replace the old one. */ if (rename(tempLink.c_str(), link.c_str()) == -1) - throw SysError(format("cannot rename '%1%' to '%2%'") - % tempLink % link); + throw SysError("cannot rename '%1%' to '%2%'", + tempLink , link); } @@ -91,15 +91,15 @@ Path LocalFSStore::addPermRoot(const StorePath & storePath, Path gcRoot(canonPath(_gcRoot)); if (isInStore(gcRoot)) - throw Error(format( + throw Error( "creating a garbage collector root (%1%) in the Nix store is forbidden " - "(are you running nix-build inside the store?)") % gcRoot); + "(are you running nix-build inside the store?)", gcRoot); if (indirect) { /* Don't clobber the link if it already exists and doesn't point to the Nix store. */ if (pathExists(gcRoot) && (!isLink(gcRoot) || !isInStore(readLink(gcRoot)))) - throw Error(format("cannot create symlink '%1%'; already exists") % gcRoot); + throw Error("cannot create symlink '%1%'; already exists", gcRoot); makeSymlink(gcRoot, printStorePath(storePath)); addIndirectRoot(gcRoot); } @@ -109,10 +109,10 @@ Path LocalFSStore::addPermRoot(const StorePath & storePath, Path rootsDir = canonPath((format("%1%/%2%") % stateDir % gcRootsDir).str()); if (string(gcRoot, 0, rootsDir.size() + 1) != rootsDir + "/") - throw Error(format( + throw Error( "path '%1%' is not a valid garbage collector root; " - "it's not in the directory '%2%'") - % gcRoot % rootsDir); + "it's not in the directory '%2%'", + gcRoot, rootsDir); } if (baseNameOf(gcRoot) == std::string(storePath.to_string())) @@ -170,7 +170,7 @@ void LocalStore::addTempRoot(const StorePath & path) way. */ struct stat st; if (fstat(state->fdTempRoots.get(), &st) == -1) - throw SysError(format("statting '%1%'") % fnTempRoots); + throw SysError("statting '%1%'", fnTempRoots); if (st.st_size == 0) break; /* The garbage collector deleted this file before we could @@ -211,7 +211,7 @@ void LocalStore::findTempRoots(FDs & fds, Roots & tempRoots, bool censor) if (!*fd) { /* It's okay if the file has disappeared. */ if (errno == ENOENT) continue; - throw SysError(format("opening temporary roots file '%1%'") % path); + throw SysError("opening temporary roots file '%1%'", path); } /* This should work, but doesn't, for some reason. */ @@ -222,7 +222,7 @@ void LocalStore::findTempRoots(FDs & fds, Roots & tempRoots, bool censor) only succeed if the owning process has died. In that case we don't care about its temporary roots. */ if (lockFile(fd->get(), ltWrite, false)) { - printError(format("removing stale temporary roots file '%1%'") % path); + printError("removing stale temporary roots file '%1%'", path); unlink(path.c_str()); writeFull(fd->get(), "d"); continue; @@ -398,7 +398,7 @@ void LocalStore::findRuntimeRoots(Roots & roots, bool censor) if (!fdDir) { if (errno == ENOENT || errno == EACCES) continue; - throw SysError(format("opening %1%") % fdStr); + throw SysError("opening %1%", fdStr); } struct dirent * fd_ent; while (errno = 0, fd_ent = readdir(fdDir.get())) { @@ -408,7 +408,7 @@ void LocalStore::findRuntimeRoots(Roots & roots, bool censor) if (errno) { if (errno == ESRCH) continue; - throw SysError(format("iterating /proc/%1%/fd") % ent->d_name); + throw SysError("iterating /proc/%1%/fd", ent->d_name); } fdDir.reset(); @@ -536,7 +536,7 @@ void LocalStore::deletePathRecursive(GCState & state, const Path & path) struct stat st; if (lstat(realPath.c_str(), &st)) { if (errno == ENOENT) return; - throw SysError(format("getting status of %1%") % realPath); + throw SysError("getting status of %1%", realPath); } printInfo(format("deleting '%1%'") % path); @@ -554,10 +554,10 @@ void LocalStore::deletePathRecursive(GCState & state, const Path & path) // size. try { if (chmod(realPath.c_str(), st.st_mode | S_IWUSR) == -1) - throw SysError(format("making '%1%' writable") % realPath); + throw SysError("making '%1%' writable", realPath); Path tmp = trashDir + "/" + std::string(baseNameOf(path)); if (rename(realPath.c_str(), tmp.c_str())) - throw SysError(format("unable to rename '%1%' to '%2%'") % realPath % tmp); + throw SysError("unable to rename '%1%' to '%2%'", realPath, tmp); state.bytesInvalidated += size; } catch (SysError & e) { if (e.errNo == ENOSPC) { @@ -676,7 +676,7 @@ void LocalStore::tryToDelete(GCState & state, const Path & path) void LocalStore::removeUnusedLinks(const GCState & state) { AutoCloseDir dir(opendir(linksDir.c_str())); - if (!dir) throw SysError(format("opening directory '%1%'") % linksDir); + if (!dir) throw SysError("opening directory '%1%'", linksDir); long long actualSize = 0, unsharedSize = 0; @@ -689,7 +689,7 @@ void LocalStore::removeUnusedLinks(const GCState & state) struct stat st; if (lstat(path.c_str(), &st) == -1) - throw SysError(format("statting '%1%'") % path); + throw SysError("statting '%1%'", path); if (st.st_nlink != 1) { actualSize += st.st_size; @@ -700,14 +700,14 @@ void LocalStore::removeUnusedLinks(const GCState & state) printMsg(lvlTalkative, format("deleting unused link '%1%'") % path); if (unlink(path.c_str()) == -1) - throw SysError(format("deleting '%1%'") % path); + throw SysError("deleting '%1%'", path); state.results.bytesFreed += st.st_size; } struct stat st; if (stat(linksDir.c_str(), &st) == -1) - throw SysError(format("statting '%1%'") % linksDir); + throw SysError("statting '%1%'", linksDir); long long overhead = st.st_blocks * 512ULL; printInfo(format("note: currently hard linking saves %.2f MiB") @@ -801,7 +801,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) try { AutoCloseDir dir(opendir(realStoreDir.c_str())); - if (!dir) throw SysError(format("opening directory '%1%'") % realStoreDir); + if (!dir) throw SysError("opening directory '%1%'", realStoreDir); /* Read the store and immediately delete all paths that aren't valid. When using --max-freed etc., deleting diff --git a/src/libstore/local-binary-cache-store.cc b/src/libstore/local-binary-cache-store.cc index 363be1443..48aca478c 100644 --- a/src/libstore/local-binary-cache-store.cc +++ b/src/libstore/local-binary-cache-store.cc @@ -74,7 +74,7 @@ static void atomicWrite(const Path & path, const std::string & s) AutoDelete del(tmp, false); writeFile(tmp, s); if (rename(tmp.c_str(), path.c_str())) - throw SysError(format("renaming '%1%' to '%2%'") % tmp % path); + throw SysError("renaming '%1%' to '%2%'", tmp, path); del.cancel(); } diff --git a/src/libstore/local-fs-store.cc b/src/libstore/local-fs-store.cc index aa5abd835..2d564a0d7 100644 --- a/src/libstore/local-fs-store.cc +++ b/src/libstore/local-fs-store.cc @@ -22,7 +22,7 @@ struct LocalStoreAccessor : public FSAccessor { Path storePath = store->toStorePath(path); if (!store->isValidPath(store->parseStorePath(storePath))) - throw InvalidPath(format("path '%1%' is not a valid store path") % storePath); + throw InvalidPath("path '%1%' is not a valid store path", storePath); return store->getRealStoreDir() + std::string(path, store->storeDir.size()); } @@ -33,11 +33,11 @@ struct LocalStoreAccessor : public FSAccessor struct stat st; if (lstat(realPath.c_str(), &st)) { if (errno == ENOENT || errno == ENOTDIR) return {Type::tMissing, 0, false}; - throw SysError(format("getting status of '%1%'") % path); + throw SysError("getting status of '%1%'", path); } if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode)) - throw Error(format("file '%1%' has unsupported type") % path); + throw Error("file '%1%' has unsupported type", path); return { S_ISREG(st.st_mode) ? Type::tRegular : diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index ae7513ad8..db5a3b53c 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -92,13 +92,13 @@ LocalStore::LocalStore(const Params & params) else { struct stat st; if (stat(realStoreDir.c_str(), &st)) - throw SysError(format("getting attributes of path '%1%'") % realStoreDir); + throw SysError("getting attributes of path '%1%'", realStoreDir); if (st.st_uid != 0 || st.st_gid != gr->gr_gid || (st.st_mode & ~S_IFMT) != perm) { if (chown(realStoreDir.c_str(), 0, gr->gr_gid) == -1) - throw SysError(format("changing ownership of path '%1%'") % realStoreDir); + throw SysError("changing ownership of path '%1%'", realStoreDir); if (chmod(realStoreDir.c_str(), perm) == -1) - throw SysError(format("changing permissions on path '%1%'") % realStoreDir); + throw SysError("changing permissions on path '%1%'", realStoreDir); } } } @@ -109,12 +109,12 @@ LocalStore::LocalStore(const Params & params) struct stat st; while (path != "/") { if (lstat(path.c_str(), &st)) - throw SysError(format("getting status of '%1%'") % path); + throw SysError("getting status of '%1%'", path); if (S_ISLNK(st.st_mode)) - throw Error(format( + throw Error( "the path '%1%' is a symlink; " - "this is not allowed for the Nix store and its parent directories") - % path); + "this is not allowed for the Nix store and its parent directories", + path); path = dirOf(path); } } @@ -155,8 +155,8 @@ LocalStore::LocalStore(const Params & params) upgrade. */ int curSchema = getSchema(); if (curSchema > nixSchemaVersion) - throw Error(format("current Nix store schema is version %1%, but I only support %2%") - % curSchema % nixSchemaVersion); + throw Error("current Nix store schema is version %1%, but I only support %2%", + curSchema, nixSchemaVersion); else if (curSchema == 0) { /* new store */ curSchema = nixSchemaVersion; @@ -284,7 +284,7 @@ int LocalStore::getSchema() if (pathExists(schemaPath)) { string s = readFile(schemaPath); if (!string2Int(s, curSchema)) - throw Error(format("'%1%' is corrupt") % schemaPath); + throw Error("'%1%' is corrupt", schemaPath); } return curSchema; } @@ -293,7 +293,7 @@ int LocalStore::getSchema() void LocalStore::openDB(State & state, bool create) { if (access(dbDir.c_str(), R_OK | W_OK)) - throw SysError(format("Nix database directory '%1%' is not writable") % dbDir); + throw SysError("Nix database directory '%1%' is not writable", dbDir); /* Open the Nix database. */ string dbPath = dbDir + "/db.sqlite"; @@ -367,7 +367,7 @@ void LocalStore::makeStoreWritable() throw SysError("setting up a private mount namespace"); if (mount(0, realStoreDir.c_str(), "none", MS_REMOUNT | MS_BIND, 0) == -1) - throw SysError(format("remounting %1% writable") % realStoreDir); + throw SysError("remounting %1% writable", realStoreDir); } #endif } @@ -388,7 +388,7 @@ static void canonicaliseTimestampAndPermissions(const Path & path, const struct | 0444 | (st.st_mode & S_IXUSR ? 0111 : 0); if (chmod(path.c_str(), mode) == -1) - throw SysError(format("changing mode of '%1%' to %2$o") % path % mode); + throw SysError("changing mode of '%1%' to %2$o", path, mode); } } @@ -406,7 +406,7 @@ static void canonicaliseTimestampAndPermissions(const Path & path, const struct #else if (!S_ISLNK(st.st_mode) && utimes(path.c_str(), times) == -1) #endif - throw SysError(format("changing modification time of '%1%'") % path); + throw SysError("changing modification time of '%1%'", path); } } @@ -415,7 +415,7 @@ void canonicaliseTimestampAndPermissions(const Path & path) { struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path '%1%'") % path); + throw SysError("getting attributes of path '%1%'", path); canonicaliseTimestampAndPermissions(path, st); } @@ -430,17 +430,17 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe setattrlist() to remove other attributes as well. */ if (lchflags(path.c_str(), 0)) { if (errno != ENOTSUP) - throw SysError(format("clearing flags of path '%1%'") % path); + throw SysError("clearing flags of path '%1%'", path); } #endif struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path '%1%'") % path); + throw SysError("getting attributes of path '%1%'", path); /* Really make sure that the path is of a supported type. */ if (!(S_ISREG(st.st_mode) || S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode))) - throw Error(format("file '%1%' has an unsupported type") % path); + throw Error("file '%1%' has an unsupported type", path); #if __linux__ /* Remove extended attributes / ACLs. */ @@ -474,7 +474,7 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe if (fromUid != (uid_t) -1 && st.st_uid != fromUid) { assert(!S_ISDIR(st.st_mode)); if (inodesSeen.find(Inode(st.st_dev, st.st_ino)) == inodesSeen.end()) - throw BuildError(format("invalid ownership on file '%1%'") % path); + throw BuildError("invalid ownership on file '%1%'", path); mode_t mode = st.st_mode & ~S_IFMT; assert(S_ISLNK(st.st_mode) || (st.st_uid == geteuid() && (mode == 0444 || mode == 0555) && st.st_mtime == mtimeStore)); return; @@ -498,8 +498,8 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe if (!S_ISLNK(st.st_mode) && chown(path.c_str(), geteuid(), getegid()) == -1) #endif - throw SysError(format("changing owner of '%1%' to %2%") - % path % geteuid()); + throw SysError("changing owner of '%1%' to %2%", + path, geteuid()); } if (S_ISDIR(st.st_mode)) { @@ -518,11 +518,11 @@ void canonicalisePathMetaData(const Path & path, uid_t fromUid, InodesSeen & ino be a symlink, since we can't change its ownership. */ struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path '%1%'") % path); + throw SysError("getting attributes of path '%1%'", path); if (st.st_uid != geteuid()) { assert(S_ISLNK(st.st_mode)); - throw Error(format("wrong ownership of top-level store path '%1%'") % path); + throw Error("wrong ownership of top-level store path '%1%'", path); } } @@ -1392,7 +1392,7 @@ static void makeMutable(const Path & path) AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_NOFOLLOW | O_CLOEXEC); if (fd == -1) { if (errno == ELOOP) return; // it's a symlink - throw SysError(format("opening file '%1%'") % path); + throw SysError("opening file '%1%'", path); } unsigned int flags = 0, old; diff --git a/src/libstore/nar-accessor.cc b/src/libstore/nar-accessor.cc index b74480684..ca663d837 100644 --- a/src/libstore/nar-accessor.cc +++ b/src/libstore/nar-accessor.cc @@ -184,7 +184,7 @@ struct NarAccessor : public FSAccessor auto i = get(path); if (i.type != FSAccessor::Type::tDirectory) - throw Error(format("path '%1%' inside NAR file is not a directory") % path); + throw Error("path '%1%' inside NAR file is not a directory", path); StringSet res; for (auto & child : i.children) @@ -197,7 +197,7 @@ struct NarAccessor : public FSAccessor { auto i = get(path); if (i.type != FSAccessor::Type::tRegular) - throw Error(format("path '%1%' inside NAR file is not a regular file") % path); + throw Error("path '%1%' inside NAR file is not a regular file", path); if (getNarBytes) return getNarBytes(i.start, i.size); @@ -209,7 +209,7 @@ struct NarAccessor : public FSAccessor { auto i = get(path); if (i.type != FSAccessor::Type::tSymlink) - throw Error(format("path '%1%' inside NAR file is not a symlink") % path); + throw Error("path '%1%' inside NAR file is not a symlink", path); return i.target; } }; diff --git a/src/libstore/nar-info.cc b/src/libstore/nar-info.cc index 1375094b5..fbdcd7786 100644 --- a/src/libstore/nar-info.cc +++ b/src/libstore/nar-info.cc @@ -7,7 +7,7 @@ NarInfo::NarInfo(const Store & store, const std::string & s, const std::string & : ValidPathInfo(StorePath::dummy.clone()) // FIXME: hack { auto corrupt = [&]() { - throw Error(format("NAR info file '%1%' is corrupt") % whence); + throw Error("NAR info file '%1%' is corrupt", whence); }; auto parseHashField = [&](const string & s) { diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc index 8ac382e9d..f9cf2bb6b 100644 --- a/src/libstore/optimise-store.cc +++ b/src/libstore/optimise-store.cc @@ -19,9 +19,9 @@ static void makeWritable(const Path & path) { struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path '%1%'") % path); + throw SysError("getting attributes of path '%1%'", path); if (chmod(path.c_str(), st.st_mode | S_IWUSR) == -1) - throw SysError(format("changing writability of '%1%'") % path); + throw SysError("changing writability of '%1%'", path); } @@ -47,7 +47,7 @@ LocalStore::InodeHash LocalStore::loadInodeHash() InodeHash inodeHash; AutoCloseDir dir(opendir(linksDir.c_str())); - if (!dir) throw SysError(format("opening directory '%1%'") % linksDir); + if (!dir) throw SysError("opening directory '%1%'", linksDir); struct dirent * dirent; while (errno = 0, dirent = readdir(dir.get())) { /* sic */ @@ -55,7 +55,7 @@ LocalStore::InodeHash LocalStore::loadInodeHash() // We don't care if we hit non-hash files, anything goes inodeHash.insert(dirent->d_ino); } - if (errno) throw SysError(format("reading directory '%1%'") % linksDir); + if (errno) throw SysError("reading directory '%1%'", linksDir); printMsg(lvlTalkative, format("loaded %1% hash inodes") % inodeHash.size()); @@ -68,7 +68,7 @@ Strings LocalStore::readDirectoryIgnoringInodes(const Path & path, const InodeHa Strings names; AutoCloseDir dir(opendir(path.c_str())); - if (!dir) throw SysError(format("opening directory '%1%'") % path); + if (!dir) throw SysError("opening directory '%1%'", path); struct dirent * dirent; while (errno = 0, dirent = readdir(dir.get())) { /* sic */ @@ -83,7 +83,7 @@ Strings LocalStore::readDirectoryIgnoringInodes(const Path & path, const InodeHa if (name == "." || name == "..") continue; names.push_back(name); } - if (errno) throw SysError(format("reading directory '%1%'") % path); + if (errno) throw SysError("reading directory '%1%'", path); return names; } @@ -96,7 +96,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path '%1%'") % path); + throw SysError("getting attributes of path '%1%'", path); #if __APPLE__ /* HFS/macOS has some undocumented security feature disabling hardlinking for @@ -130,7 +130,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, NixOS (example: $fontconfig/var/cache being modified). Skip those files. FIXME: check the modification time. */ if (S_ISREG(st.st_mode) && (st.st_mode & S_IWUSR)) { - printError(format("skipping suspicious writable file '%1%'") % path); + printError("skipping suspicious writable file '%1%'", path); return; } @@ -186,7 +186,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, current file with a hard link to that file. */ struct stat stLink; if (lstat(linkPath.c_str(), &stLink)) - throw SysError(format("getting attributes of path '%1%'") % linkPath); + throw SysError("getting attributes of path '%1%'", linkPath); if (st.st_ino == stLink.st_ino) { debug(format("'%1%' is already linked to '%2%'") % path % linkPath); @@ -194,7 +194,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, } if (st.st_size != stLink.st_size) { - printError(format("removing corrupted link '%1%'") % linkPath); + printError("removing corrupted link '%1%'", linkPath); unlink(linkPath.c_str()); goto retry; } @@ -229,7 +229,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, /* Atomically replace the old file with the new hard link. */ if (rename(tempLink.c_str(), path.c_str()) == -1) { if (unlink(tempLink.c_str()) == -1) - printError(format("unable to unlink '%1%'") % tempLink); + printError("unable to unlink '%1%'", tempLink); if (errno == EMLINK) { /* Some filesystems generate too many links on the rename, rather than on the original link. (Probably it @@ -238,7 +238,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, debug("'%s' has reached maximum number of links", linkPath); return; } - throw SysError(format("cannot rename '%1%' to '%2%'") % tempLink % path); + throw SysError("cannot rename '%1%' to '%2%'", tempLink, path); } stats.filesLinked++; diff --git a/src/libstore/pathlocks.cc b/src/libstore/pathlocks.cc index 2635e3940..52d430ffd 100644 --- a/src/libstore/pathlocks.cc +++ b/src/libstore/pathlocks.cc @@ -20,7 +20,7 @@ AutoCloseFD openLockFile(const Path & path, bool create) fd = open(path.c_str(), O_CLOEXEC | O_RDWR | (create ? O_CREAT : 0), 0600); if (!fd && (create || errno != ENOENT)) - throw SysError(format("opening lock file '%1%'") % path); + throw SysError("opening lock file '%1%'", path); return fd; } @@ -51,7 +51,7 @@ bool lockFile(int fd, LockType lockType, bool wait) while (flock(fd, type) != 0) { checkInterrupt(); if (errno != EINTR) - throw SysError(format("acquiring/releasing lock")); + throw SysError("acquiring/releasing lock"); else return false; } @@ -60,7 +60,7 @@ bool lockFile(int fd, LockType lockType, bool wait) checkInterrupt(); if (errno == EWOULDBLOCK) return false; if (errno != EINTR) - throw SysError(format("acquiring/releasing lock")); + throw SysError("acquiring/releasing lock"); } } @@ -124,7 +124,7 @@ bool PathLocks::lockPaths(const PathSet & paths, hasn't been unlinked). */ struct stat st; if (fstat(fd.get(), &st) == -1) - throw SysError(format("statting lock file '%1%'") % lockPath); + throw SysError("statting lock file '%1%'", lockPath); if (st.st_size != 0) /* This lock file has been unlinked, so we're holding a lock on a deleted file. This means that other diff --git a/src/libstore/profiles.cc b/src/libstore/profiles.cc index 2bef51878..6cfe393a4 100644 --- a/src/libstore/profiles.cc +++ b/src/libstore/profiles.cc @@ -50,7 +50,7 @@ Generations findGenerations(Path profile, int & curGen) gen.number = n; struct stat st; if (lstat(gen.path.c_str(), &st) != 0) - throw SysError(format("statting '%1%'") % gen.path); + throw SysError("statting '%1%'", gen.path); gen.creationTime = st.st_mtime; gens.push_back(gen); } @@ -117,7 +117,7 @@ Path createGeneration(ref store, Path profile, Path outPath) static void removeFile(const Path & path) { if (remove(path.c_str()) == -1) - throw SysError(format("cannot unlink '%1%'") % path); + throw SysError("cannot unlink '%1%'", path); } @@ -149,7 +149,7 @@ void deleteGenerations(const Path & profile, const std::set & gens Generations gens = findGenerations(profile, curGen); if (gensToDelete.find(curGen) != gensToDelete.end()) - throw Error(format("cannot delete current generation of profile %1%'") % profile); + throw Error("cannot delete current generation of profile %1%'", profile); for (auto & i : gens) { if (gensToDelete.find(i.number) == gensToDelete.end()) continue; @@ -226,7 +226,7 @@ void deleteGenerationsOlderThan(const Path & profile, const string & timeSpec, b int days; if (!string2Int(strDays, days) || days < 1) - throw Error(format("invalid number of days specifier '%1%'") % timeSpec); + throw Error("invalid number of days specifier '%1%'", timeSpec); time_t oldTime = curTime - days * 24 * 3600; diff --git a/src/libstore/references.cc b/src/libstore/references.cc index 102e15921..a10d536a3 100644 --- a/src/libstore/references.cc +++ b/src/libstore/references.cc @@ -92,7 +92,7 @@ PathSet scanForReferences(const string & path, auto baseName = std::string(baseNameOf(i)); string::size_type pos = baseName.find('-'); if (pos == string::npos) - throw Error(format("bad reference '%1%'") % i); + throw Error("bad reference '%1%'", i); string s = string(baseName, 0, pos); assert(s.size() == refLength); assert(backMap.find(s) == backMap.end()); diff --git a/src/libstore/remote-fs-accessor.cc b/src/libstore/remote-fs-accessor.cc index 5a2d103b9..9277a8e6b 100644 --- a/src/libstore/remote-fs-accessor.cc +++ b/src/libstore/remote-fs-accessor.cc @@ -51,7 +51,7 @@ std::pair, Path> RemoteFSAccessor::fetch(const Path & path_) std::string restPath = std::string(path, storePath.size()); if (!store->isValidPath(store->parseStorePath(storePath))) - throw InvalidPath(format("path '%1%' is not a valid store path") % storePath); + throw InvalidPath("path '%1%' is not a valid store path", storePath); auto i = nars.find(storePath); if (i != nars.end()) return {i->second, restPath}; diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 8c55da268..0f8126aee 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -116,11 +116,11 @@ ref UDSRemoteStore::openConnection() struct sockaddr_un addr; addr.sun_family = AF_UNIX; if (socketPath.size() + 1 >= sizeof(addr.sun_path)) - throw Error(format("socket path '%1%' is too long") % socketPath); + throw Error("socket path '%1%' is too long", socketPath); strcpy(addr.sun_path, socketPath.c_str()); if (::connect(conn->fd.get(), (struct sockaddr *) &addr, sizeof(addr)) == -1) - throw SysError(format("cannot connect to daemon at '%1%'") % socketPath); + throw SysError("cannot connect to daemon at '%1%'", socketPath); conn->from.fd = conn->fd.get(); conn->to.fd = conn->fd.get(); diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc index f2e4b63e0..0326821f6 100644 --- a/src/libstore/s3-binary-cache-store.cc +++ b/src/libstore/s3-binary-cache-store.cc @@ -32,8 +32,10 @@ namespace nix { struct S3Error : public Error { Aws::S3::S3Errors err; - S3Error(Aws::S3::S3Errors err, const FormatOrString & fs) - : Error(fs), err(err) { }; + + template + S3Error(Aws::S3::S3Errors err, const Args & ... args) + : Error(args...), err(err) { }; }; /* Helper: given an Outcome, return R in case of success, or @@ -249,7 +251,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore // If bucket listing is disabled, 404s turn into 403s || error.GetErrorType() == Aws::S3::S3Errors::ACCESS_DENIED) return false; - throw Error(format("AWS error fetching '%s': %s") % path % error.GetMessage()); + throw Error("AWS error fetching '%s': %s", path, error.GetMessage()); } return true; diff --git a/src/libstore/sqlite.cc b/src/libstore/sqlite.cc index eb1daafc5..3407e5826 100644 --- a/src/libstore/sqlite.cc +++ b/src/libstore/sqlite.cc @@ -29,7 +29,7 @@ SQLite::SQLite(const Path & path, bool create) { if (sqlite3_open_v2(path.c_str(), &db, SQLITE_OPEN_READWRITE | (create ? SQLITE_OPEN_CREATE : 0), 0) != SQLITE_OK) - throw Error(format("cannot open SQLite database '%s'") % path); + throw Error("cannot open SQLite database '%s'", path); if (sqlite3_busy_timeout(db, 60 * 60 * 1000) != SQLITE_OK) throwSQLiteError(db, "setting timeout"); diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index b9e894a9a..a04d5013e 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -22,7 +22,7 @@ bool Store::isInStore(const Path & path) const Path Store::toStorePath(const Path & path) const { if (!isInStore(path)) - throw Error(format("path '%1%' is not in the Nix store") % path); + throw Error("path '%1%' is not in the Nix store", path); Path::size_type slash = path.find('/', storeDir.size() + 1); if (slash == Path::npos) return path; @@ -40,7 +40,7 @@ Path Store::followLinksToStore(std::string_view _path) const path = absPath(target, dirOf(path)); } if (!isInStore(path)) - throw Error(format("path '%1%' is not in the Nix store") % path); + throw Error("path '%1%' is not in the Nix store", path); return path; } diff --git a/src/libutil/archive.cc b/src/libutil/archive.cc index db544a212..6a8484705 100644 --- a/src/libutil/archive.cc +++ b/src/libutil/archive.cc @@ -46,7 +46,7 @@ static void dumpContents(const Path & path, size_t size, sink << "contents" << size; AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); - if (!fd) throw SysError(format("opening file '%1%'") % path); + if (!fd) throw SysError("opening file '%1%'", path); std::vector buf(65536); size_t left = size; @@ -68,7 +68,7 @@ static void dump(const Path & path, Sink & sink, PathFilter & filter) struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path '%1%'") % path); + throw SysError("getting attributes of path '%1%'", path); sink << "("; @@ -94,8 +94,9 @@ static void dump(const Path & path, Sink & sink, PathFilter & filter) name.erase(pos); } if (unhacked.find(name) != unhacked.end()) - throw Error(format("file name collision in between '%1%' and '%2%'") - % (path + "/" + unhacked[name]) % (path + "/" + i.name)); + throw Error("file name collision in between '%1%' and '%2%'", + (path + "/" + unhacked[name]), + (path + "/" + i.name)); unhacked[name] = i.name; } else unhacked[i.name] = i.name; @@ -111,7 +112,7 @@ static void dump(const Path & path, Sink & sink, PathFilter & filter) else if (S_ISLNK(st.st_mode)) sink << "type" << "symlink" << "target" << readLink(path); - else throw Error(format("file '%1%' has an unsupported type") % path); + else throw Error("file '%1%' has an unsupported type", path); sink << ")"; } @@ -247,7 +248,7 @@ static void parse(ParseSink & sink, Source & source, const Path & path) } else if (s == "name") { name = readString(source); if (name.empty() || name == "." || name == ".." || name.find('/') != string::npos || name.find((char) 0) != string::npos) - throw Error(format("NAR contains invalid file name '%1%'") % name); + throw Error("NAR contains invalid file name '%1%'", name); if (name <= prevName) throw Error("NAR directory is not sorted"); prevName = name; @@ -303,14 +304,14 @@ struct RestoreSink : ParseSink { Path p = dstPath + path; if (mkdir(p.c_str(), 0777) == -1) - throw SysError(format("creating directory '%1%'") % p); + throw SysError("creating directory '%1%'", p); }; void createRegularFile(const Path & path) { Path p = dstPath + path; fd = open(p.c_str(), O_CREAT | O_EXCL | O_WRONLY | O_CLOEXEC, 0666); - if (!fd) throw SysError(format("creating file '%1%'") % p); + if (!fd) throw SysError("creating file '%1%'", p); } void isExecutable() @@ -332,7 +333,7 @@ struct RestoreSink : ParseSink OpenSolaris). Since preallocation is just an optimisation, ignore it. */ if (errno && errno != EINVAL && errno != EOPNOTSUPP && errno != ENOSYS) - throw SysError(format("preallocating file of %1% bytes") % len); + throw SysError("preallocating file of %1% bytes", len); } #endif } diff --git a/src/libutil/args.cc b/src/libutil/args.cc index ba15ea571..4e705dd64 100644 --- a/src/libutil/args.cc +++ b/src/libutil/args.cc @@ -47,7 +47,7 @@ void Args::parseCmdline(const Strings & _cmdline) } else if (!dashDash && std::string(arg, 0, 1) == "-") { if (!processFlag(pos, cmdline.end())) - throw UsageError(format("unrecognised flag '%1%'") % arg); + throw UsageError("unrecognised flag '%1%'", arg); } else { pendingArgs.push_back(*pos++); @@ -104,8 +104,9 @@ bool Args::processFlag(Strings::iterator & pos, Strings::iterator end) for (size_t n = 0 ; n < flag.arity; ++n) { if (pos == end) { if (flag.arity == ArityAny) break; - throw UsageError(format("flag '%1%' requires %2% argument(s)") - % name % flag.arity); + throw UsageError("flag '%1%' requires %2% argument(s)", + name, + flag.arity); } args.push_back(*pos++); } @@ -133,7 +134,7 @@ bool Args::processArgs(const Strings & args, bool finish) { if (expectedArgs.empty()) { if (!args.empty()) - throw UsageError(format("unexpected argument '%1%'") % args.front()); + throw UsageError("unexpected argument '%1%'", args.front()); return true; } diff --git a/src/libutil/compression.cc b/src/libutil/compression.cc index 860b04adb..a117ddc72 100644 --- a/src/libutil/compression.cc +++ b/src/libutil/compression.cc @@ -481,7 +481,7 @@ ref makeCompressionSink(const std::string & method, Sink & next else if (method == "br") return make_ref(nextSink); else - throw UnknownCompressionMethod(format("unknown compression method '%s'") % method); + throw UnknownCompressionMethod("unknown compression method '%s'", method); } ref compress(const std::string & method, const std::string & in, const bool parallel) diff --git a/src/libutil/fmt.hh b/src/libutil/fmt.hh index 08edffee0..d65215063 100644 --- a/src/libutil/fmt.hh +++ b/src/libutil/fmt.hh @@ -92,15 +92,15 @@ public: { fmt.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); } + hintformat(const hintformat &hf) + : fmt(hf.fmt) + {} template hintformat& operator%(const T &value) { fmt % yellowify(value); return *this; } - hintformat(const hintformat &hf) - : fmt(hf.fmt) - {} std::string str() const diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 633c6bdf7..2261adb82 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -93,7 +93,9 @@ public: template BaseError(unsigned int status, const Args & ... args) - : err(hintfmt(args...)) + : err { .level = lvlError, + .hint = hintfmt(args...) + } , status(status) { } diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 332c1c43a..bffcbcccf 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -129,7 +129,7 @@ Path canonPath(const Path & path, bool resolveSymlinks) string s; if (path[0] != '/') - throw Error(format("not an absolute path: '%1%'") % path); + throw Error("not an absolute path: '%1%'", path); string::const_iterator i = path.begin(), end = path.end(); string temp; @@ -165,7 +165,7 @@ Path canonPath(const Path & path, bool resolveSymlinks) the symlink target might contain new symlinks). */ if (resolveSymlinks && isLink(s)) { if (++followCount >= maxFollow) - throw Error(format("infinite symlink recursion in path '%1%'") % path); + throw Error("infinite symlink recursion in path '%1%'", path); temp = absPath(readLink(s), dirOf(s)) + string(i, end); i = temp.begin(); /* restart */ @@ -226,7 +226,7 @@ struct stat lstat(const Path & path) { struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting status of '%1%'") % path); + throw SysError("getting status of '%1%'", path); return st; } @@ -238,7 +238,7 @@ bool pathExists(const Path & path) res = lstat(path.c_str(), &st); if (!res) return true; if (errno != ENOENT && errno != ENOTDIR) - throw SysError(format("getting status of %1%") % path); + throw SysError("getting status of %1%", path); return false; } @@ -274,7 +274,7 @@ DirEntries readDirectory(const Path & path) entries.reserve(64); AutoCloseDir dir(opendir(path.c_str())); - if (!dir) throw SysError(format("opening directory '%1%'") % path); + if (!dir) throw SysError("opening directory '%1%'", path); struct dirent * dirent; while (errno = 0, dirent = readdir(dir.get())) { /* sic */ @@ -289,7 +289,7 @@ DirEntries readDirectory(const Path & path) #endif ); } - if (errno) throw SysError(format("reading directory '%1%'") % path); + if (errno) throw SysError("reading directory '%1%'", path); return entries; } @@ -322,7 +322,7 @@ string readFile(const Path & path, bool drain) { AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); if (!fd) - throw SysError(format("opening file '%1%'") % path); + throw SysError("opening file '%1%'", path); return drain ? drainFD(fd.get()) : readFile(fd.get()); } @@ -339,7 +339,7 @@ void writeFile(const Path & path, const string & s, mode_t mode) { AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode); if (!fd) - throw SysError(format("opening file '%1%'") % path); + throw SysError("opening file '%1%'", path); writeFull(fd.get(), s); } @@ -348,7 +348,7 @@ void writeFile(const Path & path, Source & source, mode_t mode) { AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode); if (!fd) - throw SysError(format("opening file '%1%'") % path); + throw SysError("opening file '%1%'", path); std::vector buf(64 * 1024); @@ -396,7 +396,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed) struct stat st; if (lstat(path.c_str(), &st) == -1) { if (errno == ENOENT) return; - throw SysError(format("getting status of '%1%'") % path); + throw SysError("getting status of '%1%'", path); } if (!S_ISDIR(st.st_mode) && st.st_nlink == 1) @@ -407,7 +407,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed) const auto PERM_MASK = S_IRUSR | S_IWUSR | S_IXUSR; if ((st.st_mode & PERM_MASK) != PERM_MASK) { if (chmod(path.c_str(), st.st_mode | PERM_MASK) == -1) - throw SysError(format("chmod '%1%'") % path); + throw SysError("chmod '%1%'", path); } for (auto & i : readDirectory(path)) @@ -416,7 +416,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed) if (remove(path.c_str()) == -1) { if (errno == ENOENT) return; - throw SysError(format("cannot unlink '%1%'") % path); + throw SysError("cannot unlink '%1%'", path); } } @@ -468,12 +468,12 @@ Path createTempDir(const Path & tmpRoot, const Path & prefix, "wheel", then "tar" will fail to unpack archives that have the setgid bit set on directories. */ if (chown(tmpDir.c_str(), (uid_t) -1, getegid()) != 0) - throw SysError(format("setting group of directory '%1%'") % tmpDir); + throw SysError("setting group of directory '%1%'", tmpDir); #endif return tmpDir; } if (errno != EEXIST) - throw SysError(format("creating directory '%1%'") % tmpDir); + throw SysError("creating directory '%1%'", tmpDir); } } @@ -555,15 +555,15 @@ Paths createDirs(const Path & path) if (lstat(path.c_str(), &st) == -1) { created = createDirs(dirOf(path)); if (mkdir(path.c_str(), 0777) == -1 && errno != EEXIST) - throw SysError(format("creating directory '%1%'") % path); + throw SysError("creating directory '%1%'", path); st = lstat(path); created.push_back(path); } if (S_ISLNK(st.st_mode) && stat(path.c_str(), &st) == -1) - throw SysError(format("statting symlink '%1%'") % path); + throw SysError("statting symlink '%1%'", path); - if (!S_ISDIR(st.st_mode)) throw Error(format("'%1%' is not a directory") % path); + if (!S_ISDIR(st.st_mode)) throw Error("'%1%' is not a directory", path); return created; } @@ -572,7 +572,7 @@ Paths createDirs(const Path & path) void createSymlink(const Path & target, const Path & link) { if (symlink(target.c_str(), link.c_str())) - throw SysError(format("creating symlink from '%1%' to '%2%'") % link % target); + throw SysError("creating symlink from '%1%' to '%2%'", link, target); } @@ -589,7 +589,7 @@ void replaceSymlink(const Path & target, const Path & link) } if (rename(tmp.c_str(), link.c_str()) != 0) - throw SysError(format("renaming '%1%' to '%2%'") % tmp % link); + throw SysError("renaming '%1%' to '%2%'", tmp, link); break; } @@ -694,7 +694,7 @@ AutoDelete::~AutoDelete() deletePath(path); else { if (remove(path.c_str()) == -1) - throw SysError(format("cannot unlink '%1%'") % path); + throw SysError("cannot unlink '%1%'", path); } } } catch (...) { @@ -760,7 +760,7 @@ void AutoCloseFD::close() if (fd != -1) { if (::close(fd) == -1) /* This should never happen. */ - throw SysError(format("closing file descriptor %1%") % fd); + throw SysError("closing file descriptor %1%", fd); } } @@ -920,7 +920,7 @@ void killUser(uid_t uid) #endif if (errno == ESRCH) break; /* no more processes */ if (errno != EINTR) - throw SysError(format("cannot kill processes for uid '%1%'") % uid); + throw SysError("cannot kill processes for uid '%1%'", uid); } _exit(0); @@ -928,7 +928,7 @@ void killUser(uid_t uid) int status = pid.wait(); if (status != 0) - throw Error(format("cannot kill processes for uid '%1%': %2%") % uid % statusToString(status)); + throw Error("cannot kill processes for uid '%1%': %2%", uid, statusToString(status)); /* !!! We should really do some check to make sure that there are no processes left running under `uid', but there is no portable @@ -1322,7 +1322,7 @@ void ignoreException() try { throw; } catch (std::exception & e) { - printError(format("error (ignored): %1%") % e.what()); + printError("error (ignored): %1%", e.what()); } } @@ -1440,7 +1440,7 @@ void callFailure(const std::function & failure, st try { failure(exc); } catch (std::exception & e) { - printError(format("uncaught exception: %s") % e.what()); + printError("uncaught exception: %s", e.what()); abort(); } } diff --git a/src/nix-channel/nix-channel.cc b/src/nix-channel/nix-channel.cc index a2639579d..c403e3780 100755 --- a/src/nix-channel/nix-channel.cc +++ b/src/nix-channel/nix-channel.cc @@ -37,7 +37,8 @@ static void writeChannels() { auto channelsFD = AutoCloseFD{open(channelsList.c_str(), O_WRONLY | O_CLOEXEC | O_CREAT | O_TRUNC, 0644)}; if (!channelsFD) - throw SysError(format("opening '%1%' for writing") % channelsList); + throw Error(""); + // throw SysError("opening '%1%' for writing", channelsList); for (const auto & channel : channels) writeFull(channelsFD.get(), channel.second + " " + channel.first + "\n"); } @@ -46,9 +47,11 @@ static void writeChannels() static void addChannel(const string & url, const string & name) { if (!regex_search(url, std::regex("^(file|http|https)://"))) - throw Error(format("invalid channel URL '%1%'") % url); + throw Error(""); + // throw Error("invalid channel URL '%1%'", url); if (!regex_search(name, std::regex("^[a-zA-Z0-9_][a-zA-Z0-9_\\.-]*$"))) - throw Error(format("invalid channel identifier '%1%'") % name); + throw Error(""); + // throw Error("invalid channel identifier '%1%'", name); readChannels(); channels[name] = url; writeChannels(); @@ -140,9 +143,11 @@ static void update(const StringSet & channelNames) if (S_ISLNK(st.st_mode)) // old-skool ~/.nix-defexpr if (unlink(nixDefExpr.c_str()) == -1) - throw SysError(format("unlinking %1%") % nixDefExpr); + throw Error(""); + // throw SysError("unlinking %1%", nixDefExpr); } else if (errno != ENOENT) { - throw SysError(format("getting status of %1%") % nixDefExpr); + throw Error(""); + // throw SysError("getting status of %1%", nixDefExpr); } createDirs(nixDefExpr); auto channelLink = nixDefExpr + "/channels"; @@ -194,10 +199,12 @@ static int _main(int argc, char ** argv) switch (cmd) { case cNone: - throw UsageError("no command specified"); + throw Error(""); + // throw UsageError("no command specified"); case cAdd: if (args.size() < 1 || args.size() > 2) - throw UsageError("'--add' requires one or two arguments"); + throw Error(""); + // throw UsageError("'--add' requires one or two arguments"); { auto url = args[0]; std::string name; @@ -213,12 +220,14 @@ static int _main(int argc, char ** argv) break; case cRemove: if (args.size() != 1) - throw UsageError("'--remove' requires one argument"); + throw Error(""); + // throw UsageError("'--remove' requires one argument"); removeChannel(args[0]); break; case cList: if (!args.empty()) - throw UsageError("'--list' expects no arguments"); + throw Error(""); + // throw UsageError("'--list' expects no arguments"); readChannels(); for (const auto & channel : channels) std::cout << channel.first << ' ' << channel.second << '\n'; @@ -228,7 +237,8 @@ static int _main(int argc, char ** argv) break; case cRollback: if (args.size() > 1) - throw UsageError("'--rollback' has at most one argument"); + throw Error(""); + // throw UsageError("'--rollback' has at most one argument"); Strings envArgs{"--profile", profile}; if (args.size() == 1) { envArgs.push_back("--switch-generation"); diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc index e68d1b1be..5f78ab464 100644 --- a/src/nix-daemon/nix-daemon.cc +++ b/src/nix-daemon/nix-daemon.cc @@ -36,7 +36,7 @@ using namespace nix::daemon; #define SPLICE_F_MOVE 0 static ssize_t splice(int fd_in, void *off_in, int fd_out, void *off_out, size_t len, unsigned int flags) { - /* We ignore most parameters, we just have them for conformance with the linux syscall */ + // We ignore most parameters, we just have them for conformance with the linux syscall std::vector buf(8192); auto read_count = read(fd_in, buf.data(), buf.size()); if (read_count == -1) @@ -57,7 +57,7 @@ static void sigChldHandler(int sigNo) { // Ensure we don't modify errno of whatever we've interrupted auto saved_errno = errno; - /* Reap all dead children. */ + // Reap all dead children. while (waitpid(-1, 0, WNOHANG) > 0) ; errno = saved_errno; } @@ -106,7 +106,7 @@ struct PeerInfo }; -/* Get the identity of the caller, if possible. */ +// Get the identity of the caller, if possible. static PeerInfo getPeerInfo(int remote) { PeerInfo peer = { false, 0, false, 0, false, 0 }; @@ -154,13 +154,12 @@ static void daemonLoop(char * * argv) if (chdir("/") == -1) throw SysError("cannot change current directory"); - /* Get rid of children automatically; don't let them become - zombies. */ + // Get rid of children automatically; don't let them become zombies. setSigChldAction(true); AutoCloseFD fdSocket; - /* Handle socket-based activation by systemd. */ + // Handle socket-based activation by systemd. auto listenFds = getEnv("LISTEN_FDS"); if (listenFds) { if (getEnv("LISTEN_PID") != std::to_string(getpid()) || listenFds != "1") @@ -169,17 +168,17 @@ static void daemonLoop(char * * argv) closeOnExec(fdSocket.get()); } - /* Otherwise, create and bind to a Unix domain socket. */ + // Otherwise, create and bind to a Unix domain socket. else { createDirs(dirOf(settings.nixDaemonSocketFile)); fdSocket = createUnixDomainSocket(settings.nixDaemonSocketFile, 0666); } - /* Loop accepting connections. */ + // Loop accepting connections. while (1) { try { - /* Accept a connection. */ + // Accept a connection. struct sockaddr_un remoteAddr; socklen_t remoteAddrLen = sizeof(remoteAddr); @@ -209,13 +208,13 @@ static void daemonLoop(char * * argv) trusted = Trusted; if ((!trusted && !matchUser(user, group, allowedUsers)) || group == settings.buildUsersGroup) - throw Error(format("user '%1%' is not allowed to connect to the Nix daemon") % user); + throw Error("user '%1%' is not allowed to connect to the Nix daemon", user); printInfo(format((string) "accepted connection from pid %1%, user %2%" + (trusted ? " (trusted)" : "")) % (peer.pidKnown ? std::to_string(peer.pid) : "") % (peer.uidKnown ? user : "")); - /* Fork a child to handle the connection. */ + // Fork a child to handle the connection. ProcessOptions options; options.errorPrefix = "unexpected Nix daemon error: "; options.dieWithParent = false; @@ -224,20 +223,20 @@ static void daemonLoop(char * * argv) startProcess([&]() { fdSocket = -1; - /* Background the daemon. */ + // Background the daemon. if (setsid() == -1) - throw SysError(format("creating a new session")); + throw SysError("creating a new session"); - /* Restore normal handling of SIGCHLD. */ + // Restore normal handling of SIGCHLD. setSigChldAction(false); - /* For debugging, stuff the pid into argv[1]. */ + // For debugging, stuff the pid into argv[1]. if (peer.pidKnown && argv[1]) { string processName = std::to_string(peer.pid); strncpy(argv[1], processName.c_str(), strlen(argv[1])); } - /* Handle the connection. */ + // Handle the connection. FdSource from(remote.get()); FdSink to(remote.get()); processConnection(openUncachedStore(), from, to, trusted, NotRecursive, user, peer.uid); @@ -248,7 +247,7 @@ static void daemonLoop(char * * argv) } catch (Interrupted & e) { return; } catch (Error & e) { - printError(format("error processing connection: %1%") % e.msg()); + printError("error processing connection: %1%", e.msg()); } } } @@ -261,7 +260,7 @@ static int _main(int argc, char * * argv) parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) { if (*arg == "--daemon") - ; /* ignored for backwards compatibility */ + ; // ignored for backwards compatibility else if (*arg == "--help") showManPage("nix-daemon"); else if (*arg == "--version") @@ -276,7 +275,7 @@ static int _main(int argc, char * * argv) if (stdio) { if (getStoreType() == tDaemon) { - /* Forward on this connection to the real daemon */ + // Forward on this connection to the real daemon auto socketPath = settings.nixDaemonSocketFile; auto s = socket(PF_UNIX, SOCK_STREAM, 0); if (s == -1) @@ -284,17 +283,17 @@ static int _main(int argc, char * * argv) auto socketDir = dirOf(socketPath); if (chdir(socketDir.c_str()) == -1) - throw SysError(format("changing to socket directory '%1%'") % socketDir); + throw SysError("changing to socket directory '%1%'", socketDir); auto socketName = std::string(baseNameOf(socketPath)); auto addr = sockaddr_un{}; addr.sun_family = AF_UNIX; if (socketName.size() + 1 >= sizeof(addr.sun_path)) - throw Error(format("socket name %1% is too long") % socketName); + throw Error("socket name %1% is too long", socketName); strcpy(addr.sun_path, socketName.c_str()); if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) == -1) - throw SysError(format("cannot connect to daemon at %1%") % socketPath); + throw SysError("cannot connect to daemon at %1%", socketPath); auto nfds = (s > STDIN_FILENO ? s : STDIN_FILENO) + 1; while (true) { diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index 1a2bb42a3..dde8875f1 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -25,7 +25,6 @@ #include #include - using namespace nix; using std::cout; @@ -70,8 +69,7 @@ typedef void (* Operation) (Globals & globals, static string needArg(Strings::iterator & i, Strings & args, const string & arg) { - if (i == args.end()) throw UsageError( - format("'%1%' requires an argument") % arg); + if (i == args.end()) throw UsageError( "'%1%' requires an argument", arg); return *i++; } @@ -133,7 +131,7 @@ static void getAllExprs(EvalState & state, Value & vArg(*state.allocValue()); mkString(vArg, path2); if (v.attrs->size() == v.attrs->capacity()) - throw Error(format("too many Nix expressions in directory '%1%'") % path); + throw Error("too many Nix expressions in directory '%1%'", path); mkApp(*state.allocAttr(v, state.symbols.create(attrName)), vFun, vArg); } else if (S_ISDIR(st.st_mode)) @@ -144,11 +142,12 @@ static void getAllExprs(EvalState & state, } + static void loadSourceExpr(EvalState & state, const Path & path, Value & v) { struct stat st; if (stat(path.c_str(), &st) == -1) - throw SysError(format("getting information about '%1%'") % path); + throw SysError("getting inon about '%1%'", path); if (isNixExpr(path, st)) state.evalFile(path, v); @@ -221,7 +220,7 @@ static void checkSelectorUse(DrvNames & selectors) /* Check that all selectors have been used. */ for (auto & i : selectors) if (i.hits == 0 && i.fullName != "*") - throw Error(format("selector '%1%' matches no derivations") % i.fullName); + throw Error("selector '%1%' matches no derivations", i.fullName); } @@ -507,7 +506,7 @@ static void opInstall(Globals & globals, Strings opFlags, Strings opArgs) globals.preserveInstalled = true; else if (arg == "--remove-all" || arg == "-r") globals.removeAll = true; - else throw UsageError(format("unknown flag '%1%'") % arg); + else throw UsageError("unknown flag '%1%'", arg); } installDerivations(globals, opArgs, globals.profile); @@ -618,7 +617,7 @@ static void opUpgrade(Globals & globals, Strings opFlags, Strings opArgs) else if (arg == "--leq") upgradeType = utLeq; else if (arg == "--eq") upgradeType = utEq; else if (arg == "--always") upgradeType = utAlways; - else throw UsageError(format("unknown flag '%1%'") % arg); + else throw UsageError("unknown flag '%1%'", arg); } upgradeDerivations(globals, opArgs, upgradeType); @@ -637,7 +636,7 @@ static void setMetaFlag(EvalState & state, DrvInfo & drv, static void opSetFlag(Globals & globals, Strings opFlags, Strings opArgs) { if (opFlags.size() > 0) - throw UsageError(format("unknown flag '%1%'") % opFlags.front()); + throw UsageError("unknown flag '%1%'", opFlags.front()); if (opArgs.size() < 2) throw UsageError("not enough arguments to '--set-flag'"); @@ -680,7 +679,7 @@ static void opSet(Globals & globals, Strings opFlags, Strings opArgs) for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) { string arg = *i++; if (parseInstallSourceOptions(globals, i, opFlags, arg)) ; - else throw UsageError(format("unknown flag '%1%'") % arg); + else throw UsageError("unknown flag '%1%'", arg); } DrvInfos elems; @@ -748,7 +747,7 @@ static void uninstallDerivations(Globals & globals, Strings & selectors, static void opUninstall(Globals & globals, Strings opFlags, Strings opArgs) { if (opFlags.size() > 0) - throw UsageError(format("unknown flag '%1%'") % opFlags.front()); + throw UsageError("unknown flag '%1%'", opFlags.front()); uninstallDerivations(globals, opArgs, globals.profile); } @@ -911,7 +910,7 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs) else if (arg == "--attr" || arg == "-A") attrPath = needArg(i, opFlags, arg); else - throw UsageError(format("unknown flag '%1%'") % arg); + throw UsageError("unknown flag '%1%'", arg); } if (printAttrPath && source != sAvailable) @@ -1177,9 +1176,9 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs) static void opSwitchProfile(Globals & globals, Strings opFlags, Strings opArgs) { if (opFlags.size() > 0) - throw UsageError(format("unknown flag '%1%'") % opFlags.front()); + throw UsageError("unknown flag '%1%'", opFlags.front()); if (opArgs.size() != 1) - throw UsageError(format("exactly one argument expected")); + throw UsageError("exactly one argument expected"); Path profile = absPath(opArgs.front()); Path profileLink = getHome() + "/.nix-profile"; @@ -1207,10 +1206,10 @@ static void switchGeneration(Globals & globals, int dstGen) if (!dst) { if (dstGen == prevGen) - throw Error(format("no generation older than the current (%1%) exists") - % curGen); + throw Error("no generation older than the current (%1%) exists", + curGen); else - throw Error(format("generation %1% does not exist") % dstGen); + throw Error("generation %1% does not exist", dstGen); } printInfo(format("switching from generation %1% to %2%") @@ -1225,13 +1224,13 @@ static void switchGeneration(Globals & globals, int dstGen) static void opSwitchGeneration(Globals & globals, Strings opFlags, Strings opArgs) { if (opFlags.size() > 0) - throw UsageError(format("unknown flag '%1%'") % opFlags.front()); + throw UsageError("unknown flag '%1%'", opFlags.front()); if (opArgs.size() != 1) - throw UsageError(format("exactly one argument expected")); + throw UsageError("exactly one argument expected"); int dstGen; if (!string2Int(opArgs.front(), dstGen)) - throw UsageError(format("expected a generation number")); + throw UsageError("expected a generation number"); switchGeneration(globals, dstGen); } @@ -1240,9 +1239,9 @@ static void opSwitchGeneration(Globals & globals, Strings opFlags, Strings opArg static void opRollback(Globals & globals, Strings opFlags, Strings opArgs) { if (opFlags.size() > 0) - throw UsageError(format("unknown flag '%1%'") % opFlags.front()); + throw UsageError("unknown flag '%1%'", opFlags.front()); if (opArgs.size() != 0) - throw UsageError(format("no arguments expected")); + throw UsageError("no arguments expected"); switchGeneration(globals, prevGen); } @@ -1251,9 +1250,9 @@ static void opRollback(Globals & globals, Strings opFlags, Strings opArgs) static void opListGenerations(Globals & globals, Strings opFlags, Strings opArgs) { if (opFlags.size() > 0) - throw UsageError(format("unknown flag '%1%'") % opFlags.front()); + throw UsageError("unknown flag '%1%'", opFlags.front()); if (opArgs.size() != 0) - throw UsageError(format("no arguments expected")); + throw UsageError("no arguments expected"); PathLocks lock; lockProfile(lock, globals.profile); @@ -1278,7 +1277,7 @@ static void opListGenerations(Globals & globals, Strings opFlags, Strings opArgs static void opDeleteGenerations(Globals & globals, Strings opFlags, Strings opArgs) { if (opFlags.size() > 0) - throw UsageError(format("unknown flag '%1%'") % opFlags.front()); + throw UsageError("unknown flag '%1%'", opFlags.front()); if (opArgs.size() == 1 && opArgs.front() == "old") { deleteOldGenerations(globals.profile, globals.dryRun); @@ -1286,18 +1285,18 @@ static void opDeleteGenerations(Globals & globals, Strings opFlags, Strings opAr deleteGenerationsOlderThan(globals.profile, opArgs.front(), globals.dryRun); } else if (opArgs.size() == 1 && opArgs.front().find('+') != string::npos) { if(opArgs.front().size() < 2) - throw Error(format("invalid number of generations ‘%1%’") % opArgs.front()); + throw Error("invalid number of generations ‘%1%’", opArgs.front()); string str_max = string(opArgs.front(), 1, opArgs.front().size()); int max; if (!string2Int(str_max, max) || max == 0) - throw Error(format("invalid number of generations to keep ‘%1%’") % opArgs.front()); + throw Error("invalid number of generations to keep ‘%1%’", opArgs.front()); deleteGenerationsGreaterThan(globals.profile, max, globals.dryRun); } else { std::set gens; for (auto & i : opArgs) { unsigned int n; if (!string2Int(i, n)) - throw UsageError(format("invalid generation number '%1%'") % i); + throw UsageError("invalid generation number '%1%'", i); gens.insert(n); } deleteGenerations(globals.profile, gens, globals.dryRun); diff --git a/src/nix-instantiate/nix-instantiate.cc b/src/nix-instantiate/nix-instantiate.cc index 6c99d1181..bf353677a 100644 --- a/src/nix-instantiate/nix-instantiate.cc +++ b/src/nix-instantiate/nix-instantiate.cc @@ -66,7 +66,7 @@ void processExpr(EvalState & state, const Strings & attrPaths, /* What output do we want? */ string outputName = i.queryOutputName(); if (outputName == "") - throw Error(format("derivation '%1%' lacks an 'outputName' attribute ") % drvPath); + throw Error("derivation '%1%' lacks an 'outputName' attribute ", drvPath); if (gcRoot == "") printGCWarning(); @@ -166,7 +166,7 @@ static int _main(int argc, char * * argv) if (findFile) { for (auto & i : files) { Path p = state->findFile(i); - if (p == "") throw Error(format("unable to find '%1%'") % i); + if (p == "") throw Error("unable to find '%1%'", i); std::cout << p << std::endl; } return 0; diff --git a/src/nix-prefetch-url/nix-prefetch-url.cc b/src/nix-prefetch-url/nix-prefetch-url.cc index 2b9254659..d3d05cc50 100644 --- a/src/nix-prefetch-url/nix-prefetch-url.cc +++ b/src/nix-prefetch-url/nix-prefetch-url.cc @@ -37,11 +37,11 @@ string resolveMirrorUri(EvalState & state, string uri) auto mirrorList = vMirrors.attrs->find(state.symbols.create(mirrorName)); if (mirrorList == vMirrors.attrs->end()) - throw Error(format("unknown mirror name '%1%'") % mirrorName); + throw Error("unknown mirror name '%1%'", mirrorName); state.forceList(*mirrorList->value); if (mirrorList->value->listSize() < 1) - throw Error(format("mirror URI '%1%' did not expand to anything") % uri); + throw Error("mirror URI '%1%' did not expand to anything", uri); string mirror = state.forceString(*mirrorList->value->listElems()[0]); return mirror + (hasSuffix(mirror, "/") ? "" : "/") + string(s, p + 1); @@ -73,7 +73,7 @@ static int _main(int argc, char * * argv) string s = getArg(*arg, arg, end); ht = parseHashType(s); if (ht == htUnknown) - throw UsageError(format("unknown hash type '%1%'") % s); + throw UsageError("unknown hash type '%1%'", s); } else if (*arg == "--print-path") printPath = true; @@ -151,7 +151,7 @@ static int _main(int argc, char * * argv) if (name.empty()) name = baseNameOf(uri); if (name.empty()) - throw Error(format("cannot figure out file name for '%1%'") % uri); + throw Error("cannot figure out file name for '%1%'", uri); /* If an expected hash is given, the file may already exist in the store. */ @@ -206,7 +206,7 @@ static int _main(int argc, char * * argv) hash = unpack ? hashPath(ht, tmpFile).first : hashFile(ht, tmpFile); if (expectedHash != Hash(ht) && expectedHash != hash) - throw Error(format("hash mismatch for '%1%'") % uri); + throw Error("hash mismatch for '%1%'", uri); /* Copy the file to the Nix store. FIXME: if RemoteStore implemented addToStoreFromDump() and downloadFile() diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index fcc00175a..e4dd9bc96 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -124,7 +124,7 @@ static void opRealise(Strings opFlags, Strings opArgs) else if (i == "--repair") buildMode = bmRepair; else if (i == "--check") buildMode = bmCheck; else if (i == "--ignore-unknown") ignoreUnknown = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); std::vector paths; for (auto & i : opArgs) @@ -178,7 +178,7 @@ static void opAddFixed(Strings opFlags, Strings opArgs) for (auto & i : opFlags) if (i == "--recursive") recursive = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); if (opArgs.empty()) throw UsageError("first argument must be hash algorithm"); @@ -198,10 +198,10 @@ static void opPrintFixedPath(Strings opFlags, Strings opArgs) for (auto i : opFlags) if (i == "--recursive") recursive = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); if (opArgs.size() != 3) - throw UsageError(format("'--print-fixed-path' requires three arguments")); + throw UsageError("'--print-fixed-path' requires three arguments"); Strings::iterator i = opArgs.begin(); HashType hashAlgo = parseHashType(*i++); @@ -296,9 +296,9 @@ static void opQuery(Strings opFlags, Strings opArgs) else if (i == "--use-output" || i == "-u") useOutput = true; else if (i == "--force-realise" || i == "--force-realize" || i == "-f") forceRealise = true; else if (i == "--include-outputs") includeOutputs = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); if (prev != qDefault && prev != query) - throw UsageError(format("query type '%1%' conflicts with earlier flag") % i); + throw UsageError("query type '%1%' conflicts with earlier flag", i); } if (query == qDefault) query = qOutputs; @@ -444,7 +444,7 @@ static void opPrintEnv(Strings opFlags, Strings opArgs) Derivation drv = store->derivationFromPath(store->parseStorePath(drvPath)); /* Print each environment variable in the derivation in a format - that can be sourced by the shell. */ + * that can be sourced by the shell. */ for (auto & i : drv.env) cout << format("export %1%; %1%=%2%\n") % i.first % shellEscape(i.second); @@ -531,7 +531,7 @@ static void opRegisterValidity(Strings opFlags, Strings opArgs) for (auto & i : opFlags) if (i == "--reregister") reregister = true; else if (i == "--hash-given") hashGiven = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); if (!opArgs.empty()) throw UsageError("no arguments expected"); @@ -545,7 +545,7 @@ static void opCheckValidity(Strings opFlags, Strings opArgs) for (auto & i : opFlags) if (i == "--print-invalid") printInvalid = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); for (auto & i : opArgs) { auto path = store->followLinksToStorePath(i); @@ -576,7 +576,7 @@ static void opGC(Strings opFlags, Strings opArgs) long long maxFreed = getIntArg(*i, i, opFlags.end(), true); options.maxFreed = maxFreed >= 0 ? maxFreed : 0; } - else throw UsageError(format("bad sub-operation '%1%' in GC") % *i); + else throw UsageError("bad sub-operation '%1%' in GC", *i); if (!opArgs.empty()) throw UsageError("no arguments expected"); @@ -612,7 +612,7 @@ static void opDelete(Strings opFlags, Strings opArgs) for (auto & i : opFlags) if (i == "--ignore-liveness") options.ignoreLiveness = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); for (auto & i : opArgs) options.pathsToDelete.insert(store->followLinksToStorePath(i)); @@ -650,7 +650,7 @@ static void opRestore(Strings opFlags, Strings opArgs) static void opExport(Strings opFlags, Strings opArgs) { for (auto & i : opFlags) - throw UsageError(format("unknown flag '%1%'") % i); + throw UsageError("unknown flag '%1%'", i); StorePathSet paths; @@ -666,7 +666,7 @@ static void opExport(Strings opFlags, Strings opArgs) static void opImport(Strings opFlags, Strings opArgs) { for (auto & i : opFlags) - throw UsageError(format("unknown flag '%1%'") % i); + throw UsageError("unknown flag '%1%'", i); if (!opArgs.empty()) throw UsageError("no arguments expected"); @@ -701,7 +701,7 @@ static void opVerify(Strings opFlags, Strings opArgs) for (auto & i : opFlags) if (i == "--check-contents") checkContents = true; else if (i == "--repair") repair = Repair; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); if (store->verifyStore(checkContents, repair)) { printError("warning: not all errors were fixed"); @@ -764,7 +764,7 @@ static void opServe(Strings opFlags, Strings opArgs) bool writeAllowed = false; for (auto & i : opFlags) if (i == "--write") writeAllowed = true; - else throw UsageError(format("unknown flag '%1%'") % i); + else throw UsageError("unknown flag '%1%'", i); if (!opArgs.empty()) throw UsageError("no arguments expected"); @@ -835,7 +835,7 @@ static void opServe(Strings opFlags, Strings opArgs) for (auto & p : willSubstitute) subs.emplace_back(p.clone()); store->buildPaths(subs); } catch (Error & e) { - printError(format("warning: %1%") % e.msg()); + printError("warning: %1%", e.msg()); } } @@ -906,7 +906,7 @@ static void opServe(Strings opFlags, Strings opArgs) if (!writeAllowed) throw Error("building paths is not allowed"); - auto drvPath = store->parseStorePath(readString(in)); // informational only + auto drvPath = store->parseStorePath(readString(in)); // inonal ony BasicDerivation drv; readDerivation(in, *store, drv); @@ -962,7 +962,7 @@ static void opServe(Strings opFlags, Strings opArgs) } default: - throw Error(format("unknown serve command %1%") % cmd); + throw Error("unknown serve command %1%", cmd); } out.flush(); @@ -973,7 +973,7 @@ static void opServe(Strings opFlags, Strings opArgs) static void opGenerateBinaryCacheKey(Strings opFlags, Strings opArgs) { for (auto & i : opFlags) - throw UsageError(format("unknown flag '%1%'") % i); + throw UsageError("unknown flag '%1%'", i); if (opArgs.size() != 3) throw UsageError("three arguments expected"); auto i = opArgs.begin(); diff --git a/src/nix/cat.cc b/src/nix/cat.cc index 851f90abd..4e14f50ed 100644 --- a/src/nix/cat.cc +++ b/src/nix/cat.cc @@ -13,9 +13,9 @@ struct MixCat : virtual Args { auto st = accessor->stat(path); if (st.type == FSAccessor::Type::tMissing) - throw Error(format("path '%1%' does not exist") % path); + throw Error("path '%1%' does not exist", path); if (st.type != FSAccessor::Type::tRegular) - throw Error(format("path '%1%' is not a regular file") % path); + throw Error("path '%1%' is not a regular file", path); std::cout << accessor->readFile(path); } diff --git a/src/nix/hash.cc b/src/nix/hash.cc index 0cc523f50..128708339 100644 --- a/src/nix/hash.cc +++ b/src/nix/hash.cc @@ -126,7 +126,7 @@ static int compatNixHash(int argc, char * * argv) string s = getArg(*arg, arg, end); ht = parseHashType(s); if (ht == htUnknown) - throw UsageError(format("unknown hash type '%1%'") % s); + throw UsageError("unknown hash type '%1%'", s); } else if (*arg == "--to-base16") op = opTo16; else if (*arg == "--to-base32") op = opTo32; diff --git a/src/nix/ls.cc b/src/nix/ls.cc index 3ef1f2750..5d55bd4d5 100644 --- a/src/nix/ls.cc +++ b/src/nix/ls.cc @@ -65,7 +65,7 @@ struct MixLs : virtual Args, MixJSON auto st = accessor->stat(path); if (st.type == FSAccessor::Type::tMissing) - throw Error(format("path '%1%' does not exist") % path); + throw Error("path '%1%' does not exist", path); doPath(st, path, st.type == FSAccessor::Type::tDirectory ? "." : std::string(baseNameOf(path)), showDirectory); diff --git a/src/nix/repl.cc b/src/nix/repl.cc index 27727bd25..c770fd4a4 100644 --- a/src/nix/repl.cc +++ b/src/nix/repl.cc @@ -252,12 +252,12 @@ void NixRepl::mainLoop(const std::vector & files) // input without clearing the input so far. continue; } else { - printMsg(lvlError, format(error + "%1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg()); + printMsg(lvlError, error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); } } catch (Error & e) { - printMsg(lvlError, format(error + "%1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg()); + printMsg(lvlError, error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); } catch (Interrupted & e) { - printMsg(lvlError, format(error + "%1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg()); + printMsg(lvlError, error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); } // We handled the current input fully, so we should clear it @@ -546,7 +546,7 @@ bool NixRepl::processLine(string line) return false; else if (command != "") - throw Error(format("unknown command '%1%'") % command); + throw Error("unknown command '%1%'", command); else { size_t p = line.find('='); diff --git a/src/nix/run.cc b/src/nix/run.cc index 8e30264c0..d790979a4 100644 --- a/src/nix/run.cc +++ b/src/nix/run.cc @@ -197,10 +197,10 @@ void chrootHelper(int argc, char * * argv) Finally freeCwd([&]() { free(cwd); }); if (chroot(tmpDir.c_str()) == -1) - throw SysError(format("chrooting into '%s'") % tmpDir); + throw SysError("chrooting into '%s'", tmpDir); if (chdir(cwd) == -1) - throw SysError(format("chdir to '%s' in chroot") % cwd); + throw SysError("chdir to '%s' in chroot", cwd); } else if (mount(realStoreDir.c_str(), storeDir.c_str(), "", MS_BIND, 0) == -1) throw SysError("mounting '%s' on '%s'", realStoreDir, storeDir); From 3bc9155dfc14434f5e9566fd15c79141899f6d07 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 22 Apr 2020 15:00:11 -0600 Subject: [PATCH 006/120] a few more 'format's rremoved --- src/libexpr/lexer.l | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libexpr/lexer.l b/src/libexpr/lexer.l index c34e5c383..85376a08f 100644 --- a/src/libexpr/lexer.l +++ b/src/libexpr/lexer.l @@ -127,14 +127,14 @@ or { return OR_KW; } try { yylval->n = boost::lexical_cast(yytext); } catch (const boost::bad_lexical_cast &) { - throw ParseError(format("invalid integer '%1%'") % yytext); + throw ParseError("invalid integer '%1%'", yytext); } return INT; } {FLOAT} { errno = 0; yylval->nf = strtod(yytext, 0); if (errno != 0) - throw ParseError(format("invalid float '%1%'") % yytext); + throw ParseError("invalid float '%1%'", yytext); return FLOAT; } From 833501f6f11095ae226c13948eb3dc1de2a246ea Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 23 Apr 2020 15:55:34 -0600 Subject: [PATCH 007/120] 'what' string --- src/libutil/types.hh | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 2261adb82..141bc6b3c 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -88,6 +88,13 @@ class BaseError : public std::exception protected: string prefix_; // used for location traces etc. ErrorInfo err; + string what_; + void initWhat() + { + std::ostringstream oss; + oss << err; + what_ = oss.str(); + } public: unsigned int status = 1; // exit status @@ -97,30 +104,27 @@ public: .hint = hintfmt(args...) } , status(status) - { - } + { initWhat(); } template BaseError(const Args & ... args) : err { .level = lvlError, .hint = hintfmt(args...) } - { - } + { initWhat(); } BaseError(ErrorInfo e) : err(e) - { - } + { initWhat(); } #ifdef EXCEPTION_NEEDS_THROW_SPEC ~BaseError() throw () { }; - const char * what() const throw () { return err.description.c_str(); } + const char * what() const throw () { return what_.c_str(); } #else - const char * what() const noexcept { return err.description.c_str(); } + const char * what() const noexcept { return what_.c_str(); } #endif - const string & msg() const { return err.description; } + const string & msg() const { return what_; } const string & prefix() const { return prefix_; } BaseError & addPrefix(const FormatOrString & fs); From d9632765a81604d270bf4693bddd53c22ee189d4 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 24 Apr 2020 12:44:23 -0600 Subject: [PATCH 008/120] add has_value check; remove obslete friend class --- src/libutil/error.cc | 2 +- src/libutil/fmt.hh | 5 ++--- src/libutil/logging.hh | 9 +++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 41595b0df..c6bca7135 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -162,7 +162,7 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) out << prefix << std::endl; // lines of code. - if (einfo.nixCode->errLineOfCode != "") { + if (einfo.nixCode.has_value() && einfo.nixCode->errLineOfCode != "") { printCodeLines(prefix, *einfo.nixCode); out << prefix << std::endl; } diff --git a/src/libutil/fmt.hh b/src/libutil/fmt.hh index d65215063..d182adc3a 100644 --- a/src/libutil/fmt.hh +++ b/src/libutil/fmt.hh @@ -92,9 +92,11 @@ public: { fmt.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); } + hintformat(const hintformat &hf) : fmt(hf.fmt) {} + template hintformat& operator%(const T &value) { @@ -102,14 +104,11 @@ public: return *this; } - std::string str() const { return fmt.str(); } - template - friend class AddHint; private: format fmt; }; diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 8269e2e1a..89fd98419 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -62,11 +62,12 @@ public: virtual void logEI(const ErrorInfo &ei) = 0; - void logEI(Verbosity lvl, ErrorInfo ei) { - ei.level = lvl; - logEI(ei); + void logEI(Verbosity lvl, ErrorInfo ei) + { + ei.level = lvl; + logEI(ei); } - + virtual void warn(const std::string & msg); virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type, From d8d4844b883dcea67cccb9bd75eecb14e60ae496 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 24 Apr 2020 14:57:51 -0600 Subject: [PATCH 009/120] all things error to error.hh --- src/libmain/shared.cc | 9 ++- src/libutil/error.cc | 18 +++++ src/libutil/types.hh | 151 ++---------------------------------------- src/libutil/util.cc | 18 ----- src/libutil/util.hh | 1 + 5 files changed, 30 insertions(+), 167 deletions(-) diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index f7ab56271..8551eb048 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -281,6 +281,8 @@ int handleExceptions(const string & programName, std::function fun) { ReceiveInterrupts receiveInterrupts; // FIXME: need better place for this + ErrorInfo::programName = programName; + string error = ANSI_RED "error:" ANSI_NORMAL " "; try { try { @@ -296,12 +298,15 @@ int handleExceptions(const string & programName, std::function fun) } catch (Exit & e) { return e.status; } catch (UsageError & e) { + // TODO: switch to logError + // logError(e.info()); printError( - format(error + "%1%\nTry '%2% --help' for more information.") + format("%1%\nTry '%2% --help' for more information.") % e.what() % programName); return 1; } catch (BaseError & e) { - printError(error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); + // logError(e.info()); + printError("%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); if (e.prefix() != "" && !settings.showTrace) printError("(use '--show-trace' to show detailed location information)"); return e.status; diff --git a/src/libutil/error.cc b/src/libutil/error.cc index c6bca7135..20b97ea3d 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -7,6 +7,24 @@ namespace nix { + +const std::string nativeSystem = SYSTEM; + + +BaseError & BaseError::addPrefix(const FormatOrString & fs) +{ + prefix_ = fs.s + prefix_; + return *this; +} + + +std::string SysError::addErrno(const std::string & s) +{ + errNo = errno; + return s + ": " + strerror(errNo); +} + + std::optional ErrorInfo::programName = std::nullopt; std::ostream& operator<<(std::ostream &os, const hintformat &hf) diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 141bc6b3c..f11256f61 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -5,20 +5,8 @@ #include #include -#include #include -#include -#include "fmt.hh" - -/* Before 4.7, gcc's std::exception uses empty throw() specifiers for - * its (virtual) destructor and what() in c++11 mode, in violation of spec - */ -#ifdef __GNUC__ -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7) -#define EXCEPTION_NEEDS_THROW_SPEC -#endif -#endif namespace nix { @@ -26,144 +14,13 @@ using std::list; using std::set; using std::vector; -typedef enum { - lvlError = 0, - lvlWarn, - lvlInfo, - lvlTalkative, - lvlChatty, - lvlDebug, - lvlVomit -} Verbosity; - -struct ErrPos -{ - int line; - int column; - string file; - - template - ErrPos& operator=(const P &pos) - { - line = pos.line; - column = pos.column; - file = pos.file; - return *this; - } - - template - ErrPos(const P &p) - { - *this = p; - } -}; - -struct NixCode -{ - ErrPos errPos; - std::optional prevLineOfCode; - string errLineOfCode; - std::optional nextLineOfCode; -}; - -// ------------------------------------------------- -// ErrorInfo. -struct ErrorInfo -{ - Verbosity level; - string name; - string description; - std::optional hint; - std::optional nixCode; - - static std::optional programName; -}; - -std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo); - -/* BaseError should generally not be caught, as it has Interrupted as - a subclass. Catch Error instead. */ -class BaseError : public std::exception -{ -protected: - string prefix_; // used for location traces etc. - ErrorInfo err; - string what_; - void initWhat() - { - std::ostringstream oss; - oss << err; - what_ = oss.str(); - } -public: - unsigned int status = 1; // exit status - - template - BaseError(unsigned int status, const Args & ... args) - : err { .level = lvlError, - .hint = hintfmt(args...) - } - , status(status) - { initWhat(); } - - template - BaseError(const Args & ... args) - : err { .level = lvlError, - .hint = hintfmt(args...) - } - { initWhat(); } - - BaseError(ErrorInfo e) - : err(e) - { initWhat(); } - -#ifdef EXCEPTION_NEEDS_THROW_SPEC - ~BaseError() throw () { }; - const char * what() const throw () { return what_.c_str(); } -#else - const char * what() const noexcept { return what_.c_str(); } -#endif - - const string & msg() const { return what_; } - const string & prefix() const { return prefix_; } - BaseError & addPrefix(const FormatOrString & fs); - - const ErrorInfo & info() const { return err; } -}; - -#define MakeError(newClass, superClass) \ - class newClass : public superClass \ - { \ - public: \ - using superClass::superClass; \ - } - -MakeError(Error, BaseError); - -class SysError : public Error -{ -public: - int errNo; - - template - SysError(const Args & ... args) - : Error(args...) // TODO addErrNo for hintfmt - // : Error(addErrno(hintfmt(args...))) - { } - -private: - - std::string addErrno(const std::string & s); -}; - - -typedef list Strings; -typedef set StringSet; +typedef list Strings; +typedef set StringSet; typedef std::map StringMap; - /* Paths are just strings. */ -typedef string Path; + +typedef std::string Path; typedef list Paths; typedef set PathSet; diff --git a/src/libutil/util.cc b/src/libutil/util.cc index bffcbcccf..747a9e991 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -40,24 +40,6 @@ extern char * * environ; namespace nix { - -const std::string nativeSystem = SYSTEM; - - -BaseError & BaseError::addPrefix(const FormatOrString & fs) -{ - prefix_ = fs.s + prefix_; - return *this; -} - - -std::string SysError::addErrno(const std::string & s) -{ - errNo = errno; - return s + ": " + strerror(errNo); -} - - std::optional getEnv(const std::string & key) { char * value = getenv(key.c_str()); diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 636f3ba6c..978e14a30 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -1,6 +1,7 @@ #pragma once #include "types.hh" +#include "error.hh" #include "logging.hh" #include "ansicolor.hh" From cdac083dc54b65f66f88caf193c617c1dbf3bbd6 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 24 Apr 2020 21:40:13 -0600 Subject: [PATCH 010/120] don't print blank lines for blank description --- src/libutil/error.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 20b97ea3d..c800fe9a8 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -88,7 +88,7 @@ void printCodeLines(const string &prefix, const NixCode &nixCode) std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) { int errwidth = 80; - string prefix = " "; + string prefix = ""; string levelString; switch (einfo.level) { @@ -176,8 +176,10 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) } // description - out << prefix << einfo.description << std::endl; - out << prefix << std::endl; + if (einfo.description != "") { + out << prefix << einfo.description << std::endl; + out << prefix << std::endl; + } // lines of code. if (einfo.nixCode.has_value() && einfo.nixCode->errLineOfCode != "") { From d4fd7b543ee8dcea2a06c2f857b7e4dd72d34ccc Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sat, 25 Apr 2020 12:05:26 -0600 Subject: [PATCH 011/120] print dashes instead of empty name string --- src/libutil/error.cc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/libutil/error.cc b/src/libutil/error.cc index c800fe9a8..2c34325ac 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -148,14 +148,21 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) dashes.append("-"); // divider. - out << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL, - prefix, - levelString, - "---", - einfo.name, - dashes, - einfo.programName.value_or("")) - << std::endl; + if (einfo.name != "") + out << fmt("%1%%2%" ANSI_BLUE " --- %3% %4% %5%" ANSI_NORMAL, + prefix, + levelString, + einfo.name, + dashes, + einfo.programName.value_or("")) + << std::endl; + else + out << fmt("%1%%2%" ANSI_BLUE " -----%3% %4%" ANSI_NORMAL, + prefix, + levelString, + dashes, + einfo.programName.value_or("")) + << std::endl; // filename. if (einfo.nixCode.has_value()) { From 1ff42722ce44f485c7dfabc6bb370494080f2755 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sun, 26 Apr 2020 14:47:41 -0600 Subject: [PATCH 012/120] error.hh --- src/libutil/error.hh | 157 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 src/libutil/error.hh diff --git a/src/libutil/error.hh b/src/libutil/error.hh new file mode 100644 index 000000000..e33b1d3d6 --- /dev/null +++ b/src/libutil/error.hh @@ -0,0 +1,157 @@ +#pragma once + + +#include "ref.hh" + +#include +#include +#include +#include + +#include "fmt.hh" + +/* Before 4.7, gcc's std::exception uses empty throw() specifiers for + * its (virtual) destructor and what() in c++11 mode, in violation of spec + */ +#ifdef __GNUC__ +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7) +#define EXCEPTION_NEEDS_THROW_SPEC +#endif +#endif + +namespace nix { + +using std::list; +using std::vector; + +typedef enum { + lvlError = 0, + lvlWarn, + lvlInfo, + lvlTalkative, + lvlChatty, + lvlDebug, + lvlVomit +} Verbosity; + +struct ErrPos +{ + int line; + int column; + string file; + + template + ErrPos& operator=(const P &pos) + { + line = pos.line; + column = pos.column; + file = pos.file; + return *this; + } + + template + ErrPos(const P &p) + { + *this = p; + } +}; + +struct NixCode +{ + ErrPos errPos; + std::optional prevLineOfCode; + string errLineOfCode; + std::optional nextLineOfCode; +}; + +// ------------------------------------------------- +// ErrorInfo. +struct ErrorInfo +{ + Verbosity level; + string name; + string description; + std::optional hint; + std::optional nixCode; + + static std::optional programName; +}; + +std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo); + +/* BaseError should generally not be caught, as it has Interrupted as + a subclass. Catch Error instead. */ +class BaseError : public std::exception +{ +protected: + string prefix_; // used for location traces etc. + ErrorInfo err; + string what_; + void initWhat() + { + std::ostringstream oss; + oss << err; + what_ = oss.str(); + } +public: + unsigned int status = 1; // exit status + + template + BaseError(unsigned int status, const Args & ... args) + : err { .level = lvlError, + .hint = hintfmt(args...) + } + , status(status) + { initWhat(); } + + template + BaseError(const Args & ... args) + : err { .level = lvlError, + .hint = hintfmt(args...) + } + { initWhat(); } + + BaseError(ErrorInfo e) + : err(e) + { initWhat(); } + +#ifdef EXCEPTION_NEEDS_THROW_SPEC + ~BaseError() throw () { }; + const char * what() const throw () { return what_.c_str(); } +#else + const char * what() const noexcept { return what_.c_str(); } +#endif + + const string & msg() const { return what_; } + const string & prefix() const { return prefix_; } + BaseError & addPrefix(const FormatOrString & fs); + + const ErrorInfo & info() const { return err; } +}; + +#define MakeError(newClass, superClass) \ + class newClass : public superClass \ + { \ + public: \ + using superClass::superClass; \ + } + +MakeError(Error, BaseError); + +class SysError : public Error +{ +public: + int errNo; + + template + SysError(const Args & ... args) + : Error(args...) // TODO addErrNo for hintfmt + // : Error(addErrno(hintfmt(args...))) + { } + +private: + + std::string addErrno(const std::string & s); +}; + +} From e51a757720ade58e48128730134400cf12f54851 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 27 Apr 2020 15:15:08 -0600 Subject: [PATCH 013/120] astyle format --- src/libutil/error.hh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libutil/error.hh b/src/libutil/error.hh index e33b1d3d6..b715c3e45 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -24,7 +24,8 @@ namespace nix { using std::list; using std::vector; -typedef enum { +typedef enum +{ lvlError = 0, lvlWarn, lvlInfo, @@ -52,7 +53,7 @@ struct ErrPos template ErrPos(const P &p) { - *this = p; + *this = p; } }; @@ -87,7 +88,7 @@ protected: string prefix_; // used for location traces etc. ErrorInfo err; string what_; - void initWhat() + void initWhat() { std::ostringstream oss; oss << err; @@ -106,7 +107,7 @@ public: template BaseError(const Args & ... args) - : err { .level = lvlError, + : err { .level = lvlError, .hint = hintfmt(args...) } { initWhat(); } @@ -146,7 +147,7 @@ public: template SysError(const Args & ... args) : Error(args...) // TODO addErrNo for hintfmt - // : Error(addErrno(hintfmt(args...))) + // : Error(addErrno(hintfmt(args...))) { } private: From 22e6490311015e076a09d5608834bd0dec1d7020 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 28 Apr 2020 21:06:08 -0600 Subject: [PATCH 014/120] Error classname as name --- src/error-demo/error-demo.cc | 16 +++++++++--- src/libstore/sqlite.cc | 2 +- src/libstore/sqlite.hh | 2 +- src/libutil/error.cc | 29 +++++++++++----------- src/libutil/error.hh | 47 +++++++++++++++++++++--------------- 5 files changed, 55 insertions(+), 41 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 14027278d..98018ca0e 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -4,10 +4,12 @@ #include #include +using namespace nix; + +MakeError(DemoError, Error); + int main() { - using namespace nix; - makeDefaultLogger(); verbosity = lvlVomit; @@ -15,6 +17,12 @@ int main() // In each program where errors occur, this has to be set. ErrorInfo::programName = std::optional("error-demo"); + try { + throw DemoError("demo error was thrown"); + } catch (Error &e) { + logger->logEI(e.info()); + } + // For completeness sake, info through vomit levels. // But this is maybe a heavy format for those. logger->logEI( @@ -79,7 +87,7 @@ int main() .prevLineOfCode = std::nullopt, .errLineOfCode = "this is the problem line of code", .nextLineOfCode = std::nullopt - }}); + }}); // Error with previous and next lines of code. logError( @@ -93,7 +101,7 @@ int main() .prevLineOfCode = std::optional("previous line of code"), .errLineOfCode = "this is the problem line of code", .nextLineOfCode = std::optional("next line of code"), - }}); + }}); return 0; diff --git a/src/libstore/sqlite.cc b/src/libstore/sqlite.cc index 3407e5826..a72cd5d88 100644 --- a/src/libstore/sqlite.cc +++ b/src/libstore/sqlite.cc @@ -196,7 +196,7 @@ SQLiteTxn::~SQLiteTxn() } } -void handleSQLiteBusy(const SQLiteBusy & e) +void handleSQLiteBusy(SQLiteBusy & e) { static std::atomic lastWarned{0}; diff --git a/src/libstore/sqlite.hh b/src/libstore/sqlite.hh index fd04c9b07..ce27033c9 100644 --- a/src/libstore/sqlite.hh +++ b/src/libstore/sqlite.hh @@ -99,7 +99,7 @@ MakeError(SQLiteBusy, SQLiteError); [[noreturn]] void throwSQLiteError(sqlite3 * db, const FormatOrString & fs); -void handleSQLiteBusy(const SQLiteBusy & e); +void handleSQLiteBusy(SQLiteBusy & e); /* Convenience function for retrying a SQLite transaction when the database is busy. */ diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 2c34325ac..8f0e0aa1a 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -4,8 +4,7 @@ #include #include "serialise.hh" -namespace nix -{ +namespace nix { const std::string nativeSystem = SYSTEM; @@ -149,20 +148,20 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) // divider. if (einfo.name != "") - out << fmt("%1%%2%" ANSI_BLUE " --- %3% %4% %5%" ANSI_NORMAL, - prefix, - levelString, - einfo.name, - dashes, - einfo.programName.value_or("")) - << std::endl; + out << fmt("%1%%2%" ANSI_BLUE " --- %3% %4% %5%" ANSI_NORMAL, + prefix, + levelString, + einfo.name, + dashes, + einfo.programName.value_or("")) + << std::endl; else - out << fmt("%1%%2%" ANSI_BLUE " -----%3% %4%" ANSI_NORMAL, - prefix, - levelString, - dashes, - einfo.programName.value_or("")) - << std::endl; + out << fmt("%1%%2%" ANSI_BLUE " -----%3% %4%" ANSI_NORMAL, + prefix, + levelString, + dashes, + einfo.programName.value_or("")) + << std::endl; // filename. if (einfo.nixCode.has_value()) { diff --git a/src/libutil/error.hh b/src/libutil/error.hh index b715c3e45..03e43241f 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -24,8 +24,7 @@ namespace nix { using std::list; using std::vector; -typedef enum -{ +typedef enum { lvlError = 0, lvlWarn, lvlInfo, @@ -35,8 +34,7 @@ typedef enum lvlVomit } Verbosity; -struct ErrPos -{ +struct ErrPos { int line; int column; string file; @@ -57,8 +55,7 @@ struct ErrPos } }; -struct NixCode -{ +struct NixCode { ErrPos errPos; std::optional prevLineOfCode; string errLineOfCode; @@ -67,8 +64,7 @@ struct NixCode // ------------------------------------------------- // ErrorInfo. -struct ErrorInfo -{ +struct ErrorInfo { Verbosity level; string name; string description; @@ -87,12 +83,20 @@ class BaseError : public std::exception protected: string prefix_; // used for location traces etc. ErrorInfo err; - string what_; - void initWhat() + std::optional what_; + const string& calcWhat() { - std::ostringstream oss; - oss << err; - what_ = oss.str(); + if (what_.has_value()) + return *what_; + else { + err.name = sname(); + + std::ostringstream oss; + oss << err; + what_ = oss.str(); + + return *what_; + } } public: unsigned int status = 1; // exit status @@ -103,31 +107,33 @@ public: .hint = hintfmt(args...) } , status(status) - { initWhat(); } + { } template BaseError(const Args & ... args) : err { .level = lvlError, .hint = hintfmt(args...) } - { initWhat(); } + { } BaseError(ErrorInfo e) : err(e) - { initWhat(); } + { } + + virtual const char* sname() const { return "BaseError"; } #ifdef EXCEPTION_NEEDS_THROW_SPEC ~BaseError() throw () { }; - const char * what() const throw () { return what_.c_str(); } + const char * what() throw () { return calcWhat().c_str(); } #else - const char * what() const noexcept { return what_.c_str(); } + const char * what() noexcept { return calcWhat().c_str(); } #endif - const string & msg() const { return what_; } + const string & msg() { return calcWhat(); } const string & prefix() const { return prefix_; } BaseError & addPrefix(const FormatOrString & fs); - const ErrorInfo & info() const { return err; } + const ErrorInfo & info() { calcWhat(); return err; } }; #define MakeError(newClass, superClass) \ @@ -135,6 +141,7 @@ public: { \ public: \ using superClass::superClass; \ + virtual const char* sname() const override { return #newClass; } \ } MakeError(Error, BaseError); From e2f61263ebf41958f4f3d6f6135377024e33457c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 29 Apr 2020 10:14:32 -0600 Subject: [PATCH 015/120] uncrustify formatting --- .uncrustify.cfg | 2989 ++++++++++++++++++++++++++++++++++ src/error-demo/error-demo.cc | 26 +- src/libexpr/nixexpr.hh | 3 +- src/libutil/error.cc | 48 +- src/libutil/logging.cc | 42 +- src/libutil/logging.hh | 4 +- 6 files changed, 3050 insertions(+), 62 deletions(-) create mode 100644 .uncrustify.cfg diff --git a/.uncrustify.cfg b/.uncrustify.cfg new file mode 100644 index 000000000..23305adcf --- /dev/null +++ b/.uncrustify.cfg @@ -0,0 +1,2989 @@ +# Uncrustify-0.70.1_f + +# +# General options +# + +# The type of line endings. +# +# Default: auto +newlines = auto # lf/crlf/cr/auto + +# The original size of tabs in the input. +# +# Default: 8 +input_tab_size = 4 # unsigned number + +# The size of tabs in the output (only used if align_with_tabs=true). +# +# Default: 8 +output_tab_size = 4 # unsigned number + +# The ASCII value of the string escape char, usually 92 (\) or (Pawn) 94 (^). +# +# Default: 92 +string_escape_char = 92 # unsigned number + +# Alternate string escape char (usually only used for Pawn). +# Only works right before the quote char. +string_escape_char2 = 0 # unsigned number + +# Replace tab characters found in string literals with the escape sequence \t +# instead. +string_replace_tab_chars = false # true/false + +# Allow interpreting '>=' and '>>=' as part of a template in code like +# 'void f(list>=val);'. If true, 'assert(x<0 && y>=3)' will be broken. +# Improvements to template detection may make this option obsolete. +tok_split_gte = false # true/false + +# Specify the marker used in comments to disable processing of part of the +# file. +# +# Default: *INDENT-OFF* +disable_processing_cmt = " *INDENT-OFF*" # string + +# Specify the marker used in comments to (re)enable processing in a file. +# +# Default: *INDENT-ON* +enable_processing_cmt = " *INDENT-ON*" # string + +# Enable parsing of digraphs. +enable_digraphs = false # true/false + +# Add or remove the UTF-8 BOM (recommend 'remove'). +utf8_bom = ignore # ignore/add/remove/force + +# If the file contains bytes with values between 128 and 255, but is not +# UTF-8, then output as UTF-8. +utf8_byte = false # true/false + +# Force the output encoding to UTF-8. +utf8_force = false # true/false + +# Add or remove space between 'do' and '{'. +sp_do_brace_open = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'while'. +sp_brace_close_while = ignore # ignore/add/remove/force + +# Add or remove space between 'while' and '('. +sp_while_paren_open = ignore # ignore/add/remove/force + +# +# Spacing options +# + +# Add or remove space around non-assignment symbolic operators ('+', '/', '%', +# '<<', and so forth). +sp_arith = ignore # ignore/add/remove/force + +# Add or remove space around arithmetic operators '+' and '-'. +# +# Overrides sp_arith. +sp_arith_additive = ignore # ignore/add/remove/force + +# Add or remove space around assignment operator '=', '+=', etc. +sp_assign = ignore # ignore/add/remove/force + +# Add or remove space around '=' in C++11 lambda capture specifications. +# +# Overrides sp_assign. +sp_cpp_lambda_assign = ignore # ignore/add/remove/force + +# Add or remove space after the capture specification of a C++11 lambda when +# an argument list is present, as in '[] (int x){ ... }'. +sp_cpp_lambda_square_paren = ignore # ignore/add/remove/force + +# Add or remove space after the capture specification of a C++11 lambda with +# no argument list is present, as in '[] { ... }'. +sp_cpp_lambda_square_brace = ignore # ignore/add/remove/force + +# Add or remove space after the argument list of a C++11 lambda, as in +# '[](int x) { ... }'. +sp_cpp_lambda_paren_brace = ignore # ignore/add/remove/force + +# Add or remove space between a lambda body and its call operator of an +# immediately invoked lambda, as in '[]( ... ){ ... } ( ... )'. +sp_cpp_lambda_fparen = ignore # ignore/add/remove/force + +# Add or remove space around assignment operator '=' in a prototype. +# +# If set to ignore, use sp_assign. +sp_assign_default = ignore # ignore/add/remove/force + +# Add or remove space before assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_before_assign = ignore # ignore/add/remove/force + +# Add or remove space after assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_after_assign = ignore # ignore/add/remove/force + +# Add or remove space in 'NS_ENUM ('. +sp_enum_paren = ignore # ignore/add/remove/force + +# Add or remove space around assignment '=' in enum. +sp_enum_assign = ignore # ignore/add/remove/force + +# Add or remove space before assignment '=' in enum. +# +# Overrides sp_enum_assign. +sp_enum_before_assign = ignore # ignore/add/remove/force + +# Add or remove space after assignment '=' in enum. +# +# Overrides sp_enum_assign. +sp_enum_after_assign = ignore # ignore/add/remove/force + +# Add or remove space around assignment ':' in enum. +sp_enum_colon = ignore # ignore/add/remove/force + +# Add or remove space around preprocessor '##' concatenation operator. +# +# Default: add +sp_pp_concat = add # ignore/add/remove/force + +# Add or remove space after preprocessor '#' stringify operator. +# Also affects the '#@' charizing operator. +sp_pp_stringify = ignore # ignore/add/remove/force + +# Add or remove space before preprocessor '#' stringify operator +# as in '#define x(y) L#y'. +sp_before_pp_stringify = ignore # ignore/add/remove/force + +# Add or remove space around boolean operators '&&' and '||'. +sp_bool = ignore # ignore/add/remove/force + +# Add or remove space around compare operator '<', '>', '==', etc. +sp_compare = ignore # ignore/add/remove/force + +# Add or remove space inside '(' and ')'. +sp_inside_paren = ignore # ignore/add/remove/force + +# Add or remove space between nested parentheses, i.e. '((' vs. ') )'. +sp_paren_paren = ignore # ignore/add/remove/force + +# Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('. +sp_cparen_oparen = ignore # ignore/add/remove/force + +# Whether to balance spaces inside nested parentheses. +sp_balance_nested_parens = false # true/false + +# Add or remove space between ')' and '{'. +sp_paren_brace = ignore # ignore/add/remove/force + +# Add or remove space between nested braces, i.e. '{{' vs '{ {'. +sp_brace_brace = ignore # ignore/add/remove/force + +# Add or remove space before pointer star '*'. +sp_before_ptr_star = ignore # ignore/add/remove/force + +# Add or remove space before pointer star '*' that isn't followed by a +# variable name. If set to ignore, sp_before_ptr_star is used instead. +sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force + +# Add or remove space between pointer stars '*'. +sp_between_ptr_star = ignore # ignore/add/remove/force + +# Add or remove space after pointer star '*', if followed by a word. +# +# Overrides sp_type_func. +sp_after_ptr_star = ignore # ignore/add/remove/force + +# Add or remove space after pointer caret '^', if followed by a word. +sp_after_ptr_block_caret = ignore # ignore/add/remove/force + +# Add or remove space after pointer star '*', if followed by a qualifier. +sp_after_ptr_star_qualifier = ignore # ignore/add/remove/force + +# Add or remove space after a pointer star '*', if followed by a function +# prototype or function definition. +# +# Overrides sp_after_ptr_star and sp_type_func. +sp_after_ptr_star_func = ignore # ignore/add/remove/force + +# Add or remove space after a pointer star '*', if followed by an open +# parenthesis, as in 'void* (*)(). +sp_ptr_star_paren = ignore # ignore/add/remove/force + +# Add or remove space before a pointer star '*', if followed by a function +# prototype or function definition. +sp_before_ptr_star_func = ignore # ignore/add/remove/force + +# Add or remove space before a reference sign '&'. +sp_before_byref = ignore # ignore/add/remove/force + +# Add or remove space before a reference sign '&' that isn't followed by a +# variable name. If set to ignore, sp_before_byref is used instead. +sp_before_unnamed_byref = ignore # ignore/add/remove/force + +# Add or remove space after reference sign '&', if followed by a word. +# +# Overrides sp_type_func. +sp_after_byref = ignore # ignore/add/remove/force + +# Add or remove space after a reference sign '&', if followed by a function +# prototype or function definition. +# +# Overrides sp_after_byref and sp_type_func. +sp_after_byref_func = ignore # ignore/add/remove/force + +# Add or remove space before a reference sign '&', if followed by a function +# prototype or function definition. +sp_before_byref_func = ignore # ignore/add/remove/force + +# Add or remove space between type and word. +# +# Default: force +sp_after_type = force # ignore/add/remove/force + +# Add or remove space between 'decltype(...)' and word. +sp_after_decltype = ignore # ignore/add/remove/force + +# (D) Add or remove space before the parenthesis in the D constructs +# 'template Foo(' and 'class Foo('. +sp_before_template_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'template' and '<'. +# If set to ignore, sp_before_angle is used. +sp_template_angle = ignore # ignore/add/remove/force + +# Add or remove space before '<'. +sp_before_angle = ignore # ignore/add/remove/force + +# Add or remove space inside '<' and '>'. +sp_inside_angle = ignore # ignore/add/remove/force + +# Add or remove space inside '<>'. +sp_inside_angle_empty = ignore # ignore/add/remove/force + +# Add or remove space between '>' and ':'. +sp_angle_colon = ignore # ignore/add/remove/force + +# Add or remove space after '>'. +sp_after_angle = ignore # ignore/add/remove/force + +# Add or remove space between '>' and '(' as found in 'new List(foo);'. +sp_angle_paren = ignore # ignore/add/remove/force + +# Add or remove space between '>' and '()' as found in 'new List();'. +sp_angle_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space between '>' and a word as in 'List m;' or +# 'template static ...'. +sp_angle_word = ignore # ignore/add/remove/force + +# Add or remove space between '>' and '>' in '>>' (template stuff). +# +# Default: add +sp_angle_shift = add # ignore/add/remove/force + +# (C++11) Permit removal of the space between '>>' in 'foo >'. Note +# that sp_angle_shift cannot remove the space without this option. +sp_permit_cpp11_shift = false # true/false + +# Add or remove space before '(' of control statements ('if', 'for', 'switch', +# 'while', etc.). +sp_before_sparen = ignore # ignore/add/remove/force + +# Add or remove space inside '(' and ')' of control statements. +sp_inside_sparen = ignore # ignore/add/remove/force + +# Add or remove space after '(' of control statements. +# +# Overrides sp_inside_sparen. +sp_inside_sparen_open = ignore # ignore/add/remove/force + +# Add or remove space before ')' of control statements. +# +# Overrides sp_inside_sparen. +sp_inside_sparen_close = ignore # ignore/add/remove/force + +# Add or remove space after ')' of control statements. +sp_after_sparen = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '{' of of control statements. +sp_sparen_brace = ignore # ignore/add/remove/force + +# (D) Add or remove space between 'invariant' and '('. +sp_invariant_paren = ignore # ignore/add/remove/force + +# (D) Add or remove space after the ')' in 'invariant (C) c'. +sp_after_invariant_paren = ignore # ignore/add/remove/force + +# Add or remove space before empty statement ';' on 'if', 'for' and 'while'. +sp_special_semi = ignore # ignore/add/remove/force + +# Add or remove space before ';'. +# +# Default: remove +sp_before_semi = remove # ignore/add/remove/force + +# Add or remove space before ';' in non-empty 'for' statements. +sp_before_semi_for = ignore # ignore/add/remove/force + +# Add or remove space before a semicolon of an empty part of a for statement. +sp_before_semi_for_empty = ignore # ignore/add/remove/force + +# Add or remove space after ';', except when followed by a comment. +# +# Default: add +sp_after_semi = add # ignore/add/remove/force + +# Add or remove space after ';' in non-empty 'for' statements. +# +# Default: force +sp_after_semi_for = force # ignore/add/remove/force + +# Add or remove space after the final semicolon of an empty part of a for +# statement, as in 'for ( ; ; )'. +sp_after_semi_for_empty = ignore # ignore/add/remove/force + +# Add or remove space before '[' (except '[]'). +sp_before_square = ignore # ignore/add/remove/force + +# Add or remove space before '[' for a variable definition. +# +# Default: remove +sp_before_vardef_square = remove # ignore/add/remove/force + +# Add or remove space before '[' for asm block. +sp_before_square_asm_block = ignore # ignore/add/remove/force + +# Add or remove space before '[]'. +sp_before_squares = ignore # ignore/add/remove/force + +# Add or remove space before C++17 structured bindings. +sp_cpp_before_struct_binding = ignore # ignore/add/remove/force + +# Add or remove space inside a non-empty '[' and ']'. +sp_inside_square = ignore # ignore/add/remove/force + +# (OC) Add or remove space inside a non-empty Objective-C boxed array '@[' and +# ']'. If set to ignore, sp_inside_square is used. +sp_inside_square_oc_array = ignore # ignore/add/remove/force + +# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. +sp_after_comma = ignore # ignore/add/remove/force + +# Add or remove space before ','. +# +# Default: remove +sp_before_comma = remove # ignore/add/remove/force + +# (C#) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force + +# (C#) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force + +# (C#) Add or remove space between ',' in multidimensional array type +# like 'int[,,]'. +sp_between_mdatype_commas = ignore # ignore/add/remove/force + +# Add or remove space between an open parenthesis and comma, +# i.e. '(,' vs. '( ,'. +# +# Default: force +sp_paren_comma = force # ignore/add/remove/force + +# Add or remove space before the variadic '...' when preceded by a +# non-punctuator. +sp_before_ellipsis = remove # ignore/add/remove/force + +# Add or remove space between a type and '...'. +sp_type_ellipsis = ignore # ignore/add/remove/force + +# (D) Add or remove space between a type and '?'. +sp_type_question = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '...'. +sp_paren_ellipsis = ignore # ignore/add/remove/force + +# Add or remove space between ')' and a qualifier such as 'const'. +sp_paren_qualifier = ignore # ignore/add/remove/force + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = ignore # ignore/add/remove/force + +# Add or remove space after class ':'. +sp_after_class_colon = ignore # ignore/add/remove/force + +# Add or remove space before class ':'. +sp_before_class_colon = ignore # ignore/add/remove/force + +# Add or remove space after class constructor ':'. +sp_after_constr_colon = ignore # ignore/add/remove/force + +# Add or remove space before class constructor ':'. +sp_before_constr_colon = ignore # ignore/add/remove/force + +# Add or remove space before case ':'. +# +# Default: remove +sp_before_case_colon = remove # ignore/add/remove/force + +# Add or remove space between 'operator' and operator sign. +sp_after_operator = ignore # ignore/add/remove/force + +# Add or remove space between the operator symbol and the open parenthesis, as +# in 'operator ++('. +sp_after_operator_sym = ignore # ignore/add/remove/force + +# Overrides sp_after_operator_sym when the operator has no arguments, as in +# 'operator *()'. +sp_after_operator_sym_empty = ignore # ignore/add/remove/force + +# Add or remove space after C/D cast, i.e. 'cast(int)a' vs. 'cast(int) a' or +# '(int)a' vs. '(int) a'. +sp_after_cast = ignore # ignore/add/remove/force + +# Add or remove spaces inside cast parentheses. +sp_inside_paren_cast = ignore # ignore/add/remove/force + +# Add or remove space between the type and open parenthesis in a C++ cast, +# i.e. 'int(exp)' vs. 'int (exp)'. +sp_cpp_cast_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'sizeof' and '('. +sp_sizeof_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'sizeof' and '...'. +sp_sizeof_ellipsis = ignore # ignore/add/remove/force + +# Add or remove space between 'sizeof...' and '('. +sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'decltype' and '('. +sp_decltype_paren = ignore # ignore/add/remove/force + +# (Pawn) Add or remove space after the tag keyword. +sp_after_tag = ignore # ignore/add/remove/force + +# Add or remove space inside enum '{' and '}'. +sp_inside_braces_enum = ignore # ignore/add/remove/force + +# Add or remove space inside struct/union '{' and '}'. +sp_inside_braces_struct = ignore # ignore/add/remove/force + +# (OC) Add or remove space inside Objective-C boxed dictionary '{' and '}' +sp_inside_braces_oc_dict = ignore # ignore/add/remove/force + +# Add or remove space after open brace in an unnamed temporary +# direct-list-initialization. +sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force + +# Add or remove space before close brace in an unnamed temporary +# direct-list-initialization. +sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force + +# Add or remove space inside an unnamed temporary direct-list-initialization. +sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force + +# Add or remove space inside '{' and '}'. +sp_inside_braces = ignore # ignore/add/remove/force + +# Add or remove space inside '{}'. +sp_inside_braces_empty = ignore # ignore/add/remove/force + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = ignore # ignore/add/remove/force + +# Add or remove space between return type and function name. A minimum of 1 +# is forced except for pointer return types. +sp_type_func = ignore # ignore/add/remove/force + +# Add or remove space between type and open brace of an unnamed temporary +# direct-list-initialization. +sp_type_brace_init_lst = ignore # ignore/add/remove/force + +# Add or remove space between function name and '(' on function declaration. +sp_func_proto_paren = ignore # ignore/add/remove/force + +# Add or remove space between function name and '()' on function declaration +# without parameters. +sp_func_proto_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space between function name and '(' with a typedef specifier. +sp_func_type_paren = ignore # ignore/add/remove/force + +# Add or remove space between alias name and '(' of a non-pointer function type typedef. +sp_func_def_paren = ignore # ignore/add/remove/force + +# Add or remove space between function name and '()' on function definition +# without parameters. +sp_func_def_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space inside empty function '()'. +# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. +sp_inside_fparens = ignore # ignore/add/remove/force + +# Add or remove space inside function '(' and ')'. +sp_inside_fparen = ignore # ignore/add/remove/force + +# Add or remove space inside the first parentheses in a function type, as in +# 'void (*x)(...)'. +sp_inside_tparen = ignore # ignore/add/remove/force + +# Add or remove space between the ')' and '(' in a function type, as in +# 'void (*x)(...)'. +sp_after_tparen_close = ignore # ignore/add/remove/force + +# Add or remove space between ']' and '(' when part of a function call. +sp_square_fparen = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '{' of function. +sp_fparen_brace = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '{' of s function call in object +# initialization. +# +# Overrides sp_fparen_brace. +sp_fparen_brace_initializer = ignore # ignore/add/remove/force + +# (Java) Add or remove space between ')' and '{{' of double brace initializer. +sp_fparen_dbrace = ignore # ignore/add/remove/force + +# Add or remove space between function name and '(' on function calls. +sp_func_call_paren = ignore # ignore/add/remove/force + +# Add or remove space between function name and '()' on function calls without +# parameters. If set to ignore (the default), sp_func_call_paren is used. +sp_func_call_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space between the user function name and '(' on function +# calls. You need to set a keyword to be a user function in the config file, +# like: +# set func_call_user tr _ i18n +sp_func_call_user_paren = ignore # ignore/add/remove/force + +# Add or remove space inside user function '(' and ')'. +sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force + +# Add or remove space between nested parentheses with user functions, +# i.e. '((' vs. '( ('. +sp_func_call_user_paren_paren = ignore # ignore/add/remove/force + +# Add or remove space between a constructor/destructor and the open +# parenthesis. +sp_func_class_paren = ignore # ignore/add/remove/force + +# Add or remove space between a constructor without parameters or destructor +# and '()'. +sp_func_class_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space between 'return' and '('. +sp_return_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'return' and '{'. +sp_return_brace = ignore # ignore/add/remove/force + +# Add or remove space between '__attribute__' and '('. +sp_attribute_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'defined' and '(' in '#if defined (FOO)'. +sp_defined_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'throw' and '(' in 'throw (something)'. +sp_throw_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'throw' and anything other than '(' as in +# '@throw [...];'. +sp_after_throw = ignore # ignore/add/remove/force + +# Add or remove space between 'catch' and '(' in 'catch (something) { }'. +# If set to ignore, sp_before_sparen is used. +sp_catch_paren = ignore # ignore/add/remove/force + +# (OC) Add or remove space between '@catch' and '(' +# in '@catch (something) { }'. If set to ignore, sp_catch_paren is used. +sp_oc_catch_paren = ignore # ignore/add/remove/force + +# (OC) Add or remove space between class name and '(' +# in '@interface className(categoryName):BaseClass' +sp_oc_classname_paren = ignore # ignore/add/remove/force + +# (D) Add or remove space between 'version' and '(' +# in 'version (something) { }'. If set to ignore, sp_before_sparen is used. +sp_version_paren = ignore # ignore/add/remove/force + +# (D) Add or remove space between 'scope' and '(' +# in 'scope (something) { }'. If set to ignore, sp_before_sparen is used. +sp_scope_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'super' and '(' in 'super (something)'. +# +# Default: remove +sp_super_paren = remove # ignore/add/remove/force + +# Add or remove space between 'this' and '(' in 'this (something)'. +# +# Default: remove +sp_this_paren = remove # ignore/add/remove/force + +# Add or remove space between a macro name and its definition. +sp_macro = ignore # ignore/add/remove/force + +# Add or remove space between a macro function ')' and its definition. +sp_macro_func = ignore # ignore/add/remove/force + +# Add or remove space between 'else' and '{' if on the same line. +sp_else_brace = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'else' if on the same line. +sp_brace_else = ignore # ignore/add/remove/force + +# Add or remove space between '}' and the name of a typedef on the same line. +sp_brace_typedef = ignore # ignore/add/remove/force + +# Add or remove space before the '{' of a 'catch' statement, if the '{' and +# 'catch' are on the same line, as in 'catch (decl) {'. +sp_catch_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove space before the '{' of a '@catch' statement, if the '{' +# and '@catch' are on the same line, as in '@catch (decl) {'. +# If set to ignore, sp_catch_brace is used. +sp_oc_catch_brace = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'catch' if on the same line. +sp_brace_catch = ignore # ignore/add/remove/force + +# (OC) Add or remove space between '}' and '@catch' if on the same line. +# If set to ignore, sp_brace_catch is used. +sp_oc_brace_catch = ignore # ignore/add/remove/force + +# Add or remove space between 'finally' and '{' if on the same line. +sp_finally_brace = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'finally' if on the same line. +sp_brace_finally = ignore # ignore/add/remove/force + +# Add or remove space between 'try' and '{' if on the same line. +sp_try_brace = ignore # ignore/add/remove/force + +# Add or remove space between get/set and '{' if on the same line. +sp_getset_brace = ignore # ignore/add/remove/force + +# Add or remove space between a variable and '{' for C++ uniform +# initialization. +# +# Default: add +sp_word_brace = add # ignore/add/remove/force + +# Add or remove space between a variable and '{' for a namespace. +# +# Default: add +sp_word_brace_ns = add # ignore/add/remove/force + +# Add or remove space before the '::' operator. +sp_before_dc = ignore # ignore/add/remove/force + +# Add or remove space after the '::' operator. +sp_after_dc = ignore # ignore/add/remove/force + +# (D) Add or remove around the D named array initializer ':' operator. +sp_d_array_colon = ignore # ignore/add/remove/force + +# Add or remove space after the '!' (not) unary operator. +# +# Default: remove +sp_not = remove # ignore/add/remove/force + +# Add or remove space after the '~' (invert) unary operator. +# +# Default: remove +sp_inv = remove # ignore/add/remove/force + +# Add or remove space after the '&' (address-of) unary operator. This does not +# affect the spacing after a '&' that is part of a type. +# +# Default: remove +sp_addr = remove # ignore/add/remove/force + +# Add or remove space around the '.' or '->' operators. +# +# Default: remove +sp_member = remove # ignore/add/remove/force + +# Add or remove space after the '*' (dereference) unary operator. This does +# not affect the spacing after a '*' that is part of a type. +# +# Default: remove +sp_deref = remove # ignore/add/remove/force + +# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. +# +# Default: remove +sp_sign = remove # ignore/add/remove/force + +# Add or remove space between '++' and '--' the word to which it is being +# applied, as in '(--x)' or 'y++;'. +# +# Default: remove +sp_incdec = remove # ignore/add/remove/force + +# Add or remove space before a backslash-newline at the end of a line. +# +# Default: add +sp_before_nl_cont = add # ignore/add/remove/force + +# (OC) Add or remove space after the scope '+' or '-', as in '-(void) foo;' +# or '+(int) bar;'. +sp_after_oc_scope = ignore # ignore/add/remove/force + +# (OC) Add or remove space after the colon in message specs, +# i.e. '-(int) f:(int) x;' vs. '-(int) f: (int) x;'. +sp_after_oc_colon = ignore # ignore/add/remove/force + +# (OC) Add or remove space before the colon in message specs, +# i.e. '-(int) f: (int) x;' vs. '-(int) f : (int) x;'. +sp_before_oc_colon = ignore # ignore/add/remove/force + +# (OC) Add or remove space after the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_after_oc_dict_colon = ignore # ignore/add/remove/force + +# (OC) Add or remove space before the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_before_oc_dict_colon = ignore # ignore/add/remove/force + +# (OC) Add or remove space after the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue: 1];'. +sp_after_send_oc_colon = ignore # ignore/add/remove/force + +# (OC) Add or remove space before the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue :1];'. +sp_before_send_oc_colon = ignore # ignore/add/remove/force + +# (OC) Add or remove space after the (type) in message specs, +# i.e. '-(int)f: (int) x;' vs. '-(int)f: (int)x;'. +sp_after_oc_type = ignore # ignore/add/remove/force + +# (OC) Add or remove space after the first (type) in message specs, +# i.e. '-(int) f:(int)x;' vs. '-(int)f:(int)x;'. +sp_after_oc_return_type = ignore # ignore/add/remove/force + +# (OC) Add or remove space between '@selector' and '(', +# i.e. '@selector(msgName)' vs. '@selector (msgName)'. +# Also applies to '@protocol()' constructs. +sp_after_oc_at_sel = ignore # ignore/add/remove/force + +# (OC) Add or remove space between '@selector(x)' and the following word, +# i.e. '@selector(foo) a:' vs. '@selector(foo)a:'. +sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force + +# (OC) Add or remove space inside '@selector' parentheses, +# i.e. '@selector(foo)' vs. '@selector( foo )'. +# Also applies to '@protocol()' constructs. +sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force + +# (OC) Add or remove space before a block pointer caret, +# i.e. '^int (int arg){...}' vs. ' ^int (int arg){...}'. +sp_before_oc_block_caret = ignore # ignore/add/remove/force + +# (OC) Add or remove space after a block pointer caret, +# i.e. '^int (int arg){...}' vs. '^ int (int arg){...}'. +sp_after_oc_block_caret = ignore # ignore/add/remove/force + +# (OC) Add or remove space between the receiver and selector in a message, +# as in '[receiver selector ...]'. +sp_after_oc_msg_receiver = ignore # ignore/add/remove/force + +# (OC) Add or remove space after '@property'. +sp_after_oc_property = ignore # ignore/add/remove/force + +# (OC) Add or remove space between '@synchronized' and the open parenthesis, +# i.e. '@synchronized(foo)' vs. '@synchronized (foo)'. +sp_after_oc_synchronized = ignore # ignore/add/remove/force + +# Add or remove space around the ':' in 'b ? t : f'. +sp_cond_colon = ignore # ignore/add/remove/force + +# Add or remove space before the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_before = ignore # ignore/add/remove/force + +# Add or remove space after the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_after = ignore # ignore/add/remove/force + +# Add or remove space around the '?' in 'b ? t : f'. +sp_cond_question = ignore # ignore/add/remove/force + +# Add or remove space before the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_before = ignore # ignore/add/remove/force + +# Add or remove space after the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_after = ignore # ignore/add/remove/force + +# In the abbreviated ternary form '(a ?: b)', add or remove space between '?' +# and ':'. +# +# Overrides all other sp_cond_* options. +sp_cond_ternary_short = ignore # ignore/add/remove/force + +# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make +# sense here. +sp_case_label = ignore # ignore/add/remove/force + +# (D) Add or remove space around the D '..' operator. +sp_range = ignore # ignore/add/remove/force + +# Add or remove space after ':' in a Java/C++11 range-based 'for', +# as in 'for (Type var : expr)'. +sp_after_for_colon = ignore # ignore/add/remove/force + +# Add or remove space before ':' in a Java/C++11 range-based 'for', +# as in 'for (Type var : expr)'. +sp_before_for_colon = ignore # ignore/add/remove/force + +# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. +sp_extern_paren = ignore # ignore/add/remove/force + +# Add or remove space after the opening of a C++ comment, +# i.e. '// A' vs. '//A'. +sp_cmt_cpp_start = ignore # ignore/add/remove/force + +# If true, space is added with sp_cmt_cpp_start will be added after doxygen +# sequences like '///', '///<', '//!' and '//!<'. +sp_cmt_cpp_doxygen = false # true/false + +# If true, space is added with sp_cmt_cpp_start will be added after Qt +# translator or meta-data comments like '//:', '//=', and '//~'. +sp_cmt_cpp_qttr = false # true/false + +# Add or remove space between #else or #endif and a trailing comment. +sp_endif_cmt = ignore # ignore/add/remove/force + +# Add or remove space after 'new', 'delete' and 'delete[]'. +sp_after_new = ignore # ignore/add/remove/force + +# Add or remove space between 'new' and '(' in 'new()'. +sp_between_new_paren = ignore # ignore/add/remove/force + +# Add or remove space between ')' and type in 'new(foo) BAR'. +sp_after_newop_paren = ignore # ignore/add/remove/force + +# Add or remove space inside parenthesis of the new operator +# as in 'new(foo) BAR'. +sp_inside_newop_paren = ignore # ignore/add/remove/force + +# Add or remove space after the open parenthesis of the new operator, +# as in 'new(foo) BAR'. +# +# Overrides sp_inside_newop_paren. +sp_inside_newop_paren_open = ignore # ignore/add/remove/force + +# Add or remove space before the close parenthesis of the new operator, +# as in 'new(foo) BAR'. +# +# Overrides sp_inside_newop_paren. +sp_inside_newop_paren_close = ignore # ignore/add/remove/force + +# Add or remove space before a trailing or embedded comment. +sp_before_tr_emb_cmt = ignore # ignore/add/remove/force + +# Number of spaces before a trailing or embedded comment. +sp_num_before_tr_emb_cmt = 0 # unsigned number + +# (Java) Add or remove space between an annotation and the open parenthesis. +sp_annotation_paren = ignore # ignore/add/remove/force + +# If true, vbrace tokens are dropped to the previous token and skipped. +sp_skip_vbrace_tokens = false # true/false + +# Add or remove space after 'noexcept'. +sp_after_noexcept = ignore # ignore/add/remove/force + +# Add or remove space after '_'. +sp_vala_after_translation = ignore # ignore/add/remove/force + +# If true, a is inserted after #define. +force_tab_after_define = false # true/false + +# +# Indenting options +# + +# The number of columns to indent per level. Usually 2, 3, 4, or 8. +# +# Default: 8 +indent_columns = 4 # unsigned number + +# The continuation indent. If non-zero, this overrides the indent of '(', '[' +# and '=' continuation indents. Negative values are OK; negative value is +# absolute and not increased for each '(' or '[' level. +# +# For FreeBSD, this is set to 4. +indent_continue = 0 # number + +# The continuation indent, only for class header line(s). If non-zero, this +# overrides the indent of 'class' continuation indents. +indent_continue_class_head = 0 # unsigned number + +# Whether to indent empty lines (i.e. lines which contain only spaces before +# the newline character). +indent_single_newlines = false # true/false + +# The continuation indent for func_*_param if they are true. If non-zero, this +# overrides the indent. +indent_param = 0 # unsigned number + +# How to use tabs when indenting code. +# +# 0: Spaces only +# 1: Indent with tabs to brace level, align with spaces (default) +# 2: Indent and align with tabs, using spaces when not on a tabstop +# +# Default: 1 +indent_with_tabs = 0 # unsigned number + +# Whether to indent comments that are not at a brace level with tabs on a +# tabstop. Requires indent_with_tabs=2. If false, will use spaces. +indent_cmt_with_tabs = false # true/false + +# Whether to indent strings broken by '\' so that they line up. +indent_align_string = false # true/false + +# The number of spaces to indent multi-line XML strings. +# Requires indent_align_string=true. +indent_xml_string = 0 # unsigned number + +# Spaces to indent '{' from level. +indent_brace = 0 # unsigned number + +# Whether braces are indented to the body level. +indent_braces = false # true/false + +# Whether to disable indenting function braces if indent_braces=true. +indent_braces_no_func = false # true/false + +# Whether to disable indenting class braces if indent_braces=true. +indent_braces_no_class = false # true/false + +# Whether to disable indenting struct braces if indent_braces=true. +indent_braces_no_struct = false # true/false + +# Whether to indent based on the size of the brace parent, +# i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. +indent_brace_parent = false # true/false + +# Whether to indent based on the open parenthesis instead of the open brace +# in '({\n'. +indent_paren_open_brace = false # true/false + +# (C#) Whether to indent the brace of a C# delegate by another level. +indent_cs_delegate_brace = false # true/false + +# (C#) Whether to indent a C# delegate (to handle delegates with no brace) by +# another level. +indent_cs_delegate_body = false # true/false + +# Whether to indent the body of a 'namespace'. +indent_namespace = false # true/false + +# Whether to indent only the first namespace, and not any nested namespaces. +# Requires indent_namespace=true. +indent_namespace_single_indent = false # true/false + +# The number of spaces to indent a namespace block. +# If set to zero, use the value indent_columns +indent_namespace_level = 0 # unsigned number + +# If the body of the namespace is longer than this number, it won't be +# indented. Requires indent_namespace=true. 0 means no limit. +indent_namespace_limit = 0 # unsigned number + +# Whether the 'extern "C"' body is indented. +indent_extern = false # true/false + +# Whether the 'class' body is indented. +indent_class = true # true/false + +# Whether to indent the stuff after a leading base class colon. +indent_class_colon = false # true/false + +# Whether to indent based on a class colon instead of the stuff after the +# colon. Requires indent_class_colon=true. +indent_class_on_colon = false # true/false + +# Whether to indent the stuff after a leading class initializer colon. +indent_constr_colon = false # true/false + +# Virtual indent from the ':' for member initializers. +# +# Default: 2 +indent_ctor_init_leading = 2 # unsigned number + +# Additional indent for constructor initializer list. +# Negative values decrease indent down to the first column. +indent_ctor_init = 0 # number + +# Whether to indent 'if' following 'else' as a new block under the 'else'. +# If false, 'else\nif' is treated as 'else if' for indenting purposes. +indent_else_if = false # true/false + +# Amount to indent variable declarations after a open brace. +# +# <0: Relative +# >=0: Absolute +indent_var_def_blk = 0 # number + +# Whether to indent continued variable declarations instead of aligning. +indent_var_def_cont = false # true/false + +# Whether to indent continued shift expressions ('<<' and '>>') instead of +# aligning. Set align_left_shift=false when enabling this. +indent_shift = false # true/false + +# Whether to force indentation of function definitions to start in column 1. +indent_func_def_force_col1 = false # true/false + +# Whether to indent continued function call parameters one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_call_param = true # true/false + +# Whether to indent continued function definition parameters one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_def_param = true # true/false + +# for function definitions, only if indent_func_def_param is false +# Allows to align params when appropriate and indent them when not +# behave as if it was true if paren position is more than this value +# if paren position is more than the option value +indent_func_def_param_paren_pos_threshold = 0 # unsigned number + +# Whether to indent continued function call prototype one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_proto_param = true # true/false + +# Whether to indent continued function call declaration one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_class_param = true # true/false + +# Whether to indent continued class variable constructors one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_ctor_var_param = true # true/false + +# Whether to indent continued template parameter list one indent level, +# rather than aligning parameters under the open parenthesis. +indent_template_param = true # true/false + +# Double the indent for indent_func_xxx_param options. +# Use both values of the options indent_columns and indent_param. +indent_func_param_double = false # true/false + +# Indentation column for standalone 'const' qualifier on a function +# prototype. +indent_func_const = 0 # unsigned number + +# Indentation column for standalone 'throw' qualifier on a function +# prototype. +indent_func_throw = 0 # unsigned number + +# How to indent within a macro followed by a brace on the same line +# This allows reducing the indent in macros that have (for example) +# `do { ... } while (0)` blocks bracketing them. +# +# true: add an indent for the brace on the same line as the macro +# false: do not add an indent for the brace on the same line as the macro +# +# Default: true +indent_macro_brace = true # true/false + +# The number of spaces to indent a continued '->' or '.'. +# Usually set to 0, 1, or indent_columns. +indent_member = 0 # unsigned number + +# Whether lines broken at '.' or '->' should be indented by a single indent. +# The indent_member option will not be effective if this is set to true. +indent_member_single = false # true/false + +# Spaces to indent single line ('//') comments on lines before code. +indent_sing_line_comments = 0 # unsigned number + +# Whether to indent trailing single line ('//') comments relative to the code +# instead of trying to keep the same absolute column. +indent_relative_single_line_comments = false # true/false + +# Spaces to indent 'case' from 'switch'. Usually 0 or indent_columns. +indent_switch_case = 0 # unsigned number + +# indent 'break' with 'case' from 'switch'. +indent_switch_break_with_case = false # true/false + +# Whether to indent preprocessor statements inside of switch statements. +# +# Default: true +indent_switch_pp = true # true/false + +# Spaces to shift the 'case' line, without affecting any other lines. +# Usually 0. +indent_case_shift = 0 # unsigned number + +# Spaces to indent '{' from 'case'. By default, the brace will appear under +# the 'c' in case. Usually set to 0 or indent_columns. Negative values are OK. +indent_case_brace = 0 # number + +# Whether to indent comments found in first column. +indent_col1_comment = false # true/false + +# Whether to indent multi string literal in first column. +indent_col1_multi_string_literal = false # true/false + +# How to indent goto labels. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# +# Default: 1 +indent_label = 1 # number + +# How to indent access specifiers that are followed by a +# colon. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# +# Default: 1 +indent_access_spec = 1 # number + +# Whether to indent the code after an access specifier by one level. +# If true, this option forces 'indent_access_spec=0'. +indent_access_spec_body = false # true/false + +# If an open parenthesis is followed by a newline, whether to indent the next +# line so that it lines up after the open parenthesis (not recommended). +indent_paren_nl = false # true/false + +# How to indent a close parenthesis after a newline. +# +# 0: Indent to body level (default) +# 1: Align under the open parenthesis +# 2: Indent to the brace level +indent_paren_close = 0 # unsigned number + +# Whether to indent the open parenthesis of a function definition, +# if the parenthesis is on its own line. +indent_paren_after_func_def = false # true/false + +# Whether to indent the open parenthesis of a function declaration, +# if the parenthesis is on its own line. +indent_paren_after_func_decl = false # true/false + +# Whether to indent the open parenthesis of a function call, +# if the parenthesis is on its own line. +indent_paren_after_func_call = false # true/false + +# Whether to indent a comma when inside a parenthesis. +# If true, aligns under the open parenthesis. +indent_comma_paren = false # true/false + +# Whether to indent a Boolean operator when inside a parenthesis. +# If true, aligns under the open parenthesis. +indent_bool_paren = false # true/false + +# Whether to indent a semicolon when inside a for parenthesis. +# If true, aligns under the open for parenthesis. +indent_semicolon_for_paren = false # true/false + +# Whether to align the first expression to following ones +# if indent_bool_paren=true. +indent_first_bool_expr = false # true/false + +# Whether to align the first expression to following ones +# if indent_semicolon_for_paren=true. +indent_first_for_expr = false # true/false + +# If an open square is followed by a newline, whether to indent the next line +# so that it lines up after the open square (not recommended). +indent_square_nl = false # true/false + +# (ESQL/C) Whether to preserve the relative indent of 'EXEC SQL' bodies. +indent_preserve_sql = false # true/false + +# Whether to align continued statements at the '='. If false or if the '=' is +# followed by a newline, the next line is indent one tab. +# +# Default: true +indent_align_assign = true # true/false + +# Whether to align continued statements at the '('. If false or the '(' is +# followed by a newline, the next line indent is one tab. +# +# Default: true +indent_align_paren = true # true/false + +# (OC) Whether to indent Objective-C blocks at brace level instead of usual +# rules. +indent_oc_block = false # true/false + +# (OC) Indent for Objective-C blocks in a message relative to the parameter +# name. +# +# =0: Use indent_oc_block rules +# >0: Use specified number of spaces to indent +indent_oc_block_msg = 0 # unsigned number + +# (OC) Minimum indent for subsequent parameters +indent_oc_msg_colon = 0 # unsigned number + +# (OC) Whether to prioritize aligning with initial colon (and stripping spaces +# from lines, if necessary). +# +# Default: true +indent_oc_msg_prioritize_first_colon = true # true/false + +# (OC) Whether to indent blocks the way that Xcode does by default +# (from the keyword if the parameter is on its own line; otherwise, from the +# previous indentation level). Requires indent_oc_block_msg=true. +indent_oc_block_msg_xcode_style = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a +# message keyword. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_keyword = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a message +# colon. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_colon = false # true/false + +# (OC) Whether to indent blocks from where the block caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_caret = false # true/false + +# (OC) Whether to indent blocks from where the brace caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_brace = false # true/false + +# When indenting after virtual brace open and newline add further spaces to +# reach this minimum indent. +indent_min_vbrace_open = 0 # unsigned number + +# Whether to add further spaces after regular indent to reach next tabstop +# when identing after virtual brace open and newline. +indent_vbrace_open_on_tabstop = false # true/false + +# How to indent after a brace followed by another token (not a newline). +# true: indent all contained lines to match the token +# false: indent all contained lines to match the brace +# +# Default: true +indent_token_after_brace = true # true/false + +# Whether to indent the body of a C++11 lambda. +indent_cpp_lambda_body = false # true/false + +# (C#) Whether to indent a 'using' block if no braces are used. +# +# Default: true +indent_using_block = true # true/false + +# How to indent the continuation of ternary operator. +# +# 0: Off (default) +# 1: When the `if_false` is a continuation, indent it under `if_false` +# 2: When the `:` is a continuation, indent it under `?` +indent_ternary_operator = 0 # unsigned number + +# If true, the indentation of the chunks after a `return new` sequence will be set at return indentation column. +indent_off_after_return_new = false # true/false + +# If true, the tokens after return are indented with regular single indentation. By default (false) the indentation is after the return token. +indent_single_after_return = false # true/false + +# Whether to ignore indent and alignment for 'asm' blocks (i.e. assume they +# have their own indentation). +indent_ignore_asm_block = false # true/false + +# +# Newline adding and removing options +# + +# Whether to collapse empty blocks between '{' and '}'. +nl_collapse_empty_body = false # true/false + +# Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. +nl_assign_leave_one_liners = true # true/false + +# Don't split one-line braced statements inside a 'class xx { }' body. +nl_class_leave_one_liners = true # true/false + +# Don't split one-line enums, as in 'enum foo { BAR = 15 };' +nl_enum_leave_one_liners = true # true/false + +# Don't split one-line get or set functions. +nl_getset_leave_one_liners = true # true/false + +# (C#) Don't split one-line property get or set functions. +nl_cs_property_leave_one_liners = true # true/false + +# Don't split one-line function definitions, as in 'int foo() { return 0; }'. +# night modify nl_func_type_name +nl_func_leave_one_liners = true # true/false + +# Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. +nl_cpp_lambda_leave_one_liners = false # true/false + +# Don't split one-line if/else statements, as in 'if(...) b++;'. +nl_if_leave_one_liners = true # true/false + +# Don't split one-line while statements, as in 'while(...) b++;'. +nl_while_leave_one_liners = true # true/false + +# Don't split one-line for statements, as in 'for(...) b++;'. +nl_for_leave_one_liners = true # true/false + +# (OC) Don't split one-line Objective-C messages. +nl_oc_msg_leave_one_liner = false # true/false + +# (OC) Add or remove newline between method declaration and '{'. +nl_oc_mdef_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove newline between Objective-C block signature and '{'. +nl_oc_block_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove blank line before '@interface' statement. +nl_oc_before_interface = ignore # ignore/add/remove/force + +# (OC) Add or remove blank line before '@implementation' statement. +nl_oc_before_implementation = ignore # ignore/add/remove/force + +# (OC) Add or remove blank line before '@end' statement. +nl_oc_before_end = ignore # ignore/add/remove/force + +# (OC) Add or remove newline between '@interface' and '{'. +nl_oc_interface_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove newline between '@implementation' and '{'. +nl_oc_implementation_brace = ignore # ignore/add/remove/force + +# Add or remove newlines at the start of the file. +nl_start_of_file = ignore # ignore/add/remove/force + +# The minimum number of newlines at the start of the file (only used if +# nl_start_of_file is 'add' or 'force'). +nl_start_of_file_min = 0 # unsigned number + +# Add or remove newline at the end of the file. +nl_end_of_file = ignore # ignore/add/remove/force + +# The minimum number of newlines at the end of the file (only used if +# nl_end_of_file is 'add' or 'force'). +nl_end_of_file_min = 0 # unsigned number + +# Add or remove newline between '=' and '{'. +nl_assign_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between '=' and '['. +nl_assign_square = ignore # ignore/add/remove/force + +# Add or remove newline between '[]' and '{'. +nl_tsquare_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline after '= ['. Will also affect the newline before +# the ']'. +nl_after_square_assign = ignore # ignore/add/remove/force + +# Add or remove newline between a function call's ')' and '{', as in +# 'list_for_each(item, &list) { }'. +nl_fcall_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum' and '{'. +nl_enum_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum' and 'class'. +nl_enum_class = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum class' and the identifier. +nl_enum_class_identifier = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum class' type and ':'. +nl_enum_identifier_colon = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum class identifier :' and type. +nl_enum_colon_type = ignore # ignore/add/remove/force + +# Add or remove newline between 'struct and '{'. +nl_struct_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'union' and '{'. +nl_union_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'if' and '{'. +nl_if_brace = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'else'. +nl_brace_else = ignore # ignore/add/remove/force + +# Add or remove newline between 'else if' and '{'. If set to ignore, +# nl_if_brace is used instead. +nl_elseif_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'else' and '{'. +nl_else_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'else' and 'if'. +nl_else_if = ignore # ignore/add/remove/force + +# Add or remove newline before 'if'/'else if' closing parenthesis. +nl_before_if_closing_paren = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'finally'. +nl_brace_finally = ignore # ignore/add/remove/force + +# Add or remove newline between 'finally' and '{'. +nl_finally_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'try' and '{'. +nl_try_brace = ignore # ignore/add/remove/force + +# Add or remove newline between get/set and '{'. +nl_getset_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'for' and '{'. +nl_for_brace = ignore # ignore/add/remove/force + +# Add or remove newline before the '{' of a 'catch' statement, as in +# 'catch (decl) {'. +nl_catch_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove newline before the '{' of a '@catch' statement, as in +# '@catch (decl) {'. If set to ignore, nl_catch_brace is used. +nl_oc_catch_brace = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'catch'. +nl_brace_catch = ignore # ignore/add/remove/force + +# (OC) Add or remove newline between '}' and '@catch'. If set to ignore, +# nl_brace_catch is used. +nl_oc_brace_catch = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and ']'. +nl_brace_square = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and ')' in a function invocation. +nl_brace_fparen = ignore # ignore/add/remove/force + +# Add or remove newline between 'while' and '{'. +nl_while_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between 'scope (x)' and '{'. +nl_scope_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between 'unittest' and '{'. +nl_unittest_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between 'version (x)' and '{'. +nl_version_brace = ignore # ignore/add/remove/force + +# (C#) Add or remove newline between 'using' and '{'. +nl_using_brace = ignore # ignore/add/remove/force + +# Add or remove newline between two open or close braces. Due to general +# newline/brace handling, REMOVE may not work. +nl_brace_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'do' and '{'. +nl_do_brace = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'while' of 'do' statement. +nl_brace_while = ignore # ignore/add/remove/force + +# Add or remove newline between 'switch' and '{'. +nl_switch_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'synchronized' and '{'. +nl_synchronized_brace = ignore # ignore/add/remove/force + +# Add a newline between ')' and '{' if the ')' is on a different line than the +# if/for/etc. +# +# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch and +# nl_catch_brace. +nl_multi_line_cond = false # true/false + +# Add a newline after '(' if an if/for/while/switch condition spans multiple +# lines +nl_multi_line_sparen_open = ignore # ignore/add/remove/force + +# Add a newline before ')' if an if/for/while/switch condition spans multiple +# lines. Overrides nl_before_if_closing_paren if both are specified. +nl_multi_line_sparen_close = ignore # ignore/add/remove/force + +# Force a newline in a define after the macro name for multi-line defines. +nl_multi_line_define = false # true/false + +# Whether to add a newline before 'case', and a blank line before a 'case' +# statement that follows a ';' or '}'. +nl_before_case = false # true/false + +# Whether to add a newline after a 'case' statement. +nl_after_case = false # true/false + +# Add or remove newline between a case ':' and '{'. +# +# Overrides nl_after_case. +nl_case_colon_brace = ignore # ignore/add/remove/force + +# Add or remove newline between ')' and 'throw'. +nl_before_throw = ignore # ignore/add/remove/force + +# Add or remove newline between 'namespace' and '{'. +nl_namespace_brace = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template class. +nl_template_class = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template class declaration. +# +# Overrides nl_template_class. +nl_template_class_decl = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<>' of a specialized class declaration. +# +# Overrides nl_template_class_decl. +nl_template_class_decl_special = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template class definition. +# +# Overrides nl_template_class. +nl_template_class_def = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<>' of a specialized class definition. +# +# Overrides nl_template_class_def. +nl_template_class_def_special = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template function. +nl_template_func = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template function +# declaration. +# +# Overrides nl_template_func. +nl_template_func_decl = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<>' of a specialized function +# declaration. +# +# Overrides nl_template_func_decl. +nl_template_func_decl_special = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template function +# definition. +# +# Overrides nl_template_func. +nl_template_func_def = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<>' of a specialized function +# definition. +# +# Overrides nl_template_func_def. +nl_template_func_def_special = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template variable. +nl_template_var = ignore # ignore/add/remove/force + +# Add or remove newline between 'template<...>' and 'using' of a templated +# type alias. +nl_template_using = ignore # ignore/add/remove/force + +# Add or remove newline between 'class' and '{'. +nl_class_brace = ignore # ignore/add/remove/force + +# Add or remove newline before or after (depending on pos_class_comma, +# may not be IGNORE) each',' in the base class list. +nl_class_init_args = ignore # ignore/add/remove/force + +# Add or remove newline after each ',' in the constructor member +# initialization. Related to nl_constr_colon, pos_constr_colon and +# pos_constr_comma. +nl_constr_init_args = ignore # ignore/add/remove/force + +# Add or remove newline before first element, after comma, and after last +# element, in 'enum'. +nl_enum_own_lines = ignore # ignore/add/remove/force + +# Add or remove newline between return type and function name in a function +# definition. +# might be modified by nl_func_leave_one_liners +nl_func_type_name = ignore # ignore/add/remove/force + +# Add or remove newline between return type and function name inside a class +# definition. If set to ignore, nl_func_type_name or nl_func_proto_type_name +# is used instead. +nl_func_type_name_class = ignore # ignore/add/remove/force + +# Add or remove newline between class specification and '::' +# in 'void A::f() { }'. Only appears in separate member implementation (does +# not appear with in-line implementation). +nl_func_class_scope = ignore # ignore/add/remove/force + +# Add or remove newline between function scope and name, as in +# 'void A :: f() { }'. +nl_func_scope_name = ignore # ignore/add/remove/force + +# Add or remove newline between return type and function name in a prototype. +nl_func_proto_type_name = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' in the +# declaration. +nl_func_paren = ignore # ignore/add/remove/force + +# Overrides nl_func_paren for functions with no parameters. +nl_func_paren_empty = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' in the +# definition. +nl_func_def_paren = ignore # ignore/add/remove/force + +# Overrides nl_func_def_paren for functions with no parameters. +nl_func_def_paren_empty = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' in the +# call. +nl_func_call_paren = ignore # ignore/add/remove/force + +# Overrides nl_func_call_paren for functions with no parameters. +nl_func_call_paren_empty = ignore # ignore/add/remove/force + +# Add or remove newline after '(' in a function declaration. +nl_func_decl_start = ignore # ignore/add/remove/force + +# Add or remove newline after '(' in a function definition. +nl_func_def_start = ignore # ignore/add/remove/force + +# Overrides nl_func_decl_start when there is only one parameter. +nl_func_decl_start_single = ignore # ignore/add/remove/force + +# Overrides nl_func_def_start when there is only one parameter. +nl_func_def_start_single = ignore # ignore/add/remove/force + +# Whether to add a newline after '(' in a function declaration if '(' and ')' +# are in different lines. If false, nl_func_decl_start is used instead. +nl_func_decl_start_multi_line = false # true/false + +# Whether to add a newline after '(' in a function definition if '(' and ')' +# are in different lines. If false, nl_func_def_start is used instead. +nl_func_def_start_multi_line = false # true/false + +# Add or remove newline after each ',' in a function declaration. +nl_func_decl_args = ignore # ignore/add/remove/force + +# Add or remove newline after each ',' in a function definition. +nl_func_def_args = ignore # ignore/add/remove/force + +# Whether to add a newline after each ',' in a function declaration if '(' +# and ')' are in different lines. If false, nl_func_decl_args is used instead. +nl_func_decl_args_multi_line = false # true/false + +# Whether to add a newline after each ',' in a function definition if '(' +# and ')' are in different lines. If false, nl_func_def_args is used instead. +nl_func_def_args_multi_line = false # true/false + +# Add or remove newline before the ')' in a function declaration. +nl_func_decl_end = ignore # ignore/add/remove/force + +# Add or remove newline before the ')' in a function definition. +nl_func_def_end = ignore # ignore/add/remove/force + +# Overrides nl_func_decl_end when there is only one parameter. +nl_func_decl_end_single = ignore # ignore/add/remove/force + +# Overrides nl_func_def_end when there is only one parameter. +nl_func_def_end_single = ignore # ignore/add/remove/force + +# Whether to add a newline before ')' in a function declaration if '(' and ')' +# are in different lines. If false, nl_func_decl_end is used instead. +nl_func_decl_end_multi_line = false # true/false + +# Whether to add a newline before ')' in a function definition if '(' and ')' +# are in different lines. If false, nl_func_def_end is used instead. +nl_func_def_end_multi_line = false # true/false + +# Add or remove newline between '()' in a function declaration. +nl_func_decl_empty = ignore # ignore/add/remove/force + +# Add or remove newline between '()' in a function definition. +nl_func_def_empty = ignore # ignore/add/remove/force + +# Add or remove newline between '()' in a function call. +nl_func_call_empty = ignore # ignore/add/remove/force + +# Whether to add a newline after '(' in a function call, +# has preference over nl_func_call_start_multi_line. +nl_func_call_start = ignore # ignore/add/remove/force + +# Whether to add a newline after '(' in a function call if '(' and ')' are in +# different lines. +nl_func_call_start_multi_line = false # true/false + +# Whether to add a newline after each ',' in a function call if '(' and ')' +# are in different lines. +nl_func_call_args_multi_line = false # true/false + +# Whether to add a newline before ')' in a function call if '(' and ')' are in +# different lines. +nl_func_call_end_multi_line = false # true/false + +# Whether to add a newline after '<' of a template parameter list. +nl_template_start = false # true/false + +# Whether to add a newline after each ',' in a template parameter list. +nl_template_args = false # true/false + +# Whether to add a newline before '>' of a template parameter list. +nl_template_end = false # true/false + +# (OC) Whether to put each Objective-C message parameter on a separate line. +# See nl_oc_msg_leave_one_liner. +nl_oc_msg_args = false # true/false + +# Add or remove newline between function signature and '{'. +nl_fdef_brace = ignore # ignore/add/remove/force + +# Add or remove newline between function signature and '{', +# if signature ends with ')'. Overrides nl_fdef_brace. +nl_fdef_brace_cond = ignore # ignore/add/remove/force + +# Add or remove newline between C++11 lambda signature and '{'. +nl_cpp_ldef_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'return' and the return expression. +nl_return_expr = ignore # ignore/add/remove/force + +# Whether to add a newline after semicolons, except in 'for' statements. +nl_after_semicolon = false # true/false + +# (Java) Add or remove newline between the ')' and '{{' of the double brace +# initializer. +nl_paren_dbrace_open = ignore # ignore/add/remove/force + +# Whether to add a newline after the type in an unnamed temporary +# direct-list-initialization. +nl_type_brace_init_lst = ignore # ignore/add/remove/force + +# Whether to add a newline after the open brace in an unnamed temporary +# direct-list-initialization. +nl_type_brace_init_lst_open = ignore # ignore/add/remove/force + +# Whether to add a newline before the close brace in an unnamed temporary +# direct-list-initialization. +nl_type_brace_init_lst_close = ignore # ignore/add/remove/force + +# Whether to add a newline after '{'. This also adds a newline before the +# matching '}'. +nl_after_brace_open = false # true/false + +# Whether to add a newline between the open brace and a trailing single-line +# comment. Requires nl_after_brace_open=true. +nl_after_brace_open_cmt = false # true/false + +# Whether to add a newline after a virtual brace open with a non-empty body. +# These occur in un-braced if/while/do/for statement bodies. +nl_after_vbrace_open = false # true/false + +# Whether to add a newline after a virtual brace open with an empty body. +# These occur in un-braced if/while/do/for statement bodies. +nl_after_vbrace_open_empty = false # true/false + +# Whether to add a newline after '}'. Does not apply if followed by a +# necessary ';'. +nl_after_brace_close = false # true/false + +# Whether to add a newline after a virtual brace close, +# as in 'if (foo) a++; return;'. +nl_after_vbrace_close = false # true/false + +# Add or remove newline between the close brace and identifier, +# as in 'struct { int a; } b;'. Affects enumerations, unions and +# structures. If set to ignore, uses nl_after_brace_close. +nl_brace_struct_var = ignore # ignore/add/remove/force + +# Whether to alter newlines in '#define' macros. +nl_define_macro = false # true/false + +# Whether to alter newlines between consecutive parenthesis closes. The number +# of closing parentheses in a line will depend on respective open parenthesis +# lines. +nl_squeeze_paren_close = false # true/false + +# Whether to remove blanks after '#ifxx' and '#elxx', or before '#elxx' and +# '#endif'. Does not affect top-level #ifdefs. +nl_squeeze_ifdef = false # true/false + +# Makes the nl_squeeze_ifdef option affect the top-level #ifdefs as well. +nl_squeeze_ifdef_top_level = false # true/false + +# Add or remove blank line before 'if'. +nl_before_if = ignore # ignore/add/remove/force + +# Add or remove blank line after 'if' statement. Add/Force work only if the +# next token is not a closing brace. +nl_after_if = ignore # ignore/add/remove/force + +# Add or remove blank line before 'for'. +nl_before_for = ignore # ignore/add/remove/force + +# Add or remove blank line after 'for' statement. +nl_after_for = ignore # ignore/add/remove/force + +# Add or remove blank line before 'while'. +nl_before_while = ignore # ignore/add/remove/force + +# Add or remove blank line after 'while' statement. +nl_after_while = ignore # ignore/add/remove/force + +# Add or remove blank line before 'switch'. +nl_before_switch = ignore # ignore/add/remove/force + +# Add or remove blank line after 'switch' statement. +nl_after_switch = ignore # ignore/add/remove/force + +# Add or remove blank line before 'synchronized'. +nl_before_synchronized = ignore # ignore/add/remove/force + +# Add or remove blank line after 'synchronized' statement. +nl_after_synchronized = ignore # ignore/add/remove/force + +# Add or remove blank line before 'do'. +nl_before_do = ignore # ignore/add/remove/force + +# Add or remove blank line after 'do/while' statement. +nl_after_do = ignore # ignore/add/remove/force + +# Whether to put a blank line before 'return' statements, unless after an open +# brace. +nl_before_return = false # true/false + +# Whether to put a blank line after 'return' statements, unless followed by a +# close brace. +nl_after_return = false # true/false + +# (Java) Whether to put a blank line before a member '.' or '->' operators. +nl_before_member = ignore # ignore/add/remove/force + +# (Java) Whether to put a blank line after a member '.' or '->' operators. +nl_after_member = ignore # ignore/add/remove/force + +# Whether to double-space commented-entries in 'struct'/'union'/'enum'. +nl_ds_struct_enum_cmt = false # true/false + +# Whether to force a newline before '}' of a 'struct'/'union'/'enum'. +# (Lower priority than eat_blanks_before_close_brace.) +nl_ds_struct_enum_close_brace = false # true/false + +# Add or remove newline before or after (depending on pos_class_colon) a class +# colon, as in 'class Foo : public Bar'. +nl_class_colon = ignore # ignore/add/remove/force + +# Add or remove newline around a class constructor colon. The exact position +# depends on nl_constr_init_args, pos_constr_colon and pos_constr_comma. +nl_constr_colon = ignore # ignore/add/remove/force + +# Whether to collapse a two-line namespace, like 'namespace foo\n{ decl; }' +# into a single line. If true, prevents other brace newline rules from turning +# such code into four lines. +nl_namespace_two_to_one_liner = false # true/false + +# Whether to remove a newline in simple unbraced if statements, turning them +# into one-liners, as in 'if(b)\n i++;' => 'if(b) i++;'. +nl_create_if_one_liner = false # true/false + +# Whether to remove a newline in simple unbraced for statements, turning them +# into one-liners, as in 'for (...)\n stmt;' => 'for (...) stmt;'. +nl_create_for_one_liner = false # true/false + +# Whether to remove a newline in simple unbraced while statements, turning +# them into one-liners, as in 'while (expr)\n stmt;' => 'while (expr) stmt;'. +nl_create_while_one_liner = false # true/false + +# Whether to collapse a function definition whose body (not counting braces) +# is only one line so that the entire definition (prototype, braces, body) is +# a single line. +nl_create_func_def_one_liner = false # true/false + +# Whether to collapse a function definition whose body (not counting braces) +# is only one line so that the entire definition (prototype, braces, body) is +# a single line. +nl_create_list_one_liner = false # true/false + +# Whether to split one-line simple unbraced if statements into two lines by +# adding a newline, as in 'if(b) i++;'. +nl_split_if_one_liner = false # true/false + +# Whether to split one-line simple unbraced for statements into two lines by +# adding a newline, as in 'for (...) stmt;'. +nl_split_for_one_liner = false # true/false + +# Whether to split one-line simple unbraced while statements into two lines by +# adding a newline, as in 'while (expr) stmt;'. +nl_split_while_one_liner = false # true/false + +# +# Blank line options +# + +# The maximum number of consecutive newlines (3 = 2 blank lines). +nl_max = 0 # unsigned number + +# The maximum number of consecutive newlines in a function. +nl_max_blank_in_func = 0 # unsigned number + +# The number of newlines before a function prototype. +nl_before_func_body_proto = 0 # unsigned number + +# The number of newlines before a multi-line function definition. +nl_before_func_body_def = 0 # unsigned number + +# The number of newlines before a class constructor/destructor prototype. +nl_before_func_class_proto = 0 # unsigned number + +# The number of newlines before a class constructor/destructor definition. +nl_before_func_class_def = 0 # unsigned number + +# The number of newlines after a function prototype. +nl_after_func_proto = 0 # unsigned number + +# The number of newlines after a function prototype, if not followed by +# another function prototype. +nl_after_func_proto_group = 0 # unsigned number + +# The number of newlines after a class constructor/destructor prototype. +nl_after_func_class_proto = 0 # unsigned number + +# The number of newlines after a class constructor/destructor prototype, +# if not followed by another constructor/destructor prototype. +nl_after_func_class_proto_group = 0 # unsigned number + +# Whether one-line method definitions inside a class body should be treated +# as if they were prototypes for the purposes of adding newlines. +# +# Requires nl_class_leave_one_liners=true. Overrides nl_before_func_body_def +# and nl_before_func_class_def for one-liners. +nl_class_leave_one_liner_groups = false # true/false + +# The number of newlines after '}' of a multi-line function body. +nl_after_func_body = 0 # unsigned number + +# The number of newlines after '}' of a multi-line function body in a class +# declaration. Also affects class constructors/destructors. +# +# Overrides nl_after_func_body. +nl_after_func_body_class = 0 # unsigned number + +# The number of newlines after '}' of a single line function body. Also +# affects class constructors/destructors. +# +# Overrides nl_after_func_body and nl_after_func_body_class. +nl_after_func_body_one_liner = 0 # unsigned number + +# The number of blank lines after a block of variable definitions at the top +# of a function body. +# +# 0: No change (default). +nl_func_var_def_blk = 0 # unsigned number + +# The number of newlines before a block of typedefs. If nl_after_access_spec +# is non-zero, that option takes precedence. +# +# 0: No change (default). +nl_typedef_blk_start = 0 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 0 # unsigned number + +# The number of newlines before a block of variable definitions not at the top +# of a function body. If nl_after_access_spec is non-zero, that option takes +# precedence. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The number of newlines after a block of variable definitions not at the top +# of a function body. +# +# 0: No change (default). +nl_var_def_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of variable +# definitions. +# +# 0: No change (default). +nl_var_def_blk_in = 0 # unsigned number + +# The minimum number of newlines before a multi-line comment. +# Doesn't apply if after a brace open or another multi-line comment. +nl_before_block_comment = 0 # unsigned number + +# The minimum number of newlines before a single-line C comment. +# Doesn't apply if after a brace open or other single-line C comments. +nl_before_c_comment = 0 # unsigned number + +# The minimum number of newlines before a CPP comment. +# Doesn't apply if after a brace open or other CPP comments. +nl_before_cpp_comment = 0 # unsigned number + +# Whether to force a newline after a multi-line comment. +nl_after_multiline_comment = false # true/false + +# Whether to force a newline after a label's colon. +nl_after_label_colon = false # true/false + +# The number of newlines after '}' or ';' of a struct/enum/union definition. +nl_after_struct = 0 # unsigned number + +# The number of newlines before a class definition. +nl_before_class = 0 # unsigned number + +# The number of newlines after '}' or ';' of a class definition. +nl_after_class = 0 # unsigned number + +# The number of newlines before a namespace. +nl_before_namespace = 0 # unsigned number + +# The number of newlines after '{' of a namespace. This also adds newlines +# before the matching '}'. +# +# 0: Apply eat_blanks_after_open_brace or eat_blanks_before_close_brace if +# applicable, otherwise no change. +# +# Overrides eat_blanks_after_open_brace and eat_blanks_before_close_brace. +nl_inside_namespace = 0 # unsigned number + +# The number of newlines after '}' of a namespace. +nl_after_namespace = 0 # unsigned number + +# The number of newlines before an access specifier label. This also includes +# the Qt-specific 'signals:' and 'slots:'. Will not change the newline count +# if after a brace open. +# +# 0: No change (default). +nl_before_access_spec = 0 # unsigned number + +# The number of newlines after an access specifier label. This also includes +# the Qt-specific 'signals:' and 'slots:'. Will not change the newline count +# if after a brace open. +# +# 0: No change (default). +# +# Overrides nl_typedef_blk_start and nl_var_def_blk_start. +nl_after_access_spec = 0 # unsigned number + +# The number of newlines between a function definition and the function +# comment, as in '// comment\n void foo() {...}'. +# +# 0: No change (default). +nl_comment_func_def = 0 # unsigned number + +# The number of newlines after a try-catch-finally block that isn't followed +# by a brace close. +# +# 0: No change (default). +nl_after_try_catch_finally = 0 # unsigned number + +# (C#) The number of newlines before and after a property, indexer or event +# declaration. +# +# 0: No change (default). +nl_around_cs_property = 0 # unsigned number + +# (C#) The number of newlines between the get/set/add/remove handlers. +# +# 0: No change (default). +nl_between_get_set = 0 # unsigned number + +# (C#) Add or remove newline between property and the '{'. +nl_property_brace = ignore # ignore/add/remove/force + +# Whether to remove blank lines after '{'. +eat_blanks_after_open_brace = false # true/false + +# Whether to remove blank lines before '}'. +eat_blanks_before_close_brace = false # true/false + +# How aggressively to remove extra newlines not in preprocessor. +# +# 0: No change (default) +# 1: Remove most newlines not handled by other config +# 2: Remove all newlines and reformat completely by config +nl_remove_extra_newlines = 0 # unsigned number + +# (Java) Add or remove newline after an annotation statement. Only affects +# annotations that are after a newline. +nl_after_annotation = ignore # ignore/add/remove/force + +# (Java) Add or remove newline between two annotations. +nl_between_annotation = ignore # ignore/add/remove/force + +# +# Positioning options +# + +# The position of arithmetic operators in wrapped expressions. +pos_arith = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of assignment in wrapped expressions. Do not affect '=' +# followed by '{'. +pos_assign = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of Boolean operators in wrapped expressions. +pos_bool = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of comparison operators in wrapped expressions. +pos_compare = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of conditional operators, as in the '?' and ':' of +# 'expr ? stmt : stmt', in wrapped expressions. +pos_conditional = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in wrapped expressions. +pos_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in enum entries. +pos_enum_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in the base class list if there is more than one +# line. Affects nl_class_init_args. +pos_class_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in the constructor initialization list. +# Related to nl_constr_colon, nl_constr_init_args and pos_constr_colon. +pos_constr_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of trailing/leading class colon, between class and base class +# list. Affects nl_class_colon. +pos_class_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of colons between constructor and member initialization. +# Related to nl_constr_colon, nl_constr_init_args and pos_constr_comma. +pos_constr_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# +# Line splitting options +# + +# Try to limit code width to N columns. +code_width = 0 # unsigned number + +# Whether to fully split long 'for' statements at semi-colons. +ls_for_split_full = false # true/false + +# Whether to fully split long function prototypes/calls at commas. +# The option ls_code_width has priority over the option ls_func_split_full. +ls_func_split_full = false # true/false + +# Whether to split lines as close to code_width as possible and ignore some +# groupings. +# The option ls_code_width has priority over the option ls_func_split_full. +ls_code_width = false # true/false + +# +# Code alignment options (not left column spaces/tabs) +# + +# Whether to keep non-indenting tabs. +align_keep_tabs = false # true/false + +# Whether to use tabs for aligning. +align_with_tabs = false # true/false + +# Whether to bump out to the next tab when aligning. +align_on_tabstop = false # true/false + +# Whether to right-align numbers. +align_number_right = false # true/false + +# Whether to keep whitespace not required for alignment. +align_keep_extra_space = false # true/false + +# Whether to align variable definitions in prototypes and functions. +align_func_params = false # true/false + +# The span for aligning parameter definitions in function on parameter name. +# +# 0: Don't align (default). +align_func_params_span = 0 # unsigned number + +# The threshold for aligning function parameter definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_func_params_thresh = 0 # number + +# The gap for aligning function parameter definitions. +align_func_params_gap = 0 # unsigned number + +# The span for aligning constructor value. +# +# 0: Don't align (default). +align_constr_value_span = 0 # unsigned number + +# The threshold for aligning constructor value. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_constr_value_thresh = 0 # number + +# The gap for aligning constructor value. +align_constr_value_gap = 0 # unsigned number + +# Whether to align parameters in single-line functions that have the same +# name. The function names must already be aligned with each other. +align_same_func_call_params = false # true/false + +# The span for aligning function-call parameters for single line functions. +# +# 0: Don't align (default). +align_same_func_call_params_span = 0 # unsigned number + +# The threshold for aligning function-call parameters for single line +# functions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_same_func_call_params_thresh = 0 # number + +# The span for aligning variable definitions. +# +# 0: Don't align (default). +align_var_def_span = 0 # unsigned number + +# How to consider (or treat) the '*' in the alignment of variable definitions. +# +# 0: Part of the type 'void * foo;' (default) +# 1: Part of the variable 'void *foo;' +# 2: Dangling 'void *foo;' +# Dangling: the '*' will not be taken into account when aligning. +align_var_def_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of variable definitions. +# +# 0: Part of the type 'long & foo;' (default) +# 1: Part of the variable 'long &foo;' +# 2: Dangling 'long &foo;' +# Dangling: the '&' will not be taken into account when aligning. +align_var_def_amp_style = 0 # unsigned number + +# The threshold for aligning variable definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_var_def_thresh = 0 # number + +# The gap for aligning variable definitions. +align_var_def_gap = 0 # unsigned number + +# Whether to align the colon in struct bit fields. +align_var_def_colon = false # true/false + +# The gap for aligning the colon in struct bit fields. +align_var_def_colon_gap = 0 # unsigned number + +# Whether to align any attribute after the variable name. +align_var_def_attribute = false # true/false + +# Whether to align inline struct/enum/union variable definitions. +align_var_def_inline = false # true/false + +# The span for aligning on '=' in assignments. +# +# 0: Don't align (default). +align_assign_span = 0 # unsigned number + +# The span for aligning on '=' in function prototype modifier. +# +# 0: Don't align (default). +align_assign_func_proto_span = 0 # unsigned number + +# The threshold for aligning on '=' in assignments. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_assign_thresh = 0 # number + +# How to apply align_assign_span to function declaration "assignments", i.e. +# 'virtual void foo() = 0' or '~foo() = {default|delete}'. +# +# 0: Align with other assignments (default) +# 1: Align with each other, ignoring regular assignments +# 2: Don't align +align_assign_decl_func = 0 # unsigned number + +# The span for aligning on '=' in enums. +# +# 0: Don't align (default). +align_enum_equ_span = 0 # unsigned number + +# The threshold for aligning on '=' in enums. +# Use a negative number for absolute thresholds. +# +# 0: no limit (default). +align_enum_equ_thresh = 0 # number + +# The span for aligning class member definitions. +# +# 0: Don't align (default). +align_var_class_span = 0 # unsigned number + +# The threshold for aligning class member definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_var_class_thresh = 0 # number + +# The gap for aligning class member definitions. +align_var_class_gap = 0 # unsigned number + +# The span for aligning struct/union member definitions. +# +# 0: Don't align (default). +align_var_struct_span = 0 # unsigned number + +# The threshold for aligning struct/union member definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_var_struct_thresh = 0 # number + +# The gap for aligning struct/union member definitions. +align_var_struct_gap = 0 # unsigned number + +# The span for aligning struct initializer values. +# +# 0: Don't align (default). +align_struct_init_span = 0 # unsigned number + +# The span for aligning single-line typedefs. +# +# 0: Don't align (default). +align_typedef_span = 0 # unsigned number + +# The minimum space between the type and the synonym of a typedef. +align_typedef_gap = 0 # unsigned number + +# How to align typedef'd functions with other typedefs. +# +# 0: Don't mix them at all (default) +# 1: Align the open parenthesis with the types +# 2: Align the function type name with the other type names +align_typedef_func = 0 # unsigned number + +# How to consider (or treat) the '*' in the alignment of typedefs. +# +# 0: Part of the typedef type, 'typedef int * pint;' (default) +# 1: Part of type name: 'typedef int *pint;' +# 2: Dangling: 'typedef int *pint;' +# Dangling: the '*' will not be taken into account when aligning. +align_typedef_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of typedefs. +# +# 0: Part of the typedef type, 'typedef int & intref;' (default) +# 1: Part of type name: 'typedef int &intref;' +# 2: Dangling: 'typedef int &intref;' +# Dangling: the '&' will not be taken into account when aligning. +align_typedef_amp_style = 0 # unsigned number + +# The span for aligning comments that end lines. +# +# 0: Don't align (default). +align_right_cmt_span = 0 # unsigned number + +# Minimum number of columns between preceding text and a trailing comment in +# order for the comment to qualify for being aligned. Must be non-zero to have +# an effect. +align_right_cmt_gap = 0 # unsigned number + +# If aligning comments, whether to mix with comments after '}' and #endif with +# less than three spaces before the comment. +align_right_cmt_mix = false # true/false + +# Whether to only align trailing comments that are at the same brace level. +align_right_cmt_same_level = false # true/false + +# Minimum column at which to align trailing comments. Comments which are +# aligned beyond this column, but which can be aligned in a lesser column, +# may be "pulled in". +# +# 0: Ignore (default). +align_right_cmt_at_col = 0 # unsigned number + +# The span for aligning function prototypes. +# +# 0: Don't align (default). +align_func_proto_span = 0 # unsigned number + +# The threshold for aligning function prototypes. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_func_proto_thresh = 0 # number + +# Minimum gap between the return type and the function name. +align_func_proto_gap = 0 # unsigned number + +# Whether to align function prototypes on the 'operator' keyword instead of +# what follows. +align_on_operator = false # true/false + +# Whether to mix aligning prototype and variable declarations. If true, +# align_var_def_XXX options are used instead of align_func_proto_XXX options. +align_mix_var_proto = false # true/false + +# Whether to align single-line functions with function prototypes. +# Uses align_func_proto_span. +align_single_line_func = false # true/false + +# Whether to align the open brace of single-line functions. +# Requires align_single_line_func=true. Uses align_func_proto_span. +align_single_line_brace = false # true/false + +# Gap for align_single_line_brace. +align_single_line_brace_gap = 0 # unsigned number + +# (OC) The span for aligning Objective-C message specifications. +# +# 0: Don't align (default). +align_oc_msg_spec_span = 0 # unsigned number + +# Whether to align macros wrapped with a backslash and a newline. This will +# not work right if the macro contains a multi-line comment. +align_nl_cont = false # true/false + +# Whether to align macro functions and variables together. +align_pp_define_together = false # true/false + +# The span for aligning on '#define' bodies. +# +# =0: Don't align (default) +# >0: Number of lines (including comments) between blocks +align_pp_define_span = 0 # unsigned number + +# The minimum space between label and value of a preprocessor define. +align_pp_define_gap = 0 # unsigned number + +# Whether to align lines that start with '<<' with previous '<<'. +# +# Default: true +align_left_shift = true # true/false + +# Whether to align text after 'asm volatile ()' colons. +align_asm_colon = false # true/false + +# (OC) Span for aligning parameters in an Objective-C message call +# on the ':'. +# +# 0: Don't align. +align_oc_msg_colon_span = 0 # unsigned number + +# (OC) Whether to always align with the first parameter, even if it is too +# short. +align_oc_msg_colon_first = false # true/false + +# (OC) Whether to align parameters in an Objective-C '+' or '-' declaration +# on the ':'. +align_oc_decl_colon = false # true/false + +# +# Comment modification options +# + +# Try to wrap comments at N columns. +cmt_width = 0 # unsigned number + +# How to reflow comments. +# +# 0: No reflowing (apart from the line wrapping due to cmt_width) (default) +# 1: No touching at all +# 2: Full reflow +cmt_reflow_mode = 0 # unsigned number + +# Whether to convert all tabs to spaces in comments. If false, tabs in +# comments are left alone, unless used for indenting. +cmt_convert_tab_to_spaces = false # true/false + +# Whether to apply changes to multi-line comments, including cmt_width, +# keyword substitution and leading chars. +# +# Default: true +cmt_indent_multi = true # true/false + +# Whether to group c-comments that look like they are in a block. +cmt_c_group = false # true/false + +# Whether to put an empty '/*' on the first line of the combined c-comment. +cmt_c_nl_start = false # true/false + +# Whether to add a newline before the closing '*/' of the combined c-comment. +cmt_c_nl_end = false # true/false + +# Whether to change cpp-comments into c-comments. +cmt_cpp_to_c = false # true/false + +# Whether to group cpp-comments that look like they are in a block. Only +# meaningful if cmt_cpp_to_c=true. +cmt_cpp_group = false # true/false + +# Whether to put an empty '/*' on the first line of the combined cpp-comment +# when converting to a c-comment. +# +# Requires cmt_cpp_to_c=true and cmt_cpp_group=true. +cmt_cpp_nl_start = false # true/false + +# Whether to add a newline before the closing '*/' of the combined cpp-comment +# when converting to a c-comment. +# +# Requires cmt_cpp_to_c=true and cmt_cpp_group=true. +cmt_cpp_nl_end = false # true/false + +# Whether to put a star on subsequent comment lines. +cmt_star_cont = false # true/false + +# The number of spaces to insert at the start of subsequent comment lines. +cmt_sp_before_star_cont = 0 # unsigned number + +# The number of spaces to insert after the star on subsequent comment lines. +cmt_sp_after_star_cont = 0 # unsigned number + +# For multi-line comments with a '*' lead, remove leading spaces if the first +# and last lines of the comment are the same length. +# +# Default: true +cmt_multi_check_last = true # true/false + +# For multi-line comments with a '*' lead, remove leading spaces if the first +# and last lines of the comment are the same length AND if the length is +# bigger as the first_len minimum. +# +# Default: 4 +cmt_multi_first_len_minimum = 4 # unsigned number + +# Path to a file that contains text to insert at the beginning of a file if +# the file doesn't start with a C/C++ comment. If the inserted text contains +# '$(filename)', that will be replaced with the current file's name. +cmt_insert_file_header = "" # string + +# Path to a file that contains text to insert at the end of a file if the +# file doesn't end with a C/C++ comment. If the inserted text contains +# '$(filename)', that will be replaced with the current file's name. +cmt_insert_file_footer = "" # string + +# Path to a file that contains text to insert before a function definition if +# the function isn't preceded by a C/C++ comment. If the inserted text +# contains '$(function)', '$(javaparam)' or '$(fclass)', these will be +# replaced with, respectively, the name of the function, the javadoc '@param' +# and '@return' stuff, or the name of the class to which the member function +# belongs. +cmt_insert_func_header = "" # string + +# Path to a file that contains text to insert before a class if the class +# isn't preceded by a C/C++ comment. If the inserted text contains '$(class)', +# that will be replaced with the class name. +cmt_insert_class_header = "" # string + +# Path to a file that contains text to insert before an Objective-C message +# specification, if the method isn't preceded by a C/C++ comment. If the +# inserted text contains '$(message)' or '$(javaparam)', these will be +# replaced with, respectively, the name of the function, or the javadoc +# '@param' and '@return' stuff. +cmt_insert_oc_msg_header = "" # string + +# Whether a comment should be inserted if a preprocessor is encountered when +# stepping backwards from a function name. +# +# Applies to cmt_insert_oc_msg_header, cmt_insert_func_header and +# cmt_insert_class_header. +cmt_insert_before_preproc = false # true/false + +# Whether a comment should be inserted if a function is declared inline to a +# class definition. +# +# Applies to cmt_insert_func_header. +# +# Default: true +cmt_insert_before_inlines = true # true/false + +# Whether a comment should be inserted if the function is a class constructor +# or destructor. +# +# Applies to cmt_insert_func_header. +cmt_insert_before_ctor_dtor = false # true/false + +# +# Code modifying options (non-whitespace) +# + +# Add or remove braces on a single-line 'do' statement. +mod_full_brace_do = ignore # ignore/add/remove/force + +# Add or remove braces on a single-line 'for' statement. +mod_full_brace_for = ignore # ignore/add/remove/force + +# (Pawn) Add or remove braces on a single-line function definition. +mod_full_brace_function = ignore # ignore/add/remove/force + +# Add or remove braces on a single-line 'if' statement. Braces will not be +# removed if the braced statement contains an 'else'. +mod_full_brace_if = ignore # ignore/add/remove/force + +# Whether to enforce that all blocks of an 'if'/'else if'/'else' chain either +# have, or do not have, braces. If true, braces will be added if any block +# needs braces, and will only be removed if they can be removed from all +# blocks. +# +# Overrides mod_full_brace_if. +mod_full_brace_if_chain = false # true/false + +# Whether to add braces to all blocks of an 'if'/'else if'/'else' chain. +# If true, mod_full_brace_if_chain will only remove braces from an 'if' that +# does not have an 'else if' or 'else'. +mod_full_brace_if_chain_only = false # true/false + +# Add or remove braces on single-line 'while' statement. +mod_full_brace_while = ignore # ignore/add/remove/force + +# Add or remove braces on single-line 'using ()' statement. +mod_full_brace_using = ignore # ignore/add/remove/force + +# Don't remove braces around statements that span N newlines +mod_full_brace_nl = 0 # unsigned number + +# Whether to prevent removal of braces from 'if'/'for'/'while'/etc. blocks +# which span multiple lines. +# +# Affects: +# mod_full_brace_for +# mod_full_brace_if +# mod_full_brace_if_chain +# mod_full_brace_if_chain_only +# mod_full_brace_while +# mod_full_brace_using +# +# Does not affect: +# mod_full_brace_do +# mod_full_brace_function +mod_full_brace_nl_block_rem_mlcond = false # true/false + +# Add or remove unnecessary parenthesis on 'return' statement. +mod_paren_on_return = ignore # ignore/add/remove/force + +# (Pawn) Whether to change optional semicolons to real semicolons. +mod_pawn_semicolon = false # true/false + +# Whether to fully parenthesize Boolean expressions in 'while' and 'if' +# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'. +mod_full_paren_if_bool = false # true/false + +# Whether to remove superfluous semicolons. +mod_remove_extra_semicolon = false # true/false + +# If a function body exceeds the specified number of newlines and doesn't have +# a comment after the close brace, a comment will be added. +mod_add_long_function_closebrace_comment = 0 # unsigned number + +# If a namespace body exceeds the specified number of newlines and doesn't +# have a comment after the close brace, a comment will be added. +mod_add_long_namespace_closebrace_comment = 0 # unsigned number + +# If a class body exceeds the specified number of newlines and doesn't have a +# comment after the close brace, a comment will be added. +mod_add_long_class_closebrace_comment = 0 # unsigned number + +# If a switch body exceeds the specified number of newlines and doesn't have a +# comment after the close brace, a comment will be added. +mod_add_long_switch_closebrace_comment = 0 # unsigned number + +# If an #ifdef body exceeds the specified number of newlines and doesn't have +# a comment after the #endif, a comment will be added. +mod_add_long_ifdef_endif_comment = 0 # unsigned number + +# If an #ifdef or #else body exceeds the specified number of newlines and +# doesn't have a comment after the #else, a comment will be added. +mod_add_long_ifdef_else_comment = 0 # unsigned number + +# Whether to take care of the case by the mod_sort_xx options. +mod_sort_case_sensitive = false # true/false + +# Whether to sort consecutive single-line 'import' statements. +mod_sort_import = false # true/false + +# (C#) Whether to sort consecutive single-line 'using' statements. +mod_sort_using = false # true/false + +# Whether to sort consecutive single-line '#include' statements (C/C++) and +# '#import' statements (Objective-C). Be aware that this has the potential to +# break your code if your includes/imports have ordering dependencies. +mod_sort_include = false # true/false + +# Whether to move a 'break' that appears after a fully braced 'case' before +# the close brace, as in 'case X: { ... } break;' => 'case X: { ... break; }'. +mod_move_case_break = false # true/false + +# Add or remove braces around a fully braced case statement. Will only remove +# braces if there are no variable declarations in the block. +mod_case_brace = ignore # ignore/add/remove/force + +# Whether to remove a void 'return;' that appears as the last statement in a +# function. +mod_remove_empty_return = false # true/false + +# Add or remove the comma after the last value of an enumeration. +mod_enum_last_comma = ignore # ignore/add/remove/force + +# (OC) Whether to organize the properties. If true, properties will be +# rearranged according to the mod_sort_oc_property_*_weight factors. +mod_sort_oc_properties = false # true/false + +# (OC) Weight of a class property modifier. +mod_sort_oc_property_class_weight = 0 # number + +# (OC) Weight of 'atomic' and 'nonatomic'. +mod_sort_oc_property_thread_safe_weight = 0 # number + +# (OC) Weight of 'readwrite' when organizing properties. +mod_sort_oc_property_readwrite_weight = 0 # number + +# (OC) Weight of a reference type specifier ('retain', 'copy', 'assign', +# 'weak', 'strong') when organizing properties. +mod_sort_oc_property_reference_weight = 0 # number + +# (OC) Weight of getter type ('getter=') when organizing properties. +mod_sort_oc_property_getter_weight = 0 # number + +# (OC) Weight of setter type ('setter=') when organizing properties. +mod_sort_oc_property_setter_weight = 0 # number + +# (OC) Weight of nullability type ('nullable', 'nonnull', 'null_unspecified', +# 'null_resettable') when organizing properties. +mod_sort_oc_property_nullability_weight = 0 # number + +# +# Preprocessor options +# + +# Add or remove indentation of preprocessor directives inside #if blocks +# at brace level 0 (file-level). +pp_indent = ignore # ignore/add/remove/force + +# Whether to indent #if/#else/#endif at the brace level. If false, these are +# indented from column 1. +pp_indent_at_level = false # true/false + +# Specifies the number of columns to indent preprocessors per level +# at brace level 0 (file-level). If pp_indent_at_level=false, also specifies +# the number of columns to indent preprocessors per level +# at brace level > 0 (function-level). +# +# Default: 1 +pp_indent_count = 1 # unsigned number + +# Add or remove space after # based on pp_level of #if blocks. +pp_space = ignore # ignore/add/remove/force + +# Sets the number of spaces per level added with pp_space. +pp_space_count = 0 # unsigned number + +# The indent for '#region' and '#endregion' in C# and '#pragma region' in +# C/C++. Negative values decrease indent down to the first column. +pp_indent_region = 0 # number + +# Whether to indent the code between #region and #endregion. +pp_region_indent_code = false # true/false + +# If pp_indent_at_level=true, sets the indent for #if, #else and #endif when +# not at file-level. Negative values decrease indent down to the first column. +# +# =0: Indent preprocessors using output_tab_size +# >0: Column at which all preprocessors will be indented +pp_indent_if = 0 # number + +# Whether to indent the code between #if, #else and #endif. +pp_if_indent_code = false # true/false + +# Whether to indent '#define' at the brace level. If false, these are +# indented from column 1. +pp_define_at_level = false # true/false + +# Whether to ignore the '#define' body while formatting. +pp_ignore_define_body = false # true/false + +# Whether to indent case statements between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the case statements +# directly inside of. +# +# Default: true +pp_indent_case = true # true/false + +# Whether to indent whole function definitions between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the function definition +# is directly inside of. +# +# Default: true +pp_indent_func_def = true # true/false + +# Whether to indent extern C blocks between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the extern block is +# directly inside of. +# +# Default: true +pp_indent_extern = true # true/false + +# Whether to indent braces directly inside #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the braces are directly +# inside of. +# +# Default: true +pp_indent_brace = true # true/false + +# +# Sort includes options +# + +# The regex for include category with priority 0. +include_category_0 = "" # string + +# The regex for include category with priority 1. +include_category_1 = "" # string + +# The regex for include category with priority 2. +include_category_2 = "" # string + +# +# Use or Do not Use options +# + +# true: indent_func_call_param will be used (default) +# false: indent_func_call_param will NOT be used +# +# Default: true +use_indent_func_call_param = true # true/false + +# The value of the indentation for a continuation line is calculated +# differently if the statement is: +# - a declaration: your case with QString fileName ... +# - an assignment: your case with pSettings = new QSettings( ... +# +# At the second case the indentation value might be used twice: +# - at the assignment +# - at the function call (if present) +# +# To prevent the double use of the indentation value, use this option with the +# value 'true'. +# +# true: indent_continue will be used only once +# false: indent_continue will be used every time (default) +use_indent_continue_only_once = false # true/false + +# The value might be used twice: +# - at the assignment +# - at the opening brace +# +# To prevent the double use of the indentation value, use this option with the +# value 'true'. +# +# true: indentation will be used only once +# false: indentation will be used every time (default) +indent_cpp_lambda_only_once = false # true/false + +# Whether sp_after_angle takes precedence over sp_inside_fparen. This was the +# historic behavior, but is probably not the desired behavior, so this is off +# by default. +use_sp_after_angle_always = false # true/false + +# Whether to apply special formatting for Qt SIGNAL/SLOT macros. Essentially, +# this tries to format these so that they match Qt's normalized form (i.e. the +# result of QMetaObject::normalizedSignature), which can slightly improve the +# performance of the QObject::connect call, rather than how they would +# otherwise be formatted. +# +# See options_for_QT.cpp for details. +# +# Default: true +use_options_overriding_for_qt_macros = true # true/false + +# +# Warn levels - 1: error, 2: warning (default), 3: note +# + +# (C#) Warning is given if doing tab-to-\t replacement and we have found one +# in a C# verbatim string literal. +# +# Default: 2 +warn_level_tabs_found_in_verbatim_string_literals = 2 # unsigned number + +# Meaning of the settings: +# Ignore - do not do any changes +# Add - makes sure there is 1 or more space/brace/newline/etc +# Force - makes sure there is exactly 1 space/brace/newline/etc, +# behaves like Add in some contexts +# Remove - removes space/brace/newline/etc +# +# +# - Token(s) can be treated as specific type(s) with the 'set' option: +# `set tokenType tokenString [tokenString...]` +# +# Example: +# `set BOOL __AND__ __OR__` +# +# tokenTypes are defined in src/token_enum.h, use them without the +# 'CT_' prefix: 'CT_BOOL' => 'BOOL' +# +# +# - Token(s) can be treated as type(s) with the 'type' option. +# `type tokenString [tokenString...]` +# +# Example: +# `type int c_uint_8 Rectangle` +# +# This can also be achieved with `set TYPE int c_uint_8 Rectangle` +# +# +# To embed whitespace in tokenStrings use the '\' escape character, or quote +# the tokenStrings. These quotes are supported: "'` +# +# +# - Support for the auto detection of languages through the file ending can be +# added using the 'file_ext' command. +# `file_ext langType langString [langString..]` +# +# Example: +# `file_ext CPP .ch .cxx .cpp.in` +# +# langTypes are defined in uncrusify_types.h in the lang_flag_e enum, use +# them without the 'LANG_' prefix: 'LANG_CPP' => 'CPP' +# +# +# - Custom macro-based indentation can be set up using 'macro-open', +# 'macro-else' and 'macro-close'. +# `(macro-open | macro-else | macro-close) tokenString` +# +# Example: +# `macro-open BEGIN_TEMPLATE_MESSAGE_MAP` +# `macro-open BEGIN_MESSAGE_MAP` +# `macro-close END_MESSAGE_MAP` +# +# +# option(s) with 'not default' value: 0 +# + +file_ext CPP .ch .cxx .cpp.in .cc .hh + diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 98018ca0e..437a761c4 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -29,38 +29,38 @@ int main() ErrorInfo { .level = lvlInfo, .name = "Info name", .description = "Info description", - }); + }); logger->logEI( ErrorInfo { .level = lvlTalkative, .name = "Talkative name", .description = "Talkative description", - }); + }); logger->logEI( ErrorInfo { .level = lvlChatty, .name = "Chatty name", .description = "Chatty description", - }); + }); logger->logEI( ErrorInfo { .level = lvlDebug, .name = "Debug name", .description = "Debug description", - }); + }); logger->logEI( ErrorInfo { .level = lvlVomit, .name = "Vomit name", .description = "Vomit description", - }); + }); // Error in a program; no hint and no nix code. logError( ErrorInfo { .name = "name", .description = "error description", - }); + }); // Warning with name, description, and hint. // The hintfmt function makes all the substituted text yellow. @@ -68,7 +68,7 @@ int main() ErrorInfo { .name = "name", .description = "error description", .hint = hintfmt("there was a %1%", "warning"), - }); + }); // Warning with nix file, line number, column, and the lines of @@ -80,28 +80,28 @@ int main() ErrorInfo { .name = "warning name", .description = "warning description", .hint = hintfmt("this hint has %1% templated %2%!!", - "yellow", - "values"), + "yellow", + "values"), .nixCode = NixCode { .errPos = Pos(problem_file, 40, 13), .prevLineOfCode = std::nullopt, .errLineOfCode = "this is the problem line of code", .nextLineOfCode = std::nullopt - }}); + }}); // Error with previous and next lines of code. logError( ErrorInfo { .name = "error name", .description = "error description", .hint = hintfmt("this hint has %1% templated %2%!!", - "yellow", - "values"), + "yellow", + "values"), .nixCode = NixCode { .errPos = Pos(problem_file, 40, 13), .prevLineOfCode = std::optional("previous line of code"), .errLineOfCode = "this is the problem line of code", .nextLineOfCode = std::optional("next line of code"), - }}); + }}); return 0; diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index 79e3f90e5..a8bae0a61 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -234,7 +234,8 @@ struct ExprLambda : Expr : pos(pos), arg(arg), matchAttrs(matchAttrs), formals(formals), body(body) { if (!arg.empty() && formals && formals->argNames.find(arg) != formals->argNames.end()) - throw ParseError("duplicate formal function argument '%1%' at %2%", arg, pos); }; + throw ParseError("duplicate formal function argument '%1%' at %2%", arg, pos); + }; void setName(Symbol & name); string showNamePos() const; COMMON_METHODS diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 8f0e0aa1a..91fa1ccd8 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -45,17 +45,17 @@ void printCodeLines(const string &prefix, const NixCode &nixCode) // previous line of code. if (nixCode.prevLineOfCode.has_value()) { std::cout << fmt("%1% %|2$5d|| %3%", - prefix, - (nixCode.errPos.line - 1), - *nixCode.prevLineOfCode) + prefix, + (nixCode.errPos.line - 1), + *nixCode.prevLineOfCode) << std::endl; } // line of code containing the error.%2$+5d% std::cout << fmt("%1% %|2$5d|| %3%", - prefix, - (nixCode.errPos.line), - nixCode.errLineOfCode) + prefix, + (nixCode.errPos.line), + nixCode.errLineOfCode) << std::endl; // error arrows for the column range. @@ -69,17 +69,17 @@ void printCodeLines(const string &prefix, const NixCode &nixCode) std::string arrows("^"); std::cout << fmt("%1% |%2%" ANSI_RED "%3%" ANSI_NORMAL, - prefix, - spaces, - arrows) << std::endl; + prefix, + spaces, + arrows) << std::endl; } // next line of code. if (nixCode.nextLineOfCode.has_value()) { std::cout << fmt("%1% %|2$5d|| %3%", - prefix, - (nixCode.errPos.line + 1), - *nixCode.nextLineOfCode) + prefix, + (nixCode.errPos.line + 1), + *nixCode.nextLineOfCode) << std::endl; } } @@ -149,18 +149,18 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) // divider. if (einfo.name != "") out << fmt("%1%%2%" ANSI_BLUE " --- %3% %4% %5%" ANSI_NORMAL, - prefix, - levelString, - einfo.name, - dashes, - einfo.programName.value_or("")) + prefix, + levelString, + einfo.name, + dashes, + einfo.programName.value_or("")) << std::endl; else out << fmt("%1%%2%" ANSI_BLUE " -----%3% %4%" ANSI_NORMAL, - prefix, - levelString, - dashes, - einfo.programName.value_or("")) + prefix, + levelString, + dashes, + einfo.programName.value_or("")) << std::endl; // filename. @@ -171,9 +171,9 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) : ""; out << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL, - prefix, - einfo.nixCode->errPos.file, - eline) << std::endl; + prefix, + einfo.nixCode->errPos.file, + eline) << std::endl; out << prefix << std::endl; } else { out << fmt("%1%from command line argument", prefix) << std::endl; diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 4a8b98640..e1750eb2a 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -60,7 +60,7 @@ public: void logEI(const ErrorInfo & ei) override { - std::stringstream oss; + std::stringstream oss; oss << ei; log(ei.level, oss.str()); @@ -68,7 +68,7 @@ public: void startActivity(ActivityId act, Verbosity lvl, ActivityType type, const std::string & s, const Fields & fields, ActivityId parent) - override + override { if (lvl <= verbosity && !s.empty()) log(lvl, s + "..."); @@ -111,8 +111,7 @@ Activity::Activity(Logger & logger, Verbosity lvl, ActivityType type, logger.startActivity(id, lvl, type, s, fields, parent); } -struct JSONLogger : Logger -{ +struct JSONLogger : Logger { Logger & prevLogger; JSONLogger(Logger & prevLogger) : prevLogger(prevLogger) { } @@ -155,28 +154,26 @@ struct JSONLogger : Logger json["level"] = ei.level; json["msg"] = oss.str(); - // Extra things that COULD go into json. Useful? + // Extra things that COULD go into json. Useful? // TODO: decide if useful. // TODO: make a json obj that goes into json["msg"]? json["name"] = ei.name; json["description"] = ei.description; - if (ei.hint.has_value()) - { - json["hint"] = ei.hint->str(); + if (ei.hint.has_value()) { + json["hint"] = ei.hint->str(); } - if (ei.nixCode.has_value()) - { - if (ei.nixCode->errPos.line != 0) - json["line"] = ei.nixCode->errPos.line; - if (ei.nixCode->errPos.column != 0) - json["column"] = ei.nixCode->errPos.column; - if (ei.nixCode->errPos.file != "") - json["file"] = ei.nixCode->errPos.file; - if (ei.nixCode->prevLineOfCode.has_value()) - json["prevLineOfCode"] = *ei.nixCode->prevLineOfCode; - json["errLineOfCode"] = ei.nixCode->errLineOfCode; - if (ei.nixCode->nextLineOfCode.has_value()) - json["nextLineOfCode"] = *ei.nixCode->nextLineOfCode; + if (ei.nixCode.has_value()) { + if (ei.nixCode->errPos.line != 0) + json["line"] = ei.nixCode->errPos.line; + if (ei.nixCode->errPos.column != 0) + json["column"] = ei.nixCode->errPos.column; + if (ei.nixCode->errPos.file != "") + json["file"] = ei.nixCode->errPos.file; + if (ei.nixCode->prevLineOfCode.has_value()) + json["prevLineOfCode"] = *ei.nixCode->prevLineOfCode; + json["errLineOfCode"] = ei.nixCode->errLineOfCode; + if (ei.nixCode->nextLineOfCode.has_value()) + json["nextLineOfCode"] = *ei.nixCode->nextLineOfCode; } write(json); @@ -278,7 +275,8 @@ bool handleJSONLogMessage(const std::string & msg, return true; } -Activity::~Activity() { +Activity::~Activity() +{ try { logger.stopActivity(id); } catch (...) { diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 89fd98419..0c4980b83 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -62,12 +62,12 @@ public: virtual void logEI(const ErrorInfo &ei) = 0; - void logEI(Verbosity lvl, ErrorInfo ei) + void logEI(Verbosity lvl, ErrorInfo ei) { ei.level = lvl; logEI(ei); } - + virtual void warn(const std::string & msg); virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type, From 2d0f766a778ac790be1ab1918db7c319ac7e5792 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 29 Apr 2020 11:52:35 -0600 Subject: [PATCH 016/120] more style tweaks --- .uncrustify.cfg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.uncrustify.cfg b/.uncrustify.cfg index 23305adcf..b28935dcc 100644 --- a/.uncrustify.cfg +++ b/.uncrustify.cfg @@ -97,7 +97,7 @@ sp_cpp_lambda_square_paren = ignore # ignore/add/remove/force # Add or remove space after the capture specification of a C++11 lambda with # no argument list is present, as in '[] { ... }'. -sp_cpp_lambda_square_brace = ignore # ignore/add/remove/force +sp_cpp_lambda_square_brace = remove # ignore/add/remove/force # Add or remove space after the argument list of a C++11 lambda, as in # '[](int x) { ... }'. @@ -279,11 +279,11 @@ sp_angle_word = ignore # ignore/add/remove/force # Add or remove space between '>' and '>' in '>>' (template stuff). # # Default: add -sp_angle_shift = add # ignore/add/remove/force +sp_angle_shift = ignore # ignore/add/remove/force # (C++11) Permit removal of the space between '>>' in 'foo >'. Note # that sp_angle_shift cannot remove the space without this option. -sp_permit_cpp11_shift = false # true/false +sp_permit_cpp11_shift = true # true/false # Add or remove space before '(' of control statements ('if', 'for', 'switch', # 'while', etc.). @@ -1157,7 +1157,7 @@ indent_label = 1 # number # <=0: Subtract from brace indent # # Default: 1 -indent_access_spec = 1 # number +indent_access_spec = -4 # number # Whether to indent the code after an access specifier by one level. # If true, this option forces 'indent_access_spec=0'. @@ -1333,7 +1333,7 @@ nl_cs_property_leave_one_liners = true # true/false nl_func_leave_one_liners = true # true/false # Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. -nl_cpp_lambda_leave_one_liners = false # true/false +nl_cpp_lambda_leave_one_liners = true # true/false # Don't split one-line if/else statements, as in 'if(...) b++;'. nl_if_leave_one_liners = true # true/false From 39ff80d031c5c9c1831ba5ea597c0de0181bfe34 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 29 Apr 2020 18:57:05 -0600 Subject: [PATCH 017/120] errorinfo constructor test --- src/error-demo/error-demo.cc | 10 ++++++++++ src/libstore/binary-cache-store.cc | 2 +- src/libstore/remote-store.cc | 2 +- src/libutil/error.hh | 7 ++++--- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 437a761c4..2c4f2da6e 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -23,6 +23,16 @@ int main() logger->logEI(e.info()); } + + // ErrorInfo constructor + try { + auto e = Error("generic error"); + throw DemoError(e.info()); + } catch (Error &e) { + logger->logEI(e.info()); + } + + // For completeness sake, info through vomit levels. // But this is maybe a heavy format for those. logger->logEI( diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc index 4b7385c6b..97e34a75d 100644 --- a/src/libstore/binary-cache-store.cc +++ b/src/libstore/binary-cache-store.cc @@ -284,7 +284,7 @@ void BinaryCacheStore::narFromPath(const StorePath & storePath, Sink & sink) try { getFile(info->url, *decompressor); } catch (NoSuchBinaryCacheFile & e) { - throw SubstituteGone(e.what()); + throw SubstituteGone(e.info()); } decompressor->finish(); diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 0f8126aee..cc336e460 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -365,7 +365,7 @@ void RemoteStore::queryPathInfoUncached(const StorePath & path, } catch (Error & e) { // Ugly backwards compatibility hack. if (e.msg().find("is not valid") != std::string::npos) - throw InvalidPath(e.what()); + throw InvalidPath(e.info()); throw; } if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 17) { diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 03e43241f..48e6311bd 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -83,6 +83,7 @@ class BaseError : public std::exception protected: string prefix_; // used for location traces etc. ErrorInfo err; + std::optional what_; const string& calcWhat() { @@ -107,18 +108,18 @@ public: .hint = hintfmt(args...) } , status(status) - { } + { } template BaseError(const Args & ... args) : err { .level = lvlError, .hint = hintfmt(args...) } - { } + { } BaseError(ErrorInfo e) : err(e) - { } + { } virtual const char* sname() const { return "BaseError"; } From 171b4ce85c491563004ad6b74377a8cb70a7d06c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 30 Apr 2020 09:57:01 -0600 Subject: [PATCH 018/120] typo --- src/nix/shell.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nix/shell.cc b/src/nix/shell.cc index 71e640667..e0546ef78 100644 --- a/src/nix/shell.cc +++ b/src/nix/shell.cc @@ -219,7 +219,7 @@ struct CmdDevShell : Common, MixEnvironment mkFlag() .longName("command") .shortName('c') - .description("command and arguments to be executed insted of an interactive shell") + .description("command and arguments to be executed instead of an interactive shell") .labels({"command", "args"}) .arity(ArityAny) .handler([&](std::vector ss) { From f5d3215c8740feec8053a697eca04c12eb71191b Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 30 Apr 2020 16:31:47 -0600 Subject: [PATCH 019/120] logError --- src/error-demo/error-demo.cc | 2 -- src/nix/verify.cc | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 2c4f2da6e..514258416 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -65,7 +65,6 @@ int main() .description = "Vomit description", }); - // Error in a program; no hint and no nix code. logError( ErrorInfo { .name = "name", @@ -80,7 +79,6 @@ int main() .hint = hintfmt("there was a %1%", "warning"), }); - // Warning with nix file, line number, column, and the lines of // code where a warning occurred. SymbolTable testTable; diff --git a/src/nix/verify.cc b/src/nix/verify.cc index 9b0658803..6e043dc2d 100644 --- a/src/nix/verify.cc +++ b/src/nix/verify.cc @@ -137,7 +137,7 @@ struct CmdVerify : StorePathsCommand doSigs(info2->sigs); } catch (InvalidPath &) { } catch (Error & e) { - printError(format(ANSI_RED "error:" ANSI_NORMAL " %s") % e.what()); + logError(e.info()); } } @@ -156,7 +156,7 @@ struct CmdVerify : StorePathsCommand done++; } catch (Error & e) { - printError(format(ANSI_RED "error:" ANSI_NORMAL " %s") % e.what()); + logError(e.info()); failed++; } From a3030e3c3186f980716c475155c387bf18041a3f Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 30 Apr 2020 17:56:26 -0600 Subject: [PATCH 020/120] fix error calls --- src/nix-channel/nix-channel.cc | 30 ++++++++++-------------------- src/nix-store/nix-store.cc | 2 +- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/nix-channel/nix-channel.cc b/src/nix-channel/nix-channel.cc index c403e3780..589a061c7 100755 --- a/src/nix-channel/nix-channel.cc +++ b/src/nix-channel/nix-channel.cc @@ -37,8 +37,7 @@ static void writeChannels() { auto channelsFD = AutoCloseFD{open(channelsList.c_str(), O_WRONLY | O_CLOEXEC | O_CREAT | O_TRUNC, 0644)}; if (!channelsFD) - throw Error(""); - // throw SysError("opening '%1%' for writing", channelsList); + throw SysError("opening '%1%' for writing", channelsList); for (const auto & channel : channels) writeFull(channelsFD.get(), channel.second + " " + channel.first + "\n"); } @@ -47,11 +46,9 @@ static void writeChannels() static void addChannel(const string & url, const string & name) { if (!regex_search(url, std::regex("^(file|http|https)://"))) - throw Error(""); - // throw Error("invalid channel URL '%1%'", url); + throw Error("invalid channel URL '%1%'", url); if (!regex_search(name, std::regex("^[a-zA-Z0-9_][a-zA-Z0-9_\\.-]*$"))) - throw Error(""); - // throw Error("invalid channel identifier '%1%'", name); + throw Error("invalid channel identifier '%1%'", name); readChannels(); channels[name] = url; writeChannels(); @@ -143,11 +140,9 @@ static void update(const StringSet & channelNames) if (S_ISLNK(st.st_mode)) // old-skool ~/.nix-defexpr if (unlink(nixDefExpr.c_str()) == -1) - throw Error(""); - // throw SysError("unlinking %1%", nixDefExpr); + throw SysError("unlinking %1%", nixDefExpr); } else if (errno != ENOENT) { - throw Error(""); - // throw SysError("getting status of %1%", nixDefExpr); + throw SysError("getting status of %1%", nixDefExpr); } createDirs(nixDefExpr); auto channelLink = nixDefExpr + "/channels"; @@ -199,12 +194,10 @@ static int _main(int argc, char ** argv) switch (cmd) { case cNone: - throw Error(""); - // throw UsageError("no command specified"); + throw UsageError("no command specified"); case cAdd: if (args.size() < 1 || args.size() > 2) - throw Error(""); - // throw UsageError("'--add' requires one or two arguments"); + throw UsageError("'--add' requires one or two arguments"); { auto url = args[0]; std::string name; @@ -220,14 +213,12 @@ static int _main(int argc, char ** argv) break; case cRemove: if (args.size() != 1) - throw Error(""); - // throw UsageError("'--remove' requires one argument"); + throw UsageError("'--remove' requires one argument"); removeChannel(args[0]); break; case cList: if (!args.empty()) - throw Error(""); - // throw UsageError("'--list' expects no arguments"); + throw UsageError("'--list' expects no arguments"); readChannels(); for (const auto & channel : channels) std::cout << channel.first << ' ' << channel.second << '\n'; @@ -237,8 +228,7 @@ static int _main(int argc, char ** argv) break; case cRollback: if (args.size() > 1) - throw Error(""); - // throw UsageError("'--rollback' has at most one argument"); + throw UsageError("'--rollback' has at most one argument"); Strings envArgs{"--profile", profile}; if (args.size() == 1) { envArgs.push_back("--switch-generation"); diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index e4dd9bc96..1e8a88a7b 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -906,7 +906,7 @@ static void opServe(Strings opFlags, Strings opArgs) if (!writeAllowed) throw Error("building paths is not allowed"); - auto drvPath = store->parseStorePath(readString(in)); // inonal ony + auto drvPath = store->parseStorePath(readString(in)); // informational only BasicDerivation drv; readDerivation(in, *store, drv); From 4b99c09f5ccd385d2bf0c82a8c9a4ae1658abbe8 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 1 May 2020 14:32:06 -0600 Subject: [PATCH 021/120] convert some errors --- src/libstore/builtins/buildenv.cc | 12 +++++++-- src/libstore/download.cc | 7 ++++- src/libstore/gc.cc | 13 ++++++--- src/libstore/local-store.cc | 44 +++++++++++++++++++++++-------- src/libstore/optimise-store.cc | 18 ++++++++++--- src/libstore/remote-store.cc | 9 +++++++ src/libstore/sqlite.cc | 5 +++- 7 files changed, 86 insertions(+), 22 deletions(-) diff --git a/src/libstore/builtins/buildenv.cc b/src/libstore/builtins/buildenv.cc index 000769094..64085fcc9 100644 --- a/src/libstore/builtins/buildenv.cc +++ b/src/libstore/builtins/buildenv.cc @@ -22,7 +22,11 @@ static void createLinks(State & state, const Path & srcDir, const Path & dstDir, srcFiles = readDirectory(srcDir); } catch (SysError & e) { if (e.errNo == ENOTDIR) { - printError("warning: not including '%s' in the user environment because it's not a directory", srcDir); + logWarning( + ErrorInfo { + .name = "Create Links - Directory", + .hint = hintfmt("not including '%s' in the user environment because it's not a directory", srcDir) + }); return; } throw; @@ -41,7 +45,11 @@ static void createLinks(State & state, const Path & srcDir, const Path & dstDir, throw SysError("getting status of '%1%'", srcFile); } catch (SysError & e) { if (e.errNo == ENOENT || e.errNo == ENOTDIR) { - printError("warning: skipping dangling symlink '%s'", dstFile); + logWarning( + ErrorInfo { + .name = "Create Links - Skipping Symlink", + .hint = hintfmt("skipping dangling symlink '%s'", dstFile) + }); continue; } throw; diff --git a/src/libstore/download.cc b/src/libstore/download.cc index 7d0cb449b..60c6a80f3 100644 --- a/src/libstore/download.cc +++ b/src/libstore/download.cc @@ -600,7 +600,12 @@ struct CurlDownloader : public Downloader workerThreadMain(); } catch (nix::Interrupted & e) { } catch (std::exception & e) { - printError("unexpected error in download thread: %s", e.what()); + logError( + ErrorInfo { + .name = "download", + .hint = hintfmt("unexpected error in download thread: %s", + e.what()) + }); } { diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 27bd3f3e9..4f6f78a99 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -41,7 +41,8 @@ AutoCloseFD LocalStore::openGCLock(LockType lockType) throw SysError("opening global GC lock '%1%'", fnGCLock); if (!lockFile(fdGCLock.get(), lockType, false)) { - printError(format("waiting for the big garbage collector lock...")); + // TODO: info? + printError("waiting for the big garbage collector lock..."); lockFile(fdGCLock.get(), lockType, true); } @@ -129,10 +130,14 @@ Path LocalFSStore::addPermRoot(const StorePath & storePath, if (settings.checkRootReachability) { auto roots = findRoots(false); if (roots[storePath.clone()].count(gcRoot) == 0) - printError( - "warning: '%1%' is not in a directory where the garbage collector looks for roots; " + + logWarning( + ErrorInfo { + .name = "GC Root", + .hint = hintfmt("warning: '%1%' is not in a directory where the garbage collector looks for roots; " "therefore, '%2%' might be removed by the garbage collector", - gcRoot, printStorePath(storePath)); + gcRoot, printStorePath(storePath)) + }); } /* Grab the global GC root, causing us to block while a GC is in diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index db5a3b53c..1f16a22b1 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -87,8 +87,13 @@ LocalStore::LocalStore(const Params & params) struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str()); if (!gr) - printError(format("warning: the group '%1%' specified in 'build-users-group' does not exist") - % settings.buildUsersGroup); + logError( + ErrorInfo { + .name = "'build-users-group' not found", + .hint = hintfmt( + "warning: the group '%1%' specified in 'build-users-group' does not exist", + settings.buildUsersGroup) + }); else { struct stat st; if (stat(realStoreDir.c_str(), &st)) @@ -876,7 +881,7 @@ void LocalStore::querySubstitutablePathInfos(const StorePathSet & paths, } catch (SubstituterDisabled &) { } catch (Error & e) { if (settings.tryFallback) - printError(e.what()); + logError(e.info()); else throw; } @@ -1237,9 +1242,13 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) Path linkPath = linksDir + "/" + link.name; string hash = hashPath(htSHA256, linkPath).first.to_string(Base32, false); if (hash != link.name) { - printError( + logError( + ErrorInfo { + .name = "Invalid Hash", + .hint = hintfmt( "link '%s' was modified! expected hash '%s', got '%s'", - linkPath, link.name, hash); + linkPath, link.name, hash) + }); if (repair) { if (unlink(linkPath.c_str()) == 0) printError("removed link '%s'", linkPath); @@ -1272,8 +1281,12 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) auto current = hashSink->finish(); if (info->narHash != nullHash && info->narHash != current.first) { - printError("path '%s' was modified! expected hash '%s', got '%s'", - printStorePath(i), info->narHash.to_string(), current.first.to_string()); + logError( + ErrorInfo { + .name = "Invalid Hash - Path Modified", + .hint = hintfmt("path '%s' was modified! expected hash '%s', got '%s'", + printStorePath(i), info->narHash.to_string(), current.first.to_string()) + }); if (repair) repairPath(i); else errors = true; } else { @@ -1304,7 +1317,7 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) /* It's possible that the path got GC'ed, so ignore errors on invalid paths. */ if (isValidPath(i)) - printError("error: %s", e.msg()); + logError(e.info()); else warn(e.msg()); errors = true; @@ -1324,7 +1337,11 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store, if (!done.insert(pathS).second) return; if (!isStorePath(pathS)) { - printError("path '%s' is not in the Nix store", pathS); + logError( + ErrorInfo { + .name = "Nix path not found", + .hint = hintfmt("path '%s' is not in the Nix store", pathS) + }); return; } @@ -1347,12 +1364,17 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store, auto state(_state.lock()); invalidatePath(*state, path); } else { - printError("path '%s' disappeared, but it still has valid referrers!", pathS); + // TODO log as warning if repair successful?? + logError( + ErrorInfo { + .name = "Missing path with referrers", + .hint = hintfmt("path '%s' disappeared, but it still has valid referrers!", pathS) + }); if (repair) try { repairPath(path); } catch (Error & e) { - warn(e.msg()); + logWarning(e.info()); errors = true; } else errors = true; diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc index f9cf2bb6b..9f6112183 100644 --- a/src/libstore/optimise-store.cc +++ b/src/libstore/optimise-store.cc @@ -130,7 +130,11 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, NixOS (example: $fontconfig/var/cache being modified). Skip those files. FIXME: check the modification time. */ if (S_ISREG(st.st_mode) && (st.st_mode & S_IWUSR)) { - printError("skipping suspicious writable file '%1%'", path); + logWarning( + ErrorInfo { + .name = "Suspicious File", + .hint = hintfmt("skipping suspicious writable file '%1%'", path) + }); return; } @@ -194,7 +198,11 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, } if (st.st_size != stLink.st_size) { - printError("removing corrupted link '%1%'", linkPath); + logWarning( + ErrorInfo { + .name = "Corrupted Link", + .hint = hintfmt("removing corrupted link '%1%'", linkPath) + }); unlink(linkPath.c_str()); goto retry; } @@ -229,7 +237,11 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, /* Atomically replace the old file with the new hard link. */ if (rename(tempLink.c_str(), path.c_str()) == -1) { if (unlink(tempLink.c_str()) == -1) - printError("unable to unlink '%1%'", tempLink); + logError( + ErrorInfo { + .name = "Unlink error", + .hint = hintfmt("unable to unlink '%1%'", tempLink) + }); if (errno == EMLINK) { /* Some filesystems generate too many links on the rename, rather than on the original link. (Probably it diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index cc336e460..7c50c1065 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -780,6 +780,15 @@ std::exception_ptr RemoteStore::Connection::processStderr(Sink * sink, Source * } else if (msg == STDERR_NEXT) + // TODO: is this really an ErrorInfo error? Seems like we're forwarding the + // stderr output of the remote to current stderr/log + // ErrorInfo gets lost in this scenario. + // An alternative might be a logger on the remote that forwards ErrorInfo and etc. + // logError( + // ErrorInfo { + // // .name = "Remote Store" TODO reasonable name. + // .hint = hintfmt(chomp(readString(from))) + // }); printError(chomp(readString(from))); else if (msg == STDERR_START_ACTIVITY) { diff --git a/src/libstore/sqlite.cc b/src/libstore/sqlite.cc index a72cd5d88..082c54005 100644 --- a/src/libstore/sqlite.cc +++ b/src/libstore/sqlite.cc @@ -204,7 +204,10 @@ void handleSQLiteBusy(SQLiteBusy & e) if (now > lastWarned + 10) { lastWarned = now; - printError("warning: %s", e.what()); + logWarning( + ErrorInfo { .name = "sqlite busy", + .hint = hintfmt(e.what()) + }); } /* Sleep for a while since retrying the transaction right away From ab6f0b9641ad6e9cef72f73d23e31138a97a225b Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sun, 3 May 2020 08:01:25 -0600 Subject: [PATCH 022/120] convert some printError calls to logError --- src/build-remote/build-remote.cc | 8 +- src/libexpr/parser.y | 15 ++- src/libmain/shared.cc | 10 +- src/libstore/build.cc | 97 ++++++++++++++----- src/libstore/pathlocks.cc | 3 +- src/libstore/s3-binary-cache-store.cc | 4 +- src/libstore/store-api.cc | 2 +- src/libutil/affinity.cc | 4 +- src/libutil/error.hh | 6 ++ src/libutil/logging.hh | 1 + src/libutil/util.cc | 18 ++-- src/nix-build/nix-build.cc | 2 + src/nix-daemon/nix-daemon.cc | 3 +- src/nix-env/nix-env.cc | 23 ++++- src/nix-env/user-env.cc | 2 +- src/nix-store/nix-store.cc | 15 ++- src/nix/upgrade-nix.cc | 8 +- src/nix/verify.cc | 20 +++- .../resolve-system-dependencies.cc | 24 ++++- 19 files changed, 195 insertions(+), 70 deletions(-) diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc index 00340b787..0d6859596 100644 --- a/src/build-remote/build-remote.cc +++ b/src/build-remote/build-remote.cc @@ -200,9 +200,13 @@ static int _main(int argc, char * * argv) } catch (std::exception & e) { auto msg = chomp(drainFD(5, false)); - printError("cannot build on '%s': %s%s", + logError( + ErrorInfo { + .name = "remote build", + .hint = hintfmt("cannot build on '%s': %s%s", bestMachine->storeUri, e.what(), - (msg.empty() ? "" : ": " + msg)); + (msg.empty() ? "" : ": " + msg)) + }); bestMachine->enabled = false; continue; } diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 3767532d5..3ed9a7a4f 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -689,8 +689,12 @@ std::pair EvalState::resolveSearchPathElem(const SearchPathEl request.unpack = true; res = { true, getDownloader()->downloadCached(store, request).path }; } catch (DownloadError & e) { - // TODO: change to warn()? - printError("warning: Nix search path entry '%1%' cannot be downloaded, ignoring", elem.second); + logWarning( + ErrorInfo { + .name = "Download Error", + .hint = hintfmt("warning: Nix search path entry '%1%' cannot be downloaded, ignoring", elem.second) + }); + res = { false, "" }; } } else { @@ -698,8 +702,11 @@ std::pair EvalState::resolveSearchPathElem(const SearchPathEl if (pathExists(path)) res = { true, path }; else { - // TODO: change to warn()? - printError("warning: Nix search path entry '%1%' does not exist, ignoring", elem.second); + logWarning( + ErrorInfo { + .name = "Search path not found", + .hint = hintfmt("warning: Nix search path entry '%1%' does not exist, ignoring", elem.second) + }); res = { false, "" }; } } diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 8551eb048..5773d90cc 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -300,21 +300,21 @@ int handleExceptions(const string & programName, std::function fun) } catch (UsageError & e) { // TODO: switch to logError // logError(e.info()); - printError( + _printError( format("%1%\nTry '%2% --help' for more information.") % e.what() % programName); return 1; } catch (BaseError & e) { // logError(e.info()); - printError("%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); + _printError("%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); if (e.prefix() != "" && !settings.showTrace) - printError("(use '--show-trace' to show detailed location information)"); + _printError("(use '--show-trace' to show detailed location information)"); return e.status; } catch (std::bad_alloc & e) { - printError(error + "out of memory"); + _printError(error + "out of memory"); return 1; } catch (std::exception & e) { - printError(error + e.what()); + _printError(error + e.what()); return 1; } diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 2301adb16..bacbd5808 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -493,7 +493,9 @@ void handleDiffHook( if (diffRes.second != "") printError(chomp(diffRes.second)); } catch (Error & error) { - printError("diff hook execution failed: %s", error.what()); + // logError(error.info()) + // TODO append message onto errorinfo... + _printError("diff hook execution failed: %s", error.what()); } } } @@ -1144,7 +1146,11 @@ void DerivationGoal::loadDerivation() trace("loading derivation"); if (nrFailed != 0) { - printError("cannot build missing derivation '%s'", worker.store.printStorePath(drvPath)); + logError( + ErrorInfo { + .name = "missing derivation during build", + .hint = hintfmt("cannot build missing derivation '%s'", worker.store.printStorePath(drvPath)) + }); done(BuildResult::MiscFailure); return; } @@ -1295,8 +1301,14 @@ void DerivationGoal::repairClosure() /* Check each path (slow!). */ for (auto & i : outputClosure) { if (worker.pathContentsGood(i)) continue; - printError("found corrupted or missing path '%s' in the output closure of '%s'", - worker.store.printStorePath(i), worker.store.printStorePath(drvPath)); + logError( + ErrorInfo { + .name = "Corrupt path in closure", + .hint = hintfmt( + "found corrupted or missing path '%s' in the output closure of '%s'", + worker.store.printStorePath(i), worker.store.printStorePath(drvPath)) + }); + auto drvPath2 = outputsToDrv.find(i); if (drvPath2 == outputsToDrv.end()) addWaitee(worker.makeSubstitutionGoal(i, Repair)); @@ -1330,8 +1342,13 @@ void DerivationGoal::inputsRealised() if (nrFailed != 0) { if (!useDerivation) throw Error("some dependencies of '%s' are missing", worker.store.printStorePath(drvPath)); - printError("cannot build derivation '%s': %s dependencies couldn't be built", - worker.store.printStorePath(drvPath), nrFailed); + logError( + ErrorInfo { + .name = "Dependencies could not be built", + .hint = hintfmt( + "cannot build derivation '%s': %s dependencies couldn't be built", + worker.store.printStorePath(drvPath), nrFailed) + }); done(BuildResult::DependencyFailed); return; } @@ -1489,7 +1506,7 @@ void DerivationGoal::tryToBuild() startBuilder(); } catch (BuildError & e) { - printError(e.msg()); + logError(e.info()); outputLocks.unlock(); buildUser.reset(); worker.permanentFailure = true; @@ -1709,7 +1726,7 @@ void DerivationGoal::buildDone() outputLocks.unlock(); } catch (BuildError & e) { - printError(e.msg()); + logError(e.info()); outputLocks.unlock(); @@ -1788,8 +1805,13 @@ HookReply DerivationGoal::tryBuildHook() } catch (SysError & e) { if (e.errNo == EPIPE) { - printError("build hook died unexpectedly: %s", - chomp(drainFD(worker.hook->fromHook.readSide.get()))); + logError( + ErrorInfo { + .name = "Build hook died", + .hint = hintfmt( + "build hook died unexpectedly: %s", + chomp(drainFD(worker.hook->fromHook.readSide.get()))) + }); worker.hook = 0; return rpDecline; } else @@ -3783,10 +3805,10 @@ void DerivationGoal::registerOutputs() result.isNonDeterministic = true; Path prev = worker.store.printStorePath(i->second.path) + checkSuffix; bool prevExists = keepPreviousRound && pathExists(prev); - auto msg = prevExists - ? fmt("output '%s' of '%s' differs from '%s' from previous round", + hintformat hint = prevExists + ? hintfmt("output '%s' of '%s' differs from '%s' from previous round", worker.store.printStorePath(i->second.path), worker.store.printStorePath(drvPath), prev) - : fmt("output '%s' of '%s' differs from previous round", + : hintfmt("output '%s' of '%s' differs from previous round", worker.store.printStorePath(i->second.path), worker.store.printStorePath(drvPath)); handleDiffHook( @@ -3796,9 +3818,15 @@ void DerivationGoal::registerOutputs() worker.store.printStorePath(drvPath), tmpDir); if (settings.enforceDeterminism) - throw NotDeterministic(msg); + throw NotDeterministic(hint); + + logError( + ErrorInfo { + .name = "Output determinism error", + .hint = hint + }); + - printError(msg); curRound = nrRounds; // we know enough, bail out early } } @@ -4060,9 +4088,13 @@ void DerivationGoal::handleChildOutput(int fd, const string & data) { logSize += data.size(); if (settings.maxLogSize && logSize > settings.maxLogSize) { - printError( - format("%1% killed after writing more than %2% bytes of log output") - % getName() % settings.maxLogSize); + logError( + ErrorInfo { + .name = "Max log size exceeded", + .hint = hintfmt( + "%1% killed after writing more than %2% bytes of log output", + getName(), settings.maxLogSize) + }); killChild(); done(BuildResult::LogLimitExceeded); return; @@ -4352,7 +4384,7 @@ void SubstitutionGoal::tryNext() throw; } catch (Error & e) { if (settings.tryFallback) { - printError(e.what()); + logError(e.info()); tryNext(); return; } @@ -4864,9 +4896,13 @@ void Worker::waitForInput() j->respectTimeouts && after - j->lastOutput >= std::chrono::seconds(settings.maxSilentTime)) { - printError( - format("%1% timed out after %2% seconds of silence") - % goal->getName() % settings.maxSilentTime); + logError( + ErrorInfo { + .name = "Silent build timeout", + .hint = hintfmt( + "%1% timed out after %2% seconds of silence", + goal->getName(), settings.maxSilentTime) + }); goal->timedOut(); } @@ -4875,9 +4911,13 @@ void Worker::waitForInput() j->respectTimeouts && after - j->timeStarted >= std::chrono::seconds(settings.buildTimeout)) { - printError( - format("%1% timed out after %2% seconds") - % goal->getName() % settings.buildTimeout); + logError( + ErrorInfo { + .name = "Build timeout", + .hint = hintfmt( + "%1% timed out after %2% seconds", + goal->getName(), settings.buildTimeout) + }); goal->timedOut(); } } @@ -4939,7 +4979,12 @@ bool Worker::pathContentsGood(const StorePath & path) res = info->narHash == nullHash || info->narHash == current.first; } pathContentsGoodCache.insert_or_assign(path.clone(), res); - if (!res) printError("path '%s' is corrupted or missing!", store.printStorePath(path)); + if (!res) + logError( + ErrorInfo { + .name = "Corrupted path", + .hint = hintfmt("path '%s' is corrupted or missing!", store.printStorePath(path)) + }); return res; } diff --git a/src/libstore/pathlocks.cc b/src/libstore/pathlocks.cc index 52d430ffd..926f4ea1e 100644 --- a/src/libstore/pathlocks.cc +++ b/src/libstore/pathlocks.cc @@ -160,7 +160,8 @@ void PathLocks::unlock() if (close(i.first) == -1) printError( - format("error (ignored): cannot close lock file on '%1%'") % i.second); + "error (ignored): cannot close lock file on '%1%'", + i.second); debug(format("lock released on '%1%'") % i.second); } diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc index 0326821f6..3175eb69b 100644 --- a/src/libstore/s3-binary-cache-store.cc +++ b/src/libstore/s3-binary-cache-store.cc @@ -111,7 +111,9 @@ class RetryStrategy : public Aws::Client::DefaultRetryStrategy auto retry = Aws::Client::DefaultRetryStrategy::ShouldRetry(error, attemptedRetries); if (retry) printError("AWS error '%s' (%s), will retry in %d ms", - error.GetExceptionName(), error.GetMessage(), CalculateDelayBeforeNextRetry(error, attemptedRetries)); + error.GetExceptionName(), + error.GetMessage(), + CalculateDelayBeforeNextRetry(error, attemptedRetries)); return retry; } }; diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index a04d5013e..542e5c552 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -961,7 +961,7 @@ std::list> getDefaultSubstituters() try { stores.push_back(openStore(uri)); } catch (Error & e) { - printError("warning: %s", e.what()); + logWarning(e.info()); } }; diff --git a/src/libutil/affinity.cc b/src/libutil/affinity.cc index 98f8287ad..e3cf33b58 100644 --- a/src/libutil/affinity.cc +++ b/src/libutil/affinity.cc @@ -25,7 +25,7 @@ void setAffinityTo(int cpu) CPU_ZERO(&newAffinity); CPU_SET(cpu, &newAffinity); if (sched_setaffinity(0, sizeof(cpu_set_t), &newAffinity) == -1) - printError(format("failed to lock thread to CPU %1%") % cpu); + printError("failed to lock thread to CPU %1%", cpu); #endif } @@ -47,7 +47,7 @@ void restoreAffinity() #if __linux__ if (!didSaveAffinity) return; if (sched_setaffinity(0, sizeof(cpu_set_t), &savedAffinity) == -1) - printError("failed to restore affinity %1%"); + _printError("failed to restore affinity"); #endif } diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 48e6311bd..86cff5609 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -117,6 +117,12 @@ public: } { } + BaseError(hintformat hint) + : err { .level = lvlError, + .hint = hint + } + { } + BaseError(ErrorInfo e) : err(e) { } diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 0c4980b83..5f03cdf41 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -149,6 +149,7 @@ extern Verbosity verbosity; /* suppress msgs > this */ } \ } while (0) +#define _printError(args...) printMsg(lvlError, args) #define printError(args...) printMsg(lvlError, args) #define printInfo(args...) printMsg(lvlInfo, args) #define printTalkative(args...) printMsg(lvlTalkative, args) diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 747a9e991..68dc1b738 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -1417,15 +1417,15 @@ string base64Decode(const string & s) } -void callFailure(const std::function & failure, std::exception_ptr exc) -{ - try { - failure(exc); - } catch (std::exception & e) { - printError("uncaught exception: %s", e.what()); - abort(); - } -} +// void callFailure(const std::function & failure, std::exception_ptr exc) +// { +// try { +// failure(exc); +// } catch (std::exception & e) { +// printError("uncaught exception: %s", e.what()); +// abort(); +// } +// } static Sync> windowSize{{0, 0}}; diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc index 0a058a31b..401c8d340 100755 --- a/src/nix-build/nix-build.cc +++ b/src/nix-build/nix-build.cc @@ -368,6 +368,8 @@ static void _main(int argc, char * * argv) shell = drv->queryOutPath() + "/bin/bash"; } catch (Error & e) { + // TODO: append error msg + logError(e.info()); printError("warning: %s; will use bash from your environment", e.what()); shell = "bash"; } diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc index 5f78ab464..3cd2c3a6b 100644 --- a/src/nix-daemon/nix-daemon.cc +++ b/src/nix-daemon/nix-daemon.cc @@ -247,7 +247,8 @@ static void daemonLoop(char * * argv) } catch (Interrupted & e) { return; } catch (Error & e) { - printError("error processing connection: %1%", e.msg()); + // TODO append error message + _printError("error processing connection: %1%", e.msg()); } } } diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index dde8875f1..76008d00c 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -123,7 +123,11 @@ static void getAllExprs(EvalState & state, if (hasSuffix(attrName, ".nix")) attrName = string(attrName, 0, attrName.size() - 4); if (!attrs.insert(attrName).second) { - printError(format("warning: name collision in input Nix expressions, skipping '%1%'") % path2); + logError( + ErrorInfo { + .name = "Name collision", + .hint = hintfmt("warning: name collision in input Nix expressions, skipping '%1%'", path2) + }); continue; } /* Load the expression on demand. */ @@ -860,7 +864,12 @@ static void queryJSON(Globals & globals, vector & elems) auto placeholder = metaObj.placeholder(j); Value * v = i.queryMeta(j); if (!v) { - printError("derivation '%s' has invalid meta attribute '%s'", i.queryName(), j); + logError( + ErrorInfo { + .name = "Invalid meta attribute", + .hint = hintfmt("derivation '%s' has invalid meta attribute '%s'", + i.queryName(), j) + }); placeholder.write(nullptr); } else { PathSet context; @@ -1110,8 +1119,14 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs) XMLAttrs attrs2; attrs2["name"] = j; Value * v = i.queryMeta(j); - if (!v) - printError("derivation '%s' has invalid meta attribute '%s'", i.queryName(), j); + if (!v) + logError( + ErrorInfo { + .name = "Invalid meta attribute", + .hint = hintfmt( + "derivation '%s' has invalid meta attribute '%s'", + i.queryName(), j) + }); else { if (v->type == tString) { attrs2["type"] = "string"; diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc index f852916d8..2484b9759 100644 --- a/src/nix-env/user-env.cc +++ b/src/nix-env/user-env.cc @@ -146,7 +146,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, Path lockTokenCur = optimisticLockProfile(profile); if (lockToken != lockTokenCur) { - printError(format("profile '%1%' changed while we were busy; restarting") % profile); + printError("profile '%1%' changed while we were busy; restarting", profile); return false; } diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 1e8a88a7b..2e2276b4a 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -726,9 +726,15 @@ static void opVerifyPath(Strings opFlags, Strings opArgs) store->narFromPath(path, sink); auto current = sink.finish(); if (current.first != info->narHash) { - printError( - "path '%s' was modified! expected hash '%s', got '%s'", - store->printStorePath(path), info->narHash.to_string(), current.first.to_string()); + logError( + ErrorInfo { + .name = "Hash match error", + .hint = hintfmt( + "path '%s' was modified! expected hash '%s', got '%s'", + store->printStorePath(path), + info->narHash.to_string(), + current.first.to_string()) + }); status = 1; } } @@ -835,7 +841,8 @@ static void opServe(Strings opFlags, Strings opArgs) for (auto & p : willSubstitute) subs.emplace_back(p.clone()); store->buildPaths(subs); } catch (Error & e) { - printError("warning: %1%", e.msg()); + // logWarning(e.info()) TODO: + _printError("warning: %1%", e.msg()); } } diff --git a/src/nix/upgrade-nix.cc b/src/nix/upgrade-nix.cc index c05c29517..8f4e529bc 100644 --- a/src/nix/upgrade-nix.cc +++ b/src/nix/upgrade-nix.cc @@ -64,7 +64,13 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand if (dryRun) { stopProgressBar(); - printError("would upgrade to version %s", version); + // TODO change to info? + logWarning( + ErrorInfo { + .name = "Version update", + .hint = hintfmt("would upgrade to version %s", version) + }); + // printError("would upgrade to version %s", version); return; } diff --git a/src/nix/verify.cc b/src/nix/verify.cc index 6e043dc2d..f53217239 100644 --- a/src/nix/verify.cc +++ b/src/nix/verify.cc @@ -97,9 +97,15 @@ struct CmdVerify : StorePathsCommand if (hash.first != info->narHash) { corrupted++; act2.result(resCorruptedPath, store->printStorePath(info->path)); - printError( - "path '%s' was modified! expected hash '%s', got '%s'", - store->printStorePath(info->path), info->narHash.to_string(), hash.first.to_string()); + logError( + ErrorInfo { + .name = "Hash error - path modified", + .hint = hintfmt( + "path '%s' was modified! expected hash '%s', got '%s'", + store->printStorePath(info->path), + info->narHash.to_string(), + hash.first.to_string()) + }); } } @@ -148,7 +154,13 @@ struct CmdVerify : StorePathsCommand if (!good) { untrusted++; act2.result(resUntrustedPath, store->printStorePath(info->path)); - printError("path '%s' is untrusted", store->printStorePath(info->path)); + logError( + ErrorInfo { + .name = "Untrusted path", + .hint = hintfmt("path '%s' is untrusted", + store->printStorePath(info->path)) + }); + } } diff --git a/src/resolve-system-dependencies/resolve-system-dependencies.cc b/src/resolve-system-dependencies/resolve-system-dependencies.cc index 8f0c99c84..dcea72529 100644 --- a/src/resolve-system-dependencies/resolve-system-dependencies.cc +++ b/src/resolve-system-dependencies/resolve-system-dependencies.cc @@ -39,12 +39,20 @@ std::set runResolver(const Path & filename) throw SysError("statting '%s'", filename); if (!S_ISREG(st.st_mode)) { - printError("file '%s' is not a regular file", filename); + logError( + ErrorInfo { + .name = "Regular MACH file", + .hint = hintfmt("file '%s' is not a regular file", filename) + }); return {}; } if (st.st_size < sizeof(mach_header_64)) { - printError("file '%s' is too short for a MACH binary", filename); + logError( + ErrorInfo { + .name = "File too short", + .hint = hintfmt("file '%s' is too short for a MACH binary", filename) + }); return {}; } @@ -66,13 +74,21 @@ std::set runResolver(const Path & filename) } } if (mach64_offset == 0) { - printError(format("Could not find any mach64 blobs in file '%1%', continuing...") % filename); + logError( + ErrorInfo { + .name = "No mach64 blobs", + .hint = hintfmt("Could not find any mach64 blobs in file '%1%', continuing...", filename) + }); return {}; } } else if (magic == MH_MAGIC_64 || magic == MH_CIGAM_64) { mach64_offset = 0; } else { - printError(format("Object file has unknown magic number '%1%', skipping it...") % magic); + logError( + ErrorInfo { + .name = "Magic number", + .hint = hintfmt("Object file has unknown magic number '%1%', skipping it...", magic) + }); return {}; } From c05f0e3093d4fa4ea9b07b038099ff9555258717 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 4 May 2020 12:28:28 -0600 Subject: [PATCH 023/120] closer but still lambda indent problems --- .uncrustify.cfg | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.uncrustify.cfg b/.uncrustify.cfg index b28935dcc..6bf91ec3c 100644 --- a/.uncrustify.cfg +++ b/.uncrustify.cfg @@ -1041,14 +1041,14 @@ indent_else_if = false # true/false indent_var_def_blk = 0 # number # Whether to indent continued variable declarations instead of aligning. -indent_var_def_cont = false # true/false +indent_var_def_cont = true # true/false # Whether to indent continued shift expressions ('<<' and '>>') instead of # aligning. Set align_left_shift=false when enabling this. indent_shift = false # true/false # Whether to force indentation of function definitions to start in column 1. -indent_func_def_force_col1 = false # true/false +indent_func_def_force_col1 = true # true/false # Whether to indent continued function call parameters one indent level, # rather than aligning parameters under the open parenthesis. @@ -1118,7 +1118,7 @@ indent_sing_line_comments = 0 # unsigned number indent_relative_single_line_comments = false # true/false # Spaces to indent 'case' from 'switch'. Usually 0 or indent_columns. -indent_switch_case = 0 # unsigned number +indent_switch_case = indent_columns # unsigned number # indent 'break' with 'case' from 'switch'. indent_switch_break_with_case = false # true/false @@ -1217,13 +1217,13 @@ indent_preserve_sql = false # true/false # followed by a newline, the next line is indent one tab. # # Default: true -indent_align_assign = true # true/false +indent_align_assign = false # true/false # Whether to align continued statements at the '('. If false or the '(' is # followed by a newline, the next line indent is one tab. # # Default: true -indent_align_paren = true # true/false +indent_align_paren = true # true/false, # (OC) Whether to indent Objective-C blocks at brace level instead of usual # rules. @@ -1299,7 +1299,8 @@ indent_ternary_operator = 0 # unsigned number # If true, the indentation of the chunks after a `return new` sequence will be set at return indentation column. indent_off_after_return_new = false # true/false -# If true, the tokens after return are indented with regular single indentation. By default (false) the indentation is after the return token. +# If true, the tokens after return are indented with regular single indentation. +# By default (false) the indentation is after the return token. indent_single_after_return = false # true/false # Whether to ignore indent and alignment for 'asm' blocks (i.e. assume they @@ -2902,7 +2903,7 @@ use_indent_continue_only_once = false # true/false # # true: indentation will be used only once # false: indentation will be used every time (default) -indent_cpp_lambda_only_once = false # true/false +indent_cpp_lambda_only_once = true # true/false # Whether sp_after_angle takes precedence over sp_inside_fparen. This was the # historic behavior, but is probably not the desired behavior, so this is off From 9c5ece44a7f32784dd5e2ea0faf110054f9233a8 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 4 May 2020 13:46:15 -0600 Subject: [PATCH 024/120] separate msgs instead of appending to what() --- src/libmain/shared.cc | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 5773d90cc..db1e0ba1d 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -298,23 +298,21 @@ int handleExceptions(const string & programName, std::function fun) } catch (Exit & e) { return e.status; } catch (UsageError & e) { - // TODO: switch to logError - // logError(e.info()); - _printError( - format("%1%\nTry '%2% --help' for more information.") - % e.what() % programName); + logError(e.info()); + printError("Try '%1% --help' for more information.", programName); return 1; } catch (BaseError & e) { - // logError(e.info()); - _printError("%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg()); + if (settings.showTrace && e.prefix() != "") + printError(e.prefix()); + logError(e.info()); if (e.prefix() != "" && !settings.showTrace) - _printError("(use '--show-trace' to show detailed location information)"); + printError("(use '--show-trace' to show detailed location information)"); return e.status; } catch (std::bad_alloc & e) { - _printError(error + "out of memory"); + printError(error + "out of memory"); return 1; } catch (std::exception & e) { - _printError(error + e.what()); + printError(error + e.what()); return 1; } From afaa541013549c254f9c54e0865dc254973eea96 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 4 May 2020 14:44:00 -0600 Subject: [PATCH 025/120] affinity operator<< --- src/libutil/affinity.cc | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/libutil/affinity.cc b/src/libutil/affinity.cc index e3cf33b58..ac2295e4a 100644 --- a/src/libutil/affinity.cc +++ b/src/libutil/affinity.cc @@ -12,6 +12,17 @@ namespace nix { #if __linux__ static bool didSaveAffinity = false; static cpu_set_t savedAffinity; + +std::ostream& operator<<(std::ostream &os, const cpu_set_t &cset) +{ + auto count = CPU_COUNT(&cset); + for (int i=0; i < count; ++i) + { + os << (CPU_ISSET(i,&cset) ? "1" : "0"); + } + + return os; +} #endif @@ -47,7 +58,11 @@ void restoreAffinity() #if __linux__ if (!didSaveAffinity) return; if (sched_setaffinity(0, sizeof(cpu_set_t), &savedAffinity) == -1) - _printError("failed to restore affinity"); + { + std::ostringstream oss; + oss << savedAffinity; + printError("failed to restore CPU affinity %1%", oss.str()); + } #endif } From 8c8f2b74ec3fe37f8661c8411749965b6e8d44d2 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 4 May 2020 14:44:42 -0600 Subject: [PATCH 026/120] log as warning --- src/nix-store/nix-store.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 2e2276b4a..57063d42f 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -841,8 +841,7 @@ static void opServe(Strings opFlags, Strings opArgs) for (auto & p : willSubstitute) subs.emplace_back(p.clone()); store->buildPaths(subs); } catch (Error & e) { - // logWarning(e.info()) TODO: - _printError("warning: %1%", e.msg()); + logWarning(e.info()); } } From f30de61578edd9c19744256985185045e7baab84 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 4 May 2020 16:19:20 -0600 Subject: [PATCH 027/120] add normaltxt, yellowify->yellowtxt --- src/libutil/fmt.hh | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/libutil/fmt.hh b/src/libutil/fmt.hh index d182adc3a..bfacfeb4d 100644 --- a/src/libutil/fmt.hh +++ b/src/libutil/fmt.hh @@ -73,18 +73,31 @@ inline std::string fmt(const std::string & fs, const Args & ... args) // are always in yellow. template -struct yellowify +struct yellowtxt { - yellowify(T &s) : value(s) {} + yellowtxt(T &s) : value(s) {} T &value; }; template -std::ostream& operator<<(std::ostream &out, const yellowify &y) +std::ostream& operator<<(std::ostream &out, const yellowtxt &y) { return out << ANSI_YELLOW << y.value << ANSI_NORMAL; } +template +struct normaltxt +{ + normaltxt(T &s) : value(s) {} + T &value; +}; + +template +std::ostream& operator<<(std::ostream &out, const normaltxt &y) +{ + return out << ANSI_NORMAL << y.value; +} + class hintformat { public: @@ -100,7 +113,7 @@ public: template hintformat& operator%(const T &value) { - fmt % yellowify(value); + fmt % yellowtxt(value); return *this; } From 7ffb5efdbc943851d2ee9d0573dca3e96b9bd742 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 4 May 2020 16:19:57 -0600 Subject: [PATCH 028/120] appending to hints; remove _printError --- src/error-demo/error-demo.cc | 7 +++++-- src/libstore/build.cc | 12 ++++++++---- src/libutil/logging.hh | 1 - src/nix-daemon/nix-daemon.cc | 7 +++++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 514258416..82b03d71b 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -26,10 +26,13 @@ int main() // ErrorInfo constructor try { - auto e = Error("generic error"); + auto e = Error("some error"); throw DemoError(e.info()); } catch (Error &e) { - logger->logEI(e.info()); + ErrorInfo ei = e.info(); + string prevhint = (e.info().hint.has_value() ? e.info().hint->str() : ""); + ei.hint = std::optional(hintfmt("previous hint was: %s", normaltxt(prevhint))); + logger->logEI(ei); } diff --git a/src/libstore/build.cc b/src/libstore/build.cc index bacbd5808..f8cc1ce36 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -488,14 +488,18 @@ void handleDiffHook( auto diffRes = runProgram(diffHookOptions); if (!statusOk(diffRes.first)) - throw ExecError(diffRes.first, "diff-hook program '%1%' %2%", diffHook, statusToString(diffRes.first)); + throw ExecError(diffRes.first, + "diff-hook program '%1%' %2%", + diffHook, + statusToString(diffRes.first)); if (diffRes.second != "") printError(chomp(diffRes.second)); } catch (Error & error) { - // logError(error.info()) - // TODO append message onto errorinfo... - _printError("diff hook execution failed: %s", error.what()); + ErrorInfo ei = error.info(); + string prevhint = (error.info().hint.has_value() ? error.info().hint->str() : ""); + ei.hint = std::optional(hintfmt("diff hook execution failed: %s", prevhint)); + logError(ei); } } } diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 5f03cdf41..0c4980b83 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -149,7 +149,6 @@ extern Verbosity verbosity; /* suppress msgs > this */ } \ } while (0) -#define _printError(args...) printMsg(lvlError, args) #define printError(args...) printMsg(lvlError, args) #define printInfo(args...) printMsg(lvlInfo, args) #define printTalkative(args...) printMsg(lvlTalkative, args) diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc index 3cd2c3a6b..5336db136 100644 --- a/src/nix-daemon/nix-daemon.cc +++ b/src/nix-daemon/nix-daemon.cc @@ -246,9 +246,12 @@ static void daemonLoop(char * * argv) } catch (Interrupted & e) { return; - } catch (Error & e) { + } catch (Error & error) { // TODO append error message - _printError("error processing connection: %1%", e.msg()); + ErrorInfo ei = error.info(); + string prevhint = (error.info().hint.has_value() ? error.info().hint->str() : ""); + ei.hint = std::optional(hintfmt("error processing connection: %1%", prevhint)); + logError(ei); } } } From e76ad2e48a71aa9804311f4dfb34374a5295b3b6 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 6 May 2020 14:07:20 -0600 Subject: [PATCH 029/120] implement SysError errno handling --- src/error-demo/error-demo.cc | 8 ++++++++ src/libutil/error.cc | 8 -------- src/libutil/error.hh | 13 +++++++------ src/libutil/fmt.hh | 8 ++++---- src/libutil/util.cc | 3 ++- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 82b03d71b..b1b313e32 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -35,6 +35,14 @@ int main() logger->logEI(ei); } + // SysError; picks up errno + try { + auto x = readFile(-1); + } + catch (Error &e) { + std::cout << "error: " << e.sname() << std::endl; + logError(e.info()); + } // For completeness sake, info through vomit levels. // But this is maybe a heavy format for those. diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 91fa1ccd8..d4305ddd8 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -16,14 +16,6 @@ BaseError & BaseError::addPrefix(const FormatOrString & fs) return *this; } - -std::string SysError::addErrno(const std::string & s) -{ - errNo = errno; - return s + ": " + strerror(errNo); -} - - std::optional ErrorInfo::programName = std::nullopt; std::ostream& operator<<(std::ostream &os, const hintformat &hf) diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 86cff5609..2155ad344 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -160,13 +160,14 @@ public: template SysError(const Args & ... args) - : Error(args...) // TODO addErrNo for hintfmt - // : Error(addErrno(hintfmt(args...))) - { } + :Error("") + { + errNo = errno; + auto hf = hintfmt(args...); + err.hint = hintfmt("%1% : %2%", normaltxt(hf.str()), strerror(errNo)); + } -private: - - std::string addErrno(const std::string & s); + virtual const char* sname() const override { return "SysError"; } }; } diff --git a/src/libutil/fmt.hh b/src/libutil/fmt.hh index bfacfeb4d..12ab9c407 100644 --- a/src/libutil/fmt.hh +++ b/src/libutil/fmt.hh @@ -75,8 +75,8 @@ inline std::string fmt(const std::string & fs, const Args & ... args) template struct yellowtxt { - yellowtxt(T &s) : value(s) {} - T &value; + yellowtxt(const T &s) : value(s) {} + const T &value; }; template @@ -88,8 +88,8 @@ std::ostream& operator<<(std::ostream &out, const yellowtxt &y) template struct normaltxt { - normaltxt(T &s) : value(s) {} - T &value; + normaltxt(const T &s) : value(s) {} + const T &value; }; template diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 68dc1b738..e8f22ab71 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -312,7 +312,8 @@ string readFile(const Path & path, bool drain) void readFile(const Path & path, Sink & sink) { AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); - if (!fd) throw SysError("opening file '%s'", path); + if (!fd) + throw SysError("opening file '%s'", path); drainFD(fd.get(), sink); } From e3901638b50d91ddc9c356adc35ded00a00fe94b Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 6 May 2020 15:01:13 -0600 Subject: [PATCH 030/120] todo removal --- src/error-demo/error-demo.cc | 1 - src/libstore/gc.cc | 1 - src/nix-daemon/nix-daemon.cc | 1 - src/nix/upgrade-nix.cc | 2 -- 4 files changed, 5 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index b1b313e32..0d3dcf616 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -23,7 +23,6 @@ int main() logger->logEI(e.info()); } - // ErrorInfo constructor try { auto e = Error("some error"); diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 4f6f78a99..629c4360c 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -41,7 +41,6 @@ AutoCloseFD LocalStore::openGCLock(LockType lockType) throw SysError("opening global GC lock '%1%'", fnGCLock); if (!lockFile(fdGCLock.get(), lockType, false)) { - // TODO: info? printError("waiting for the big garbage collector lock..."); lockFile(fdGCLock.get(), lockType, true); } diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc index 5336db136..731ab22e5 100644 --- a/src/nix-daemon/nix-daemon.cc +++ b/src/nix-daemon/nix-daemon.cc @@ -247,7 +247,6 @@ static void daemonLoop(char * * argv) } catch (Interrupted & e) { return; } catch (Error & error) { - // TODO append error message ErrorInfo ei = error.info(); string prevhint = (error.info().hint.has_value() ? error.info().hint->str() : ""); ei.hint = std::optional(hintfmt("error processing connection: %1%", prevhint)); diff --git a/src/nix/upgrade-nix.cc b/src/nix/upgrade-nix.cc index 8f4e529bc..831a83fd1 100644 --- a/src/nix/upgrade-nix.cc +++ b/src/nix/upgrade-nix.cc @@ -64,13 +64,11 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand if (dryRun) { stopProgressBar(); - // TODO change to info? logWarning( ErrorInfo { .name = "Version update", .hint = hintfmt("would upgrade to version %s", version) }); - // printError("would upgrade to version %s", version); return; } From 1b801cec407454b904466153dfc56cec6b433f4b Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 7 May 2020 16:43:36 -0600 Subject: [PATCH 031/120] pretending to be const --- src/error-demo/error-demo.cc | 16 ++++++++++++++++ src/libutil/error.hh | 12 ++++++------ src/nix-build/nix-build.cc | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 0d3dcf616..89ba5a78d 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -43,6 +43,22 @@ int main() logError(e.info()); } + // current exception + try { + throw DemoError("DemoError handled as a %1%", "std::exception"); + } + catch (...) { + const std::exception_ptr &eptr = std::current_exception(); + try + { + std::rethrow_exception(eptr); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + } + } + // For completeness sake, info through vomit levels. // But this is maybe a heavy format for those. logger->logEI( diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 2155ad344..19a806cc1 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -82,10 +82,10 @@ class BaseError : public std::exception { protected: string prefix_; // used for location traces etc. - ErrorInfo err; + mutable ErrorInfo err; - std::optional what_; - const string& calcWhat() + mutable std::optional what_; + const string& calcWhat() const { if (what_.has_value()) return *what_; @@ -131,12 +131,12 @@ public: #ifdef EXCEPTION_NEEDS_THROW_SPEC ~BaseError() throw () { }; - const char * what() throw () { return calcWhat().c_str(); } + const char * what() const throw () { return calcWhat().c_str(); } #else - const char * what() noexcept { return calcWhat().c_str(); } + const char * what() const noexcept override { return calcWhat().c_str(); } #endif - const string & msg() { return calcWhat(); } + const string & msg() const { return calcWhat(); } const string & prefix() const { return prefix_; } BaseError & addPrefix(const FormatOrString & fs); diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc index 401c8d340..3c2f4f00c 100755 --- a/src/nix-build/nix-build.cc +++ b/src/nix-build/nix-build.cc @@ -368,7 +368,7 @@ static void _main(int argc, char * * argv) shell = drv->queryOutPath() + "/bin/bash"; } catch (Error & e) { - // TODO: append error msg + // TODO: append error msg; warn()? logError(e.info()); printError("warning: %s; will use bash from your environment", e.what()); shell = "bash"; From 55eb71714854b262b5e1079ff250a13cc0bbf644 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 8 May 2020 18:18:28 -0600 Subject: [PATCH 032/120] add pos to errorinfo, remove from hints --- src/error-demo/error-demo.cc | 17 +- src/libexpr/attr-set.hh | 7 +- src/libexpr/eval-inline.hh | 18 +- src/libexpr/eval.cc | 76 ++++-- src/libexpr/parser.y | 17 +- src/libexpr/primops.cc | 331 +++++++++++++++++++++----- src/libexpr/primops/context.cc | 20 +- src/libexpr/primops/fetchGit.cc | 12 +- src/libexpr/primops/fetchMercurial.cc | 13 +- src/libutil/error.cc | 172 ++++++------- src/libutil/error.hh | 11 +- src/libutil/logging.cc | 3 +- tests/misc.sh | 4 +- 13 files changed, 507 insertions(+), 194 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 89ba5a78d..41293427c 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -126,17 +126,28 @@ int main() // Error with previous and next lines of code. logError( ErrorInfo { .name = "error name", - .description = "error description", + .description = "error with code lines", .hint = hintfmt("this hint has %1% templated %2%!!", "yellow", "values"), .nixCode = NixCode { .errPos = Pos(problem_file, 40, 13), - .prevLineOfCode = std::optional("previous line of code"), + .prevLineOfCode = "previous line of code", .errLineOfCode = "this is the problem line of code", - .nextLineOfCode = std::optional("next line of code"), + .nextLineOfCode = "next line of code", }}); + // Error without lines of code. + logError( + ErrorInfo { .name = "error name", + .description = "error without any code lines.", + .hint = hintfmt("this hint has %1% templated %2%!!", + "yellow", + "values"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13) + }}); + return 0; } diff --git a/src/libexpr/attr-set.hh b/src/libexpr/attr-set.hh index 118c7bd5d..f5651891f 100644 --- a/src/libexpr/attr-set.hh +++ b/src/libexpr/attr-set.hh @@ -76,7 +76,12 @@ public: { auto a = get(name); if (!a) - throw Error("attribute '%s' missing, at %s", name, pos); + throw Error( + ErrorInfo { + .hint = hintfmt("attribute '%s' missing", name), + .nixCode = NixCode { .errPos = pos } + }); + return *a; } diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh index 4d82ccf09..d03633cc7 100644 --- a/src/libexpr/eval-inline.hh +++ b/src/libexpr/eval-inline.hh @@ -9,7 +9,11 @@ namespace nix { LocalNoInlineNoReturn(void throwEvalError(const char * s, const Pos & pos)) { - throw EvalError(s, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt(s), + .nixCode = NixCode { .errPos = pos } + }); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v)) @@ -20,7 +24,11 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v)) LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v, const Pos & pos)) { - throw TypeError(s, showType(v), pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt(s, showType(v)), + .nixCode = NixCode { .errPos = pos } + }); } @@ -43,7 +51,7 @@ void EvalState::forceValue(Value & v, const Pos & pos) else if (v.type == tApp) callFunction(*v.app.left, *v.app.right, v, noPos); else if (v.type == tBlackhole) - throwEvalError("infinite recursion encountered, at %1%", pos); + throwEvalError("infinite recursion encountered", pos); } @@ -59,7 +67,7 @@ inline void EvalState::forceAttrs(Value & v, const Pos & pos) { forceValue(v); if (v.type != tAttrs) - throwTypeError("value is %1% while a set was expected, at %2%", v, pos); + throwTypeError("value is %1% while a set was expected", v, pos); } @@ -75,7 +83,7 @@ inline void EvalState::forceList(Value & v, const Pos & pos) { forceValue(v); if (!v.isList()) - throwTypeError("value is %1% while a list was expected, at %2%", v, pos); + throwTypeError("value is %1% while a list was expected", v, pos); } /* Note: Various places expect the allocated memory to be zeroed. */ diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 516c25b02..a19b85be4 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -498,7 +498,11 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2)) LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const Pos & pos)) { - throw EvalError(s, s2, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt(s, s2), + .nixCode = NixCode { .errPos = pos } + }); } LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const string & s3)) @@ -508,7 +512,11 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, con LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const string & s3, const Pos & pos)) { - throw EvalError(s, s2, s3, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt(s, s2, s3), + .nixCode = NixCode { .errPos = pos } + }); } LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, const Pos & p1, const Pos & p2)) @@ -518,7 +526,11 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, co LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos)) { - throw TypeError(s, pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt(s), + .nixCode = NixCode { .errPos = pos } + }); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s1)) @@ -528,17 +540,29 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s1)) LocalNoInlineNoReturn(void throwTypeError(const char * s, const ExprLambda & fun, const Symbol & s2, const Pos & pos)) { - throw TypeError(s, fun.showNamePos(), s2, pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt(s, fun.showNamePos(), s2), + .nixCode = NixCode { .errPos = pos } + }); } LocalNoInlineNoReturn(void throwAssertionError(const char * s, const string & s1, const Pos & pos)) { - throw AssertionError(s, s1, pos); + throw AssertionError( + ErrorInfo { + .hint = hintfmt(s, s1), + .nixCode = NixCode { .errPos = pos } + }); } LocalNoInlineNoReturn(void throwUndefinedVarError(const char * s, const string & s1, const Pos & pos)) { - throw UndefinedVarError(s, s1, pos); + throw UndefinedVarError( + ErrorInfo { + .hint = hintfmt(s, s1), + .nixCode = NixCode { .errPos = pos } + }); } LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2)) @@ -804,7 +828,7 @@ inline bool EvalState::evalBool(Env & env, Expr * e, const Pos & pos) Value v; e->eval(*this, env, v); if (v.type != tBool) - throwTypeError("value is %1% while a Boolean was expected, at %2%", v, pos); + throwTypeError("value is %1% while a Boolean was expected", v, pos); return v.boolean; } @@ -1006,7 +1030,7 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v) } else { state.forceAttrs(*vAttrs, pos); if ((j = vAttrs->attrs->find(name)) == vAttrs->attrs->end()) - throwEvalError("attribute '%1%' missing, at %2%", name, pos); + throwEvalError("attribute '%1%' missing", name, pos); } vAttrs = j->value; pos2 = j->pos; @@ -1132,7 +1156,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po } if (fun.type != tLambda) - throwTypeError("attempt to call something which is not a function but %1%, at %2%", fun, pos); + throwTypeError("attempt to call something which is not a function but %1%", fun, pos); ExprLambda & lambda(*fun.lambda.fun); @@ -1160,7 +1184,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po for (auto & i : lambda.formals->formals) { Bindings::iterator j = arg.attrs->find(i.name); if (j == arg.attrs->end()) { - if (!i.def) throwTypeError("%1% called without required argument '%2%', at %3%", + if (!i.def) throwTypeError("%1% called without required argument '%2%'", lambda, i.name, pos); env2.values[displ++] = i.def->maybeThunk(*this, env2); } else { @@ -1176,7 +1200,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po user. */ for (auto & i : *arg.attrs) if (lambda.formals->argNames.find(i.name) == lambda.formals->argNames.end()) - throwTypeError("%1% called with unexpected argument '%2%', at %3%", lambda, i.name, pos); + throwTypeError("%1% called with unexpected argument '%2%'", lambda, i.name, pos); abort(); // can't happen } } @@ -1417,14 +1441,14 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v) nf = n; nf += vTmp.fpoint; } else - throwEvalError("cannot add %1% to an integer, at %2%", showType(vTmp), pos); + throwEvalError("cannot add %1% to an integer", showType(vTmp), pos); } else if (firstType == tFloat) { if (vTmp.type == tInt) { nf += vTmp.integer; } else if (vTmp.type == tFloat) { nf += vTmp.fpoint; } else - throwEvalError("cannot add %1% to a float, at %2%", showType(vTmp), pos); + throwEvalError("cannot add %1% to a float", showType(vTmp), pos); } else s << state.coerceToString(pos, vTmp, context, false, firstType == tString); } @@ -1435,7 +1459,7 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v) mkFloat(v, nf); else if (firstType == tPath) { if (!context.empty()) - throwEvalError("a string that refers to a store path cannot be appended to a path, at %1%", pos); + throwEvalError("a string that refers to a store path cannot be appended to a path", pos); auto path = canonPath(s.str()); mkPath(v, path.c_str()); } else @@ -1484,7 +1508,7 @@ NixInt EvalState::forceInt(Value & v, const Pos & pos) { forceValue(v, pos); if (v.type != tInt) - throwTypeError("value is %1% while an integer was expected, at %2%", v, pos); + throwTypeError("value is %1% while an integer was expected", v, pos); return v.integer; } @@ -1495,7 +1519,7 @@ NixFloat EvalState::forceFloat(Value & v, const Pos & pos) if (v.type == tInt) return v.integer; else if (v.type != tFloat) - throwTypeError("value is %1% while a float was expected, at %2%", v, pos); + throwTypeError("value is %1% while a float was expected", v, pos); return v.fpoint; } @@ -1504,7 +1528,7 @@ bool EvalState::forceBool(Value & v, const Pos & pos) { forceValue(v); if (v.type != tBool) - throwTypeError("value is %1% while a Boolean was expected, at %2%", v, pos); + throwTypeError("value is %1% while a Boolean was expected", v, pos); return v.boolean; } @@ -1519,7 +1543,7 @@ void EvalState::forceFunction(Value & v, const Pos & pos) { forceValue(v); if (v.type != tLambda && v.type != tPrimOp && v.type != tPrimOpApp && !isFunctor(v)) - throwTypeError("value is %1% while a function was expected, at %2%", v, pos); + throwTypeError("value is %1% while a function was expected", v, pos); } @@ -1528,7 +1552,7 @@ string EvalState::forceString(Value & v, const Pos & pos) forceValue(v, pos); if (v.type != tString) { if (pos) - throwTypeError("value is %1% while a string was expected, at %2%", v, pos); + throwTypeError("value is %1% while a string was expected", v, pos); else throwTypeError("value is %1% while a string was expected", v); } @@ -1557,7 +1581,7 @@ string EvalState::forceStringNoCtx(Value & v, const Pos & pos) string s = forceString(v, pos); if (v.string.context) { if (pos) - throwEvalError("the string '%1%' is not allowed to refer to a store path (such as '%2%'), at %3%", + throwEvalError("the string '%1%' is not allowed to refer to a store path (such as '%2%')", v.string.s, v.string.context[0], pos); else throwEvalError("the string '%1%' is not allowed to refer to a store path (such as '%2%')", @@ -1614,7 +1638,7 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context, return *maybeString; } auto i = v.attrs->find(sOutPath); - if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string, at %1%", pos); + if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string", pos); return coerceToString(pos, *i->value, context, coerceMore, copyToStore); } @@ -1645,7 +1669,7 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context, } } - throwTypeError("cannot coerce %1% to a string, at %2%", v, pos); + throwTypeError("cannot coerce %1% to a string", v, pos); } @@ -1676,7 +1700,7 @@ Path EvalState::coerceToPath(const Pos & pos, Value & v, PathSet & context) { string path = coerceToString(pos, v, context, false, false); if (path == "" || path[0] != '/') - throwEvalError("string '%1%' doesn't represent an absolute path, at %2%", path, pos); + throwEvalError("string '%1%' doesn't represent an absolute path", path, pos); return path; } @@ -1883,7 +1907,11 @@ void EvalState::printStats() string ExternalValueBase::coerceToString(const Pos & pos, PathSet & context, bool copyMore, bool copyToStore) const { - throw TypeError("cannot coerce %1% to a string, at %2%", showType(), pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt("cannot coerce %1% to a string", showType()), + .nixCode = NixCode { .errPos = pos } + }); } diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 3ed9a7a4f..a3ad54a3d 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -404,7 +404,12 @@ expr_simple | URI { static bool noURLLiterals = settings.isExperimentalFeatureEnabled("no-url-literals"); if (noURLLiterals) - throw ParseError("URL literals are disabled, at %s", CUR_POS); + throw ParseError( + ErrorInfo { + .hint = hintfmt("URL literals are disabled"), + .nixCode = NixCode { .errPos = CUR_POS } + }); + $$ = new ExprString(data->symbols.create($1)); } | '(' expr ')' { $$ = $2; } @@ -669,10 +674,12 @@ Path EvalState::findFile(SearchPath & searchPath, const string & path, const Pos Path res = r.second + suffix; if (pathExists(res)) return canonPath(res); } - string f = - "file '%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)" - + string(pos ? ", at %2%" : ""); - throw ThrownError(f, path, pos); + + throw ThrownError( + ErrorInfo { + .hint = hintfmt("file '%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)", path), + .nixCode = NixCode { .errPos = pos } + }); } diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 13eb1ba58..771136af9 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -94,8 +94,13 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError("cannot import '%1%', since path '%2%' is not valid, at %3%", - path, e.path, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("cannot import '%1%', since path '%2%' is not valid", + path, e.path), + .nixCode = NixCode { .errPos = pos } + }); + } Path realPath = state.checkSourcePath(state.toRealPath(path, context)); @@ -171,8 +176,13 @@ void prim_importNative(EvalState & state, const Pos & pos, Value * * args, Value try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError("cannot import '%1%', since path '%2%' is not valid, at %3%" - , path, e.path, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt( + "cannot import '%1%', since path '%2%' is not valid", + path, e.path), + .nixCode = NixCode { .errPos = pos } + }); } path = state.checkSourcePath(path); @@ -207,7 +217,11 @@ void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v) auto elems = args[0]->listElems(); auto count = args[0]->listSize(); if (count == 0) { - throw EvalError("at least one argument to 'exec' required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("at least one argument to 'exec' required"), + .nixCode = NixCode { .errPos = pos } + }); } PathSet context; auto program = state.coerceToString(pos, *elems[0], context, false, false); @@ -218,9 +232,12 @@ void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v) try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError("cannot execute '%1%', since path '%2%' is not valid, at %3%" - , program, e.path, pos); - } + throw EvalError( + ErrorInfo { + .hint = hintfmt("cannot execute '%1%', since path '%2%' is not valid" + , program, e.path), + .nixCode = NixCode { .errPos = pos } + });} auto output = runProgram(program, true, commandArgs); Expr * parsed; @@ -371,7 +388,11 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar Bindings::iterator startSet = args[0]->attrs->find(state.symbols.create("startSet")); if (startSet == args[0]->attrs->end()) - throw EvalError("attribute 'startSet' required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("attribute 'startSet' required"), + .nixCode = NixCode { .errPos = pos } + }); state.forceList(*startSet->value, pos); ValueList workSet; @@ -382,7 +403,11 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar Bindings::iterator op = args[0]->attrs->find(state.symbols.create("operator")); if (op == args[0]->attrs->end()) - throw EvalError("attribute 'operator' required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("attribute 'operator' required"), + .nixCode = NixCode { .errPos = pos } + }); state.forceValue(*op->value); /* Construct the closure by applying the operator to element of @@ -401,7 +426,11 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar Bindings::iterator key = e->attrs->find(state.symbols.create("key")); if (key == e->attrs->end()) - throw EvalError("attribute 'key' required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("attribute 'key' required"), + .nixCode = NixCode { .errPos = pos } + }); state.forceValue(*key->value); if (!doneKeys.insert(key->value).second) continue; @@ -533,7 +562,11 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * /* Figure out the name first (for stack backtraces). */ Bindings::iterator attr = args[0]->attrs->find(state.sName); if (attr == args[0]->attrs->end()) - throw EvalError("required attribute 'name' missing, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("required attribute 'name' missing"), + .nixCode = NixCode { .errPos = pos } + }); string drvName; Pos & posDrvName(*attr->pos); try { @@ -576,25 +609,45 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * auto handleHashMode = [&](const std::string & s) { if (s == "recursive") outputHashRecursive = true; else if (s == "flat") outputHashRecursive = false; - else throw EvalError("invalid value '%s' for 'outputHashMode' attribute, at %s", s, posDrvName); + else + throw EvalError( + ErrorInfo { + .hint = hintfmt("invalid value '%s' for 'outputHashMode' attribute", s), + .nixCode = NixCode { .errPos = posDrvName } + }); }; auto handleOutputs = [&](const Strings & ss) { outputs.clear(); for (auto & j : ss) { if (outputs.find(j) != outputs.end()) - throw EvalError("duplicate derivation output '%1%', at %2%", j, posDrvName); + throw EvalError( + ErrorInfo { + .hint = hintfmt("duplicate derivation output '%1%'", j), + .nixCode = NixCode { .errPos = posDrvName } + }); + + /* !!! Check whether j is a valid attribute name. */ /* Derivations cannot be named ‘drv’, because then we'd have an attribute ‘drvPath’ in the resulting set. */ if (j == "drv") - throw EvalError("invalid derivation output name 'drv', at %1%", posDrvName); + throw EvalError( + ErrorInfo { + .hint = hintfmt("invalid derivation output name 'drv'" ), + .nixCode = NixCode { .errPos = posDrvName } + }); + outputs.insert(j); } if (outputs.empty()) - throw EvalError("derivation cannot have an empty set of outputs, at %1%", posDrvName); + throw EvalError( + ErrorInfo { + .hint = hintfmt("derivation cannot have an empty set of outputs"), + .nixCode = NixCode { .errPos = posDrvName } + }); }; try { @@ -706,18 +759,37 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * /* Do we have all required attributes? */ if (drv.builder == "") - throw EvalError("required attribute 'builder' missing, at %1%", posDrvName); + throw EvalError( + ErrorInfo { + .hint = hintfmt("required attribute 'builder' missing"), + .nixCode = NixCode { .errPos = posDrvName } + }); + if (drv.platform == "") - throw EvalError("required attribute 'system' missing, at %1%", posDrvName); + throw EvalError( + ErrorInfo { + .hint = hintfmt("required attribute 'system' missing"), + .nixCode = NixCode { .errPos = posDrvName } + }); + /* Check whether the derivation name is valid. */ if (isDerivation(drvName)) - throw EvalError("derivation names are not allowed to end in '%s', at %s", drvExtension, posDrvName); + throw EvalError( + ErrorInfo { + .hint = hintfmt("derivation names are not allowed to end in '%s'", drvExtension), + .nixCode = NixCode { .errPos = posDrvName } + }); + if (outputHash) { /* Handle fixed-output derivations. */ if (outputs.size() != 1 || *(outputs.begin()) != "out") - throw Error("multiple outputs are not supported in fixed-output derivations, at %1%", posDrvName); + throw Error( + ErrorInfo { + .hint = hintfmt("multiple outputs are not supported in fixed-output derivations"), + .nixCode = NixCode { .errPos = posDrvName } + }); HashType ht = outputHashAlgo.empty() ? htUnknown : parseHashType(outputHashAlgo); Hash h(*outputHash, ht); @@ -818,7 +890,11 @@ static void prim_storePath(EvalState & state, const Pos & pos, Value * * args, V e.g. nix-push does the right thing. */ if (!state.store->isStorePath(path)) path = canonPath(path, true); if (!state.store->isInStore(path)) - throw EvalError("path '%1%' is not in the Nix store, at %2%", path, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("path '%1%' is not in the Nix store", path), + .nixCode = NixCode { .errPos = pos } + }); Path path2 = state.store->toStorePath(path); if (!settings.readOnlyMode) state.store->ensurePath(state.store->parseStorePath(path2)); @@ -835,8 +911,12 @@ static void prim_pathExists(EvalState & state, const Pos & pos, Value * * args, state.realiseContext(context); } catch (InvalidPathError & e) { throw EvalError( - "cannot check the existence of '%1%', since path '%2%' is not valid, at %3%", - path, e.path, pos); + ErrorInfo { + .hint = hintfmt( + "cannot check the existence of '%1%', since path '%2%' is not valid", + path, e.path), + .nixCode = NixCode { .errPos = pos } + }); } try { @@ -879,9 +959,13 @@ static void prim_readFile(EvalState & state, const Pos & pos, Value * * args, Va try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError("cannot read '%1%', since path '%2%' is not valid, at %3%" - , path, e.path, pos); - } + throw EvalError( + ErrorInfo { + .hint = hintfmt("cannot read '%1%', since path '%2%' is not valid" + , path, e.path), + .nixCode = NixCode { .errPos = pos } + }); + } string s = readFile(state.checkSourcePath(state.toRealPath(path, context))); if (s.find((char) 0) != string::npos) throw Error("the contents of the file '%1%' cannot be represented as a Nix string", path); @@ -908,7 +992,11 @@ static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Va i = v2.attrs->find(state.symbols.create("path")); if (i == v2.attrs->end()) - throw EvalError("attribute 'path' missing, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("attribute 'path' missing"), + .nixCode = NixCode { .errPos = pos } + }); PathSet context; string path = state.coerceToString(pos, *i->value, context, false, false); @@ -916,8 +1004,12 @@ static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Va try { state.realiseContext(context); } catch (InvalidPathError & e) { - throw EvalError("cannot find '%1%', since path '%2%' is not valid, at %3%", - path, e.path, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("cannot find '%1%', since path '%2%' is not valid", + path, e.path), + .nixCode = NixCode { .errPos = pos } + }); } searchPath.emplace_back(prefix, path); @@ -934,7 +1026,11 @@ static void prim_hashFile(EvalState & state, const Pos & pos, Value * * args, Va string type = state.forceStringNoCtx(*args[0], pos); HashType ht = parseHashType(type); if (ht == htUnknown) - throw Error("unknown hash type '%1%', at %2%", type, pos); + throw Error( + ErrorInfo { + .hint = hintfmt("unknown hash type '%1%'", type), + .nixCode = NixCode { .errPos = pos } + }); PathSet context; // discarded Path p = state.coerceToPath(pos, *args[1], context); @@ -950,8 +1046,12 @@ static void prim_readDir(EvalState & state, const Pos & pos, Value * * args, Val try { state.realiseContext(ctx); } catch (InvalidPathError & e) { - throw EvalError("cannot read '%1%', since path '%2%' is not valid, at %3%", - path, e.path, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("cannot read '%1%', since path '%2%' is not valid", + path, e.path), + .nixCode = NixCode { .errPos = pos } + }); } DirEntries entries = readDirectory(state.checkSourcePath(path)); @@ -1021,7 +1121,13 @@ static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Valu for (auto path : context) { if (path.at(0) != '/') - throw EvalError("in 'toFile': the file '%1%' cannot refer to derivation outputs, at %2%", name, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt( + "in 'toFile': the file '%1%' cannot refer to derivation outputs", \ + name), + .nixCode = NixCode { .errPos = pos } + }); refs.insert(state.store->parseStorePath(path)); } @@ -1089,11 +1195,21 @@ static void prim_filterSource(EvalState & state, const Pos & pos, Value * * args PathSet context; Path path = state.coerceToPath(pos, *args[1], context); if (!context.empty()) - throw EvalError("string '%1%' cannot refer to other paths, at %2%", path, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("string '%1%' cannot refer to other paths", path), + .nixCode = NixCode { .errPos = pos } + }); state.forceValue(*args[0]); if (args[0]->type != tLambda) - throw TypeError("first argument in call to 'filterSource' is not a function but %1%, at %2%", showType(*args[0]), pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt( + "first argument in call to 'filterSource' is not a function but %1%", + showType(*args[0])), + .nixCode = NixCode { .errPos = pos } + }); addPath(state, pos, std::string(baseNameOf(path)), path, args[0], true, Hash(), v); } @@ -1113,7 +1229,13 @@ static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value PathSet context; path = state.coerceToPath(*attr.pos, *attr.value, context); if (!context.empty()) - throw EvalError("string '%1%' cannot refer to other paths, at %2%", path, *attr.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("string '%1%' cannot refer to other paths", + path), + .nixCode = NixCode { .errPos = *attr.pos } + }); + } else if (attr.name == state.sName) name = state.forceStringNoCtx(*attr.value, *attr.pos); else if (n == "filter") { @@ -1124,10 +1246,19 @@ static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value else if (n == "sha256") expectedHash = Hash(state.forceStringNoCtx(*attr.value, *attr.pos), htSHA256); else - throw EvalError("unsupported argument '%1%' to 'addPath', at %2%", attr.name, *attr.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("unsupported argument '%1%' to 'addPath'", + attr.name), + .nixCode = NixCode { .errPos = *attr.pos } + }); } if (path.empty()) - throw EvalError("'path' required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("'path' required"), + .nixCode = NixCode { .errPos = pos } + }); if (name.empty()) name = baseNameOf(path); @@ -1185,7 +1316,12 @@ void prim_getAttr(EvalState & state, const Pos & pos, Value * * args, Value & v) // !!! Should we create a symbol here or just do a lookup? Bindings::iterator i = args[1]->attrs->find(state.symbols.create(attr)); if (i == args[1]->attrs->end()) - throw EvalError("attribute '%1%' missing, at %2%", attr, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("attribute '%1%' missing", attr), + .nixCode = NixCode { .errPos = pos } + }); + // !!! add to stack trace? if (state.countCalls && i->pos) state.attrSelects[*i->pos]++; state.forceValue(*i->value); @@ -1265,14 +1401,23 @@ static void prim_listToAttrs(EvalState & state, const Pos & pos, Value * * args, Bindings::iterator j = v2.attrs->find(state.sName); if (j == v2.attrs->end()) - throw TypeError("'name' attribute missing in a call to 'listToAttrs', at %1%", pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt("'name' attribute missing in a call to 'listToAttrs'"), + .nixCode = NixCode { .errPos = pos } + }); + string name = state.forceStringNoCtx(*j->value, pos); Symbol sym = state.symbols.create(name); if (seen.insert(sym).second) { Bindings::iterator j2 = v2.attrs->find(state.symbols.create(state.sValue)); if (j2 == v2.attrs->end()) - throw TypeError("'value' attribute missing in a call to 'listToAttrs', at %1%", pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt("'value' attribute missing in a call to 'listToAttrs'"), + .nixCode = NixCode { .errPos = pos } + }); v.attrs->push_back(Attr(sym, j2->value, j2->pos)); } @@ -1346,7 +1491,12 @@ static void prim_functionArgs(EvalState & state, const Pos & pos, Value * * args { state.forceValue(*args[0]); if (args[0]->type != tLambda) - throw TypeError("'functionArgs' requires a function, at %1%", pos); + throw TypeError( + ErrorInfo { + .hint = hintfmt("'functionArgs' requires a function"), + .nixCode = NixCode { .errPos = pos } + }); + if (!args[0]->lambda.fun->matchAttrs) { state.mkAttrs(v, 0); @@ -1396,7 +1546,12 @@ static void elemAt(EvalState & state, const Pos & pos, Value & list, int n, Valu { state.forceList(list, pos); if (n < 0 || (unsigned int) n >= list.listSize()) - throw Error("list index %1% is out of bounds, at %2%", n, pos); + throw Error( + ErrorInfo { + .hint = hintfmt("list index %1% is out of bounds", n), + .nixCode = NixCode { .errPos = pos } + }); + state.forceValue(*list.listElems()[n]); v = *list.listElems()[n]; } @@ -1423,7 +1578,12 @@ static void prim_tail(EvalState & state, const Pos & pos, Value * * args, Value { state.forceList(*args[0], pos); if (args[0]->listSize() == 0) - throw Error("'tail' called on an empty list, at %1%", pos); + throw Error( + ErrorInfo { + .hint = hintfmt("'tail' called on an empty list"), + .nixCode = NixCode { .errPos = pos } + }); + state.mkList(v, args[0]->listSize() - 1); for (unsigned int n = 0; n < v.listSize(); ++n) v.listElems()[n] = args[0]->listElems()[n + 1]; @@ -1564,7 +1724,12 @@ static void prim_genList(EvalState & state, const Pos & pos, Value * * args, Val auto len = state.forceInt(*args[1], pos); if (len < 0) - throw EvalError("cannot create list of size %1%, at %2%", len, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("cannot create list of size %1%", len), + .nixCode = NixCode { .errPos = pos } + }); + state.mkList(v, len); @@ -1722,7 +1887,12 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value & state.forceValue(*args[1], pos); NixFloat f2 = state.forceFloat(*args[1], pos); - if (f2 == 0) throw EvalError("division by zero, at %1%", pos); + if (f2 == 0) + throw EvalError( + ErrorInfo { + .hint = hintfmt("division by zero"), + .nixCode = NixCode { .errPos = pos } + }); if (args[0]->type == tFloat || args[1]->type == tFloat) { mkFloat(v, state.forceFloat(*args[0], pos) / state.forceFloat(*args[1], pos)); @@ -1731,7 +1901,12 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value & NixInt i2 = state.forceInt(*args[1], pos); /* Avoid division overflow as it might raise SIGFPE. */ if (i1 == std::numeric_limits::min() && i2 == -1) - throw EvalError("overflow in integer division, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("overflow in integer division"), + .nixCode = NixCode { .errPos = pos } + }); + mkInt(v, i1 / i2); } } @@ -1787,7 +1962,12 @@ static void prim_substring(EvalState & state, const Pos & pos, Value * * args, V PathSet context; string s = state.coerceToString(pos, *args[2], context); - if (start < 0) throw EvalError("negative start position in 'substring', at %1%", pos); + if (start < 0) + throw EvalError( + ErrorInfo { + .hint = hintfmt("negative start position in 'substring'"), + .nixCode = NixCode { .errPos = pos } + }); mkString(v, (unsigned int) start >= s.size() ? "" : string(s, start, len), context); } @@ -1807,7 +1987,11 @@ static void prim_hashString(EvalState & state, const Pos & pos, Value * * args, string type = state.forceStringNoCtx(*args[0], pos); HashType ht = parseHashType(type); if (ht == htUnknown) - throw Error("unknown hash type '%1%', at %2%", type, pos); + throw Error( + ErrorInfo { + .hint = hintfmt("unknown hash type '%1%'", type), + .nixCode = NixCode { .errPos = pos } + }); PathSet context; // discarded string s = state.forceString(*args[1], context, pos); @@ -1849,10 +2033,18 @@ void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v) } catch (std::regex_error &e) { if (e.code() == std::regex_constants::error_space) { - // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ - throw EvalError("memory limit exceeded by regular expression '%s', at %s", re, pos); + // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ + throw EvalError( + ErrorInfo { + .hint = hintfmt("memory limit exceeded by regular expression '%s'", re), + .nixCode = NixCode { .errPos = pos } + }); } else { - throw EvalError("invalid regular expression '%s', at %s", re, pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("invalid regular expression '%s'", re), + .nixCode = NixCode { .errPos = pos } + }); } } } @@ -1917,10 +2109,18 @@ static void prim_split(EvalState & state, const Pos & pos, Value * * args, Value } catch (std::regex_error &e) { if (e.code() == std::regex_constants::error_space) { // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ - throw EvalError("memory limit exceeded by regular expression '%s', at %s", re, pos); - } else { - throw EvalError("invalid regular expression '%s', at %s", re, pos); - } + throw EvalError( + ErrorInfo { + .hint = hintfmt("memory limit exceeded by regular expression '%s'", re), + .nixCode = NixCode { .errPos = pos } + }); + } else { + throw EvalError( + ErrorInfo { + .hint = hintfmt("invalid regular expression '%s'", re), + .nixCode = NixCode { .errPos = pos } + }); + } } } @@ -1950,7 +2150,11 @@ static void prim_replaceStrings(EvalState & state, const Pos & pos, Value * * ar state.forceList(*args[0], pos); state.forceList(*args[1], pos); if (args[0]->listSize() != args[1]->listSize()) - throw EvalError("'from' and 'to' arguments to 'replaceStrings' have different lengths, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("'from' and 'to' arguments to 'replaceStrings' have different lengths"), + .nixCode = NixCode { .errPos = pos } + }); vector from; from.reserve(args[0]->listSize()); @@ -2072,11 +2276,20 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v, else if (n == "name") request.name = state.forceStringNoCtx(*attr.value, *attr.pos); else - throw EvalError("unsupported argument '%1%' to '%2%', at %3%", attr.name, who, attr.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("unsupported argument '%1%' to '%2%'", attr.name, who), + .nixCode = NixCode { .errPos = pos } + }); + } if (request.uri.empty()) - throw EvalError("'url' argument required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("'url' argument required"), + .nixCode = NixCode { .errPos = pos } + }); } else request.uri = state.forceStringNoCtx(*args[0], pos); diff --git a/src/libexpr/primops/context.cc b/src/libexpr/primops/context.cc index 94fa0158c..768936453 100644 --- a/src/libexpr/primops/context.cc +++ b/src/libexpr/primops/context.cc @@ -146,7 +146,12 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg auto sAllOutputs = state.symbols.create("allOutputs"); for (auto & i : *args[1]->attrs) { if (!state.store->isStorePath(i.name)) - throw EvalError("Context key '%s' is not a store path, at %s", i.name, i.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("Context key '%s' is not a store path", i.name), + .nixCode = NixCode { .errPos = *i.pos } + }); + if (!settings.readOnlyMode) state.store->ensurePath(state.store->parseStorePath(i.name)); state.forceAttrs(*i.value, *i.pos); @@ -160,7 +165,12 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg if (iter != i.value->attrs->end()) { if (state.forceBool(*iter->value, *iter->pos)) { if (!isDerivation(i.name)) { - throw EvalError("Tried to add all-outputs context of %s, which is not a derivation, to a string, at %s", i.name, i.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("Tried to add all-outputs context of %s, which is not a derivation, to a string", i.name), + .nixCode = NixCode { .errPos = *i.pos } + }); + } context.insert("=" + string(i.name)); } @@ -170,7 +180,11 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg if (iter != i.value->attrs->end()) { state.forceList(*iter->value, *iter->pos); if (iter->value->listSize() && !isDerivation(i.name)) { - throw EvalError("Tried to add derivation output context of %s, which is not a derivation, to a string, at %s", i.name, i.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("Tried to add derivation output context of %s, which is not a derivation, to a string", i.name), + .nixCode = NixCode { .errPos = *i.pos } + }); } for (unsigned int n = 0; n < iter->value->listSize(); ++n) { auto name = state.forceStringNoCtx(*iter->value->listElems()[n], *iter->pos); diff --git a/src/libexpr/primops/fetchGit.cc b/src/libexpr/primops/fetchGit.cc index 480cc1adc..68ffed513 100644 --- a/src/libexpr/primops/fetchGit.cc +++ b/src/libexpr/primops/fetchGit.cc @@ -217,11 +217,19 @@ static void prim_fetchGit(EvalState & state, const Pos & pos, Value * * args, Va else if (n == "name") name = state.forceStringNoCtx(*attr.value, *attr.pos); else - throw EvalError("unsupported argument '%s' to 'fetchGit', at %s", attr.name, *attr.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("unsupported argument '%s' to 'fetchGit'", attr.name), + .nixCode = NixCode { .errPos = *attr.pos } + }); } if (url.empty()) - throw EvalError("'url' argument required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("'url' argument required"), + .nixCode = NixCode { .errPos = pos } + }); } else url = state.coerceToString(pos, *args[0], context, false, false); diff --git a/src/libexpr/primops/fetchMercurial.cc b/src/libexpr/primops/fetchMercurial.cc index 76029f548..ce99928e2 100644 --- a/src/libexpr/primops/fetchMercurial.cc +++ b/src/libexpr/primops/fetchMercurial.cc @@ -187,11 +187,20 @@ static void prim_fetchMercurial(EvalState & state, const Pos & pos, Value * * ar else if (n == "name") name = state.forceStringNoCtx(*attr.value, *attr.pos); else - throw EvalError("unsupported argument '%s' to 'fetchMercurial', at %s", attr.name, *attr.pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("unsupported argument '%s' to 'fetchMercurial'", attr.name), + .nixCode = NixCode { .errPos = *attr.pos } + }); + } if (url.empty()) - throw EvalError("'url' argument required, at %1%", pos); + throw EvalError( + ErrorInfo { + .hint = hintfmt("'url' argument required"), + .nixCode = NixCode { .errPos = pos } + }); } else url = state.coerceToString(pos, *args[0], context, false, false); diff --git a/src/libutil/error.cc b/src/libutil/error.cc index d4305ddd8..ce5dde6c3 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -1,4 +1,4 @@ -#include "types.hh" +#include "error.hh" #include #include @@ -25,54 +25,60 @@ std::ostream& operator<<(std::ostream &os, const hintformat &hf) string showErrPos(const ErrPos &errPos) { - if (errPos.column > 0) { - return fmt("(%1%:%2%)", errPos.line, errPos.column); - } else { - return fmt("(%1%)", errPos.line); - }; + if (errPos.line > 0) { + if (errPos.column > 0) { + return fmt("(%1%:%2%)", errPos.line, errPos.column); + } else { + return fmt("(%1%)", errPos.line); + } + } + else { + return ""; + } } -void printCodeLines(const string &prefix, const NixCode &nixCode) +void printCodeLines(std::ostream &out, const string &prefix, const NixCode &nixCode) { // previous line of code. if (nixCode.prevLineOfCode.has_value()) { - std::cout << fmt("%1% %|2$5d|| %3%", + out << fmt("%1% %|2$5d|| %3%", prefix, (nixCode.errPos.line - 1), *nixCode.prevLineOfCode) - << std::endl; + << std::endl; } - // line of code containing the error.%2$+5d% - std::cout << fmt("%1% %|2$5d|| %3%", - prefix, - (nixCode.errPos.line), - nixCode.errLineOfCode) - << std::endl; - - // error arrows for the column range. - if (nixCode.errPos.column > 0) { - int start = nixCode.errPos.column; - std::string spaces; - for (int i = 0; i < start; ++i) { - spaces.append(" "); - } - - std::string arrows("^"); - - std::cout << fmt("%1% |%2%" ANSI_RED "%3%" ANSI_NORMAL, + if (nixCode.errLineOfCode.has_value()) { + // line of code containing the error. + out << fmt("%1% %|2$5d|| %3%", prefix, - spaces, - arrows) << std::endl; + (nixCode.errPos.line), + *nixCode.errLineOfCode) + << std::endl; + // error arrows for the column range. + if (nixCode.errPos.column > 0) { + int start = nixCode.errPos.column; + std::string spaces; + for (int i = 0; i < start; ++i) { + spaces.append(" "); + } + + std::string arrows("^"); + + out << fmt("%1% |%2%" ANSI_RED "%3%" ANSI_NORMAL, + prefix, + spaces, + arrows) << std::endl; + } } // next line of code. if (nixCode.nextLineOfCode.has_value()) { - std::cout << fmt("%1% %|2$5d|| %3%", + out << fmt("%1% %|2$5d|| %3%", prefix, (nixCode.errPos.line + 1), *nixCode.nextLineOfCode) - << std::endl; + << std::endl; } } @@ -83,52 +89,52 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) string levelString; switch (einfo.level) { - case Verbosity::lvlError: { - levelString = ANSI_RED; - levelString += "error:"; - levelString += ANSI_NORMAL; - break; - } - case Verbosity::lvlWarn: { - levelString = ANSI_YELLOW; - levelString += "warning:"; - levelString += ANSI_NORMAL; - break; - } - case Verbosity::lvlInfo: { - levelString = ANSI_GREEN; - levelString += "info:"; - levelString += ANSI_NORMAL; - break; - } - case Verbosity::lvlTalkative: { - levelString = ANSI_GREEN; - levelString += "talk:"; - levelString += ANSI_NORMAL; - break; - } - case Verbosity::lvlChatty: { - levelString = ANSI_GREEN; - levelString += "chat:"; - levelString += ANSI_NORMAL; - break; - } - case Verbosity::lvlVomit: { - levelString = ANSI_GREEN; - levelString += "vomit:"; - levelString += ANSI_NORMAL; - break; - } - case Verbosity::lvlDebug: { - levelString = ANSI_YELLOW; - levelString += "debug:"; - levelString += ANSI_NORMAL; - break; - } - default: { - levelString = fmt("invalid error level: %1%", einfo.level); - break; - } + case Verbosity::lvlError: { + levelString = ANSI_RED; + levelString += "error:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlWarn: { + levelString = ANSI_YELLOW; + levelString += "warning:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlInfo: { + levelString = ANSI_GREEN; + levelString += "info:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlTalkative: { + levelString = ANSI_GREEN; + levelString += "talk:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlChatty: { + levelString = ANSI_GREEN; + levelString += "chat:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlVomit: { + levelString = ANSI_GREEN; + levelString += "vomit:"; + levelString += ANSI_NORMAL; + break; + } + case Verbosity::lvlDebug: { + levelString = ANSI_YELLOW; + levelString += "debug:"; + levelString += ANSI_NORMAL; + break; + } + default: { + levelString = fmt("invalid error level: %1%", einfo.level); + break; + } } int ndl = prefix.length() + levelString.length() + 3 + einfo.name.length() + einfo.programName.value_or("").length(); @@ -158,14 +164,10 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) // filename. if (einfo.nixCode.has_value()) { if (einfo.nixCode->errPos.file != "") { - string eline = einfo.nixCode->errLineOfCode != "" - ? string(" ") + showErrPos(einfo.nixCode->errPos) - : ""; - - out << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL, + out << fmt("%1%in file: " ANSI_BLUE "%2% %3%" ANSI_NORMAL, prefix, einfo.nixCode->errPos.file, - eline) << std::endl; + showErrPos(einfo.nixCode->errPos)) << std::endl; out << prefix << std::endl; } else { out << fmt("%1%from command line argument", prefix) << std::endl; @@ -180,8 +182,8 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) } // lines of code. - if (einfo.nixCode.has_value() && einfo.nixCode->errLineOfCode != "") { - printCodeLines(prefix, *einfo.nixCode); + if (einfo.nixCode.has_value()) { + printCodeLines(out, prefix, *einfo.nixCode); out << prefix << std::endl; } diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 19a806cc1..7e2cca2f9 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -35,10 +35,15 @@ typedef enum { } Verbosity; struct ErrPos { - int line; - int column; + int line = 0; + int column = 0; string file; + operator bool() const + { + return line != 0; + } + template ErrPos& operator=(const P &pos) { @@ -58,7 +63,7 @@ struct ErrPos { struct NixCode { ErrPos errPos; std::optional prevLineOfCode; - string errLineOfCode; + std::optional errLineOfCode; std::optional nextLineOfCode; }; diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index e1750eb2a..4244d1221 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -171,7 +171,8 @@ struct JSONLogger : Logger { json["file"] = ei.nixCode->errPos.file; if (ei.nixCode->prevLineOfCode.has_value()) json["prevLineOfCode"] = *ei.nixCode->prevLineOfCode; - json["errLineOfCode"] = ei.nixCode->errLineOfCode; + if (ei.nixCode->errLineOfCode.has_value()) + json["errLineOfCode"] = *ei.nixCode->errLineOfCode; if (ei.nixCode->nextLineOfCode.has_value()) json["nextLineOfCode"] = *ei.nixCode->nextLineOfCode; } diff --git a/tests/misc.sh b/tests/misc.sh index eda016416..fd4908e25 100644 --- a/tests/misc.sh +++ b/tests/misc.sh @@ -16,4 +16,6 @@ nix-env --foo 2>&1 | grep "no operation" nix-env -q --foo 2>&1 | grep "unknown flag" # Eval Errors. -nix-instantiate --eval -E 'let a = {} // a; in a.foo' 2>&1 | grep "infinite recursion encountered, at .*(string).*:1:15$" +eval_res=$(nix-instantiate --eval -E 'let a = {} // a; in a.foo' 2>&1 || true) +echo $eval_res | grep "(string) (1:15)" +echo $eval_res | grep "infinite recursion encountered" From 958e81987b5b86fba06090078a556f51037aa23c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 11 May 2020 13:02:16 -0600 Subject: [PATCH 033/120] switch from printError warnings to logWarnings --- src/libstore/build.cc | 14 +++++++++++--- src/libstore/store-api.cc | 6 +++++- src/libutil/error.cc | 2 +- src/libutil/serialise.cc | 5 ++++- src/nix-build/nix-build.cc | 9 ++++++--- src/nix-store/nix-store.cc | 5 ++++- 6 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index f8cc1ce36..a7d6e53b0 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -3647,7 +3647,11 @@ void DerivationGoal::registerOutputs() /* Apply hash rewriting if necessary. */ bool rewritten = false; if (!outputRewrites.empty()) { - printError("warning: rewriting hashes in '%1%'; cross fingers", path); + logWarning( + ErrorInfo { + .name = "Rewriting hashes", + .hint = hintfmt("rewriting hashes in '%1%'; cross fingers", path) + }); /* Canonicalise first. This ensures that the path we're rewriting doesn't contain a hard link to /etc/shadow or @@ -4414,8 +4418,12 @@ void SubstitutionGoal::tryNext() && !sub->isTrusted && !info->checkSignatures(worker.store, worker.store.getPublicKeys())) { - printError("warning: substituter '%s' does not have a valid signature for path '%s'", - sub->getUri(), worker.store.printStorePath(storePath)); + logWarning( + ErrorInfo { + .name = "Invalid path signature", + .hint = hintfmt("substituter '%s' does not have a valid signature for path '%s'", + sub->getUri(), worker.store.printStorePath(storePath)) + }); tryNext(); return; } diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 542e5c552..d1281d130 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -769,7 +769,11 @@ void ValidPathInfo::sign(const Store & store, const SecretKey & secretKey) bool ValidPathInfo::isContentAddressed(const Store & store) const { auto warn = [&]() { - printError("warning: path '%s' claims to be content-addressed but isn't", store.printStorePath(path)); + logWarning( + ErrorInfo{ + .name = "Path not content-addressed", + .hint = hintfmt("path '%s' claims to be content-addressed but isn't", store.printStorePath(path)) + }); }; if (hasPrefix(ca, "text:")) { diff --git a/src/libutil/error.cc b/src/libutil/error.cc index ce5dde6c3..e4f45a2d3 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -161,7 +161,7 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) einfo.programName.value_or("")) << std::endl; - // filename. + // filename, line, column. if (einfo.nixCode.has_value()) { if (einfo.nixCode->errPos.file != "") { out << fmt("%1%in file: " ANSI_BLUE "%2% %3%" ANSI_NORMAL, diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc index 8201549fd..35f7ee917 100644 --- a/src/libutil/serialise.cc +++ b/src/libutil/serialise.cc @@ -52,7 +52,10 @@ size_t threshold = 256 * 1024 * 1024; static void warnLargeDump() { - printError("warning: dumping very large path (> 256 MiB); this may run out of memory"); + logWarning(ErrorInfo { + .name = "Large path", + .description = "dumping very large path (> 256 MiB); this may run out of memory" + }); } diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc index 3c2f4f00c..03200d050 100755 --- a/src/nix-build/nix-build.cc +++ b/src/nix-build/nix-build.cc @@ -368,9 +368,12 @@ static void _main(int argc, char * * argv) shell = drv->queryOutPath() + "/bin/bash"; } catch (Error & e) { - // TODO: append error msg; warn()? - logError(e.info()); - printError("warning: %s; will use bash from your environment", e.what()); + logWarning( + ErrorInfo { + .name = "bashInteractive", + .hint = hintfmt("%s; will use bash from your environment", + (e.info().hint ? e.info().hint->str() : "")) + }); shell = "bash"; } } diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 57063d42f..9b5cceccf 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -704,7 +704,10 @@ static void opVerify(Strings opFlags, Strings opArgs) else throw UsageError("unknown flag '%1%'", i); if (store->verifyStore(checkContents, repair)) { - printError("warning: not all errors were fixed"); + logWarning(ErrorInfo { + .name = "Store consistency", + .description = "not all errors were fixed" + }); throw Exit(1); } } From 536bbf53e12c80f52c2679aec734d895b0058f5b Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 11 May 2020 13:58:38 -0600 Subject: [PATCH 034/120] comments and cleanup --- src/error-demo/error-demo.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 41293427c..8f484431c 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -10,27 +10,27 @@ MakeError(DemoError, Error); int main() { - makeDefaultLogger(); - verbosity = lvlVomit; // In each program where errors occur, this has to be set. ErrorInfo::programName = std::optional("error-demo"); + // 'DemoError' appears as error name. try { throw DemoError("demo error was thrown"); } catch (Error &e) { logger->logEI(e.info()); } - // ErrorInfo constructor + // appending to the hint from the previous error try { - auto e = Error("some error"); + auto e = Error("initial error"); throw DemoError(e.info()); } catch (Error &e) { ErrorInfo ei = e.info(); - string prevhint = (e.info().hint.has_value() ? e.info().hint->str() : ""); - ei.hint = std::optional(hintfmt("previous hint was: %s", normaltxt(prevhint))); + // using normaltxt to avoid the default yellow highlighting. + ei.hint = hintfmt("%s; subsequent error message.", + normaltxt(e.info().hint ? e.info().hint->str() : "")); logger->logEI(ei); } @@ -38,8 +38,8 @@ int main() try { auto x = readFile(-1); } - catch (Error &e) { - std::cout << "error: " << e.sname() << std::endl; + catch (SysError &e) { + std::cout << "errno was: " << e.errNo << std::endl; logError(e.info()); } @@ -59,7 +59,7 @@ int main() } } - // For completeness sake, info through vomit levels. + // For completeness sake, show 'info' through 'vomit' levels. // But this is maybe a heavy format for those. logger->logEI( ErrorInfo { .level = lvlInfo, From b93c1bf3d67716231d2ff7ee4154b8c80a251b10 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 11 May 2020 15:52:15 -0600 Subject: [PATCH 035/120] fixes to merged code --- src/libexpr/nixexpr.hh | 1 + src/libexpr/primops.cc | 2 +- src/libmain/stack.cc | 2 +- src/libstore/build.cc | 20 ++++++++++---------- src/libstore/filetransfer.hh | 3 ++- src/libstore/local-store.cc | 1 + src/libstore/sqlite.hh | 2 +- src/libutil/args.cc | 7 ------- src/libutil/error.hh | 4 +--- src/libutil/logging.hh | 1 + src/libutil/types.hh | 1 + src/libutil/url.hh | 2 +- src/libutil/util.cc | 16 ++++++++-------- 13 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index 137fe7198..a185d5785 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -2,6 +2,7 @@ #include "value.hh" #include "symbol-table.hh" +#include "error.hh" #include diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 10e8c6b42..657ce3001 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -1124,7 +1124,7 @@ static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Valu ErrorInfo { .hint = hintfmt( "in 'toFile': the file named '%1%' must not contain a reference " - "to a derivation but contains (%2%)" + "to a derivation but contains (%2%)", name, path), .nixCode = NixCode { .errPos = pos } diff --git a/src/libmain/stack.cc b/src/libmain/stack.cc index e6224de7d..b0a4a4c5d 100644 --- a/src/libmain/stack.cc +++ b/src/libmain/stack.cc @@ -1,4 +1,4 @@ -#include "types.hh" +#include "error.hh" #include #include diff --git a/src/libstore/build.cc b/src/libstore/build.cc index d6f3553d9..0359b10ac 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -547,7 +547,7 @@ UserLock::UserLock() /* Copy the result of getgrnam. */ Strings users; for (char * * p = gr->gr_mem; *p; ++p) { - debug(format("found build user '%1%'") % *p); + debug("found build user '%1%'", *p); users.push_back(*p); } @@ -558,7 +558,7 @@ UserLock::UserLock() /* Find a user account that isn't currently in use for another build. */ for (auto & i : users) { - debug(format("trying user '%1%'") % i); + debug("trying user '%1%'", i); struct passwd * pw = getpwnam(i.c_str()); if (!pw) @@ -1794,7 +1794,7 @@ HookReply DerivationGoal::tryBuildHook() } } - debug(format("hook reply is '%1%'") % reply); + debug("hook reply is '%1%'", reply); if (reply == "decline") return rpDecline; @@ -2255,7 +2255,7 @@ void DerivationGoal::startBuilder() startDaemon(); /* Run the builder. */ - printMsg(lvlChatty, format("executing builder '%1%'") % drv->builder); + printMsg(lvlChatty, "executing builder '%1%'", drv->builder); /* Create the log file. */ Path logFile = openLogFile(); @@ -3195,7 +3195,7 @@ void DerivationGoal::runChild() filesystem that we want in the chroot environment. */ auto doBind = [&](const Path & source, const Path & target, bool optional = false) { - debug(format("bind mounting '%1%' to '%2%'") % source % target); + debug("bind mounting '%1%' to '%2%'", source, target); struct stat st; if (stat(source.c_str(), &st) == -1) { if (optional && errno == ENOENT) @@ -3572,7 +3572,7 @@ static void moveCheckToStore(const Path & src, const Path & dst) directory's parent link ".."). */ struct stat st; if (lstat(src.c_str(), &st) == -1) { - throw SysError(format("getting attributes of path '%1%'") % src); + throw SysError("getting attributes of path '%1%'", src); } bool changePerm = (geteuid() && S_ISDIR(st.st_mode) && !(st.st_mode & S_IWUSR)); @@ -3581,7 +3581,7 @@ static void moveCheckToStore(const Path & src, const Path & dst) chmod_(src, st.st_mode | S_IWUSR); if (rename(src.c_str(), dst.c_str())) - throw SysError(format("renaming '%1%' to '%2%'") % src % dst); + throw SysError("renaming '%1%' to '%2%'", src, dst); if (changePerm) chmod_(dst, st.st_mode); @@ -4911,15 +4911,15 @@ void Worker::waitForInput() // FIXME: is there a cleaner way to handle pt close // than EIO? Is this even standard? if (rd == 0 || (rd == -1 && errno == EIO)) { - debug(format("%1%: got EOF") % goal->getName()); + debug("%1%: got EOF", goal->getName()); goal->handleEOF(k); j->fds.erase(k); } else if (rd == -1) { if (errno != EINTR) throw SysError("%s: read failed", goal->getName()); } else { - printMsg(lvlVomit, format("%1%: read %2% bytes") - % goal->getName() % rd); + printMsg(lvlVomit, "%1%: read %2% bytes", + goal->getName(), rd); string data((char *) buffer.data(), rd); j->lastOutput = after; goal->handleChildOutput(k, data); diff --git a/src/libstore/filetransfer.hh b/src/libstore/filetransfer.hh index 517b1a7d3..11dca2fe0 100644 --- a/src/libstore/filetransfer.hh +++ b/src/libstore/filetransfer.hh @@ -103,8 +103,9 @@ class FileTransferError : public Error { public: FileTransfer::Error error; + template FileTransferError(FileTransfer::Error error, const Args & ... args) - : Error(fs), error(error) + : Error(args...), error(error) { } }; diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 1f16a22b1..eb7548543 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -6,6 +6,7 @@ #include "derivations.hh" #include "nar-info.hh" #include "references.hh" +#include "error.hh" #include #include diff --git a/src/libstore/sqlite.hh b/src/libstore/sqlite.hh index ce27033c9..ccfac48d8 100644 --- a/src/libstore/sqlite.hh +++ b/src/libstore/sqlite.hh @@ -3,7 +3,7 @@ #include #include -#include "types.hh" +#include "error.hh" struct sqlite3; struct sqlite3_stmt; diff --git a/src/libutil/args.cc b/src/libutil/args.cc index 423b99c96..10d6e89bb 100644 --- a/src/libutil/args.cc +++ b/src/libutil/args.cc @@ -101,15 +101,8 @@ bool Args::processFlag(Strings::iterator & pos, Strings::iterator end) std::vector args; for (size_t n = 0 ; n < flag.handler.arity; ++n) { if (pos == end) { -<<<<<<< HEAD - if (flag.arity == ArityAny) break; - throw UsageError("flag '%1%' requires %2% argument(s)", - name, - flag.arity); -======= if (flag.handler.arity == ArityAny) break; throw UsageError("flag '%s' requires %d argument(s)", name, flag.handler.arity); ->>>>>>> master } args.push_back(*pos++); } diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 7e2cca2f9..19c6e35a1 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -2,6 +2,7 @@ #include "ref.hh" +#include "types.hh" #include #include @@ -21,9 +22,6 @@ namespace nix { -using std::list; -using std::vector; - typedef enum { lvlError = 0, lvlWarn, diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index bb7d356c8..39692a291 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -1,6 +1,7 @@ #pragma once #include "types.hh" +#include "error.hh" namespace nix { diff --git a/src/libutil/types.hh b/src/libutil/types.hh index a831b9924..4d783b564 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -13,6 +13,7 @@ namespace nix { using std::list; using std::set; using std::vector; +using std::string; typedef list Strings; typedef set StringSet; diff --git a/src/libutil/url.hh b/src/libutil/url.hh index 1503023a2..a184eadce 100644 --- a/src/libutil/url.hh +++ b/src/libutil/url.hh @@ -1,6 +1,6 @@ #pragma once -#include "types.hh" +#include "error.hh" #include diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 8207ff701..ac7c2967b 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -276,7 +276,7 @@ DirEntries readDirectory(DIR *dir, const Path & path) DirEntries readDirectory(const Path & path) { AutoCloseDir dir(opendir(path.c_str())); - if (!dir) throw SysError(format("opening directory '%1%'") % path); + if (!dir) throw SysError("opening directory '%1%'", path); return readDirectory(dir.get(), path); } @@ -306,7 +306,7 @@ string readFile(const Path & path) { AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); if (!fd) - throw SysError(format("opening file '%1%'") % path); + throw SysError("opening file '%1%'", path); return readFile(fd.get()); } @@ -394,15 +394,15 @@ static void _deletePath(int parentfd, const Path & path, unsigned long long & by const auto PERM_MASK = S_IRUSR | S_IWUSR | S_IXUSR; if ((st.st_mode & PERM_MASK) != PERM_MASK) { if (fchmodat(parentfd, name.c_str(), st.st_mode | PERM_MASK, 0) == -1) - throw SysError(format("chmod '%1%'") % path); + throw SysError("chmod '%1%'", path); } int fd = openat(parentfd, path.c_str(), O_RDONLY); if (!fd) - throw SysError(format("opening directory '%1%'") % path); + throw SysError("opening directory '%1%'", path); AutoCloseDir dir(fdopendir(fd)); if (!dir) - throw SysError(format("opening directory '%1%'") % path); + throw SysError("opening directory '%1%'", path); for (auto & i : readDirectory(dir.get(), path)) _deletePath(dirfd(dir.get()), path + "/" + i.name, bytesFreed); } @@ -426,7 +426,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed) // for backwards compatibility. if (errno == ENOENT) return; - throw SysError(format("opening directory '%1%'") % path); + throw SysError("opening directory '%1%'", path); } _deletePath(dirfd.get(), path, bytesFreed); @@ -845,7 +845,7 @@ int Pid::kill() { assert(pid != -1); - debug(format("killing process %1%") % pid); + debug("killing process %1%", pid); /* Send the requested signal to the child. If it has its own process group, send the signal to every process in the child @@ -903,7 +903,7 @@ pid_t Pid::release() void killUser(uid_t uid) { - debug(format("killing all processes running under uid '%1%'") % uid); + debug("killing all processes running under uid '%1%'", uid); assert(uid != 0); /* just to be safe... */ From 631642c5b40032a087b8e2e131b2ebcac00913d3 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 11 May 2020 16:58:08 -0600 Subject: [PATCH 036/120] new format for pos --- src/libexpr/parser.y | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 82d5753ab..6d50d74ba 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -64,15 +64,23 @@ namespace nix { static void dupAttr(const AttrPath & attrPath, const Pos & pos, const Pos & prevPos) { - throw ParseError("attribute '%1%' at %2% already defined at %3%", - showAttrPath(attrPath), pos, prevPos); + throw ParseError( + ErrorInfo { + .hint = hintfmt("attribute '%1%' already defined at %2%", + showAttrPath(attrPath), prevPos), + .nixCode = NixCode { .errPos = pos }, + }); } static void dupAttr(Symbol attr, const Pos & pos, const Pos & prevPos) { - throw ParseError("attribute '%1%' at %2% already defined at %3%", - attr, pos, prevPos); + throw ParseError( + ErrorInfo { + .hint = hintfmt("attribute '%1%' already defined at %2%", + attr, prevPos), + .nixCode = NixCode { .errPos = pos }, + }); } @@ -140,8 +148,12 @@ static void addAttr(ExprAttrs * attrs, AttrPath & attrPath, static void addFormal(const Pos & pos, Formals * formals, const Formal & formal) { if (!formals->argNames.insert(formal.name).second) - throw ParseError("duplicate formal function argument '%1%' at %2%", - formal.name, pos); + throw ParseError( + ErrorInfo { + .hint = hintfmt("duplicate formal function argument '%1%'", + formal.name), + .nixCode = NixCode { .errPos = pos }, + }); formals->formals.push_front(formal); } @@ -327,7 +339,11 @@ expr_function { $$ = new ExprWith(CUR_POS, $2, $4); } | LET binds IN expr_function { if (!$2->dynamicAttrs.empty()) - throw ParseError("dynamic attributes not allowed in let at %1%", CUR_POS); + throw ParseError( + ErrorInfo { + .hint = hintfmt("dynamic attributes not allowed in let"), + .nixCode = NixCode { .errPos = CUR_POS }, + }); $$ = new ExprLet($2, $4); } | expr_if @@ -479,8 +495,11 @@ attrs $$->push_back(AttrName(str->s)); delete str; } else - throw ParseError("dynamic attributes not allowed in inherit at %1%", - makeCurPos(@2, data)); + throw ParseError( + ErrorInfo { + .hint = hintfmt("dynamic attributes not allowed in inherit"), + .nixCode = NixCode { .errPos = makeCurPos(@2, data) }, + }); } | { $$ = new AttrPath; } ; From 7c3138844ca9ab92e2f231a7d17d7aee420ae76e Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 11 May 2020 17:34:57 -0600 Subject: [PATCH 037/120] more pos reporting --- src/libexpr/nixexpr.cc | 8 ++++++-- src/libexpr/parser.y | 8 +++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index a9955f6df..91a508305 100644 --- a/src/libexpr/nixexpr.cc +++ b/src/libexpr/nixexpr.cc @@ -267,8 +267,12 @@ void ExprVar::bindVars(const StaticEnv & env) /* Otherwise, the variable must be obtained from the nearest enclosing `with'. If there is no `with', then we can issue an "undefined variable" error now. */ - if (withLevel == -1) throw UndefinedVarError("undefined variable '%1%' at %2%", name, pos); - + if (withLevel == -1) + throw UndefinedVarError( + ErrorInfo { + .hint = hintfmt("undefined variable '%1%'", name), + .nixCode = NixCode { .errPos = pos } + }); fromWith = true; this->level = withLevel; } diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 6d50d74ba..3ae7bbafd 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -31,7 +31,7 @@ namespace nix { Expr * result; Path basePath; Symbol path; - string error; + ErrorInfo error; Symbol sLetBody; ParseData(EvalState & state) : state(state) @@ -261,8 +261,10 @@ static inline Pos makeCurPos(const YYLTYPE & loc, ParseData * data) void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * error) { - data->error = (format("%1%, at %2%") - % error % makeCurPos(*loc, data)).str(); + data->error = ErrorInfo { + .hint = hintfmt(error), + .nixCode = NixCode { .errPos = makeCurPos(*loc, data) } + }; } From ec870b9c853ad86fb1ccb482ca87802f1b155a2c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 12 May 2020 10:52:26 -0600 Subject: [PATCH 038/120] new pos format for more errors --- src/libexpr/eval.cc | 11 ++++++++--- src/libexpr/nixexpr.hh | 6 +++++- src/libexpr/primops/fetchTree.cc | 23 +++++++++++++++++------ src/libexpr/primops/fromTOML.cc | 6 +++++- src/libstore/local-store.cc | 1 - 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 65071206f..7af665118 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -529,7 +529,12 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, con LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, const Pos & p1, const Pos & p2)) { - throw EvalError(s, sym, p1, p2); + // p1 is where the error occurred; p2 is a position mentioned in the message. + throw EvalError( + ErrorInfo { + .hint = hintfmt(s, sym, p2), + .nixCode = NixCode { .errPos = p1 } + }); } LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos)) @@ -638,7 +643,7 @@ inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval) return j->value; } if (!env->prevWith) - throwUndefinedVarError("undefined variable '%1%' at %2%", var.name, var.pos); + throwUndefinedVarError("undefined variable '%1%'", var.name, var.pos); for (size_t l = env->prevWith; l; --l, env = env->up) ; } } @@ -950,7 +955,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v) Symbol nameSym = state.symbols.create(nameVal.string.s); Bindings::iterator j = v.attrs->find(nameSym); if (j != v.attrs->end()) - throwEvalError("dynamic attribute '%1%' at %2% already defined at %3%", nameSym, i.pos, *j->pos); + throwEvalError("dynamic attribute '%1%' already defined at %2%", nameSym, i.pos, *j->pos); i.valueExpr->setName(nameSym); /* Keep sorted order so find can catch duplicates */ diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index a185d5785..47d0e85ec 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -236,7 +236,11 @@ struct ExprLambda : Expr : pos(pos), arg(arg), matchAttrs(matchAttrs), formals(formals), body(body) { if (!arg.empty() && formals && formals->argNames.find(arg) != formals->argNames.end()) - throw ParseError("duplicate formal function argument '%1%' at %2%", arg, pos); + throw ParseError( + ErrorInfo { + .hint = hintfmt("duplicate formal function argument '%1%'", arg), + .nixCode = NixCode { .errPos = pos } + }); }; void setName(Symbol & name); string showNamePos() const; diff --git a/src/libexpr/primops/fetchTree.cc b/src/libexpr/primops/fetchTree.cc index c5a0d9886..af3b61d6a 100644 --- a/src/libexpr/primops/fetchTree.cc +++ b/src/libexpr/primops/fetchTree.cc @@ -66,7 +66,11 @@ static void prim_fetchTree(EvalState & state, const Pos & pos, Value * * args, V } if (!attrs.count("type")) - throw Error("attribute 'type' is missing in call to 'fetchTree', at %s", pos); + throw Error( + ErrorInfo { + .hint = hintfmt("attribute 'type' is missing in call to 'fetchTree'"), + .nixCode = NixCode { .errPos = pos } + }); input = fetchers::inputFromAttrs(attrs); } else @@ -107,13 +111,20 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v, else if (n == "name") name = state.forceStringNoCtx(*attr.value, *attr.pos); else - throw EvalError("unsupported argument '%s' to '%s', at %s", - attr.name, who, *attr.pos); - } + throw EvalError( + ErrorInfo { + .hint = hintfmt("unsupported argument '%s' to '%s'", + attr.name, who), + .nixCode = NixCode { .errPos = *attr.pos } + }); + } if (!url) - throw EvalError("'url' argument required, at %s", pos); - + throw EvalError( + ErrorInfo { + .hint = hintfmt("'url' argument required"), + .nixCode = NixCode { .errPos = pos } + }); } else url = state.forceStringNoCtx(*args[0], pos); diff --git a/src/libexpr/primops/fromTOML.cc b/src/libexpr/primops/fromTOML.cc index c43324dbb..948069401 100644 --- a/src/libexpr/primops/fromTOML.cc +++ b/src/libexpr/primops/fromTOML.cc @@ -81,7 +81,11 @@ static void prim_fromTOML(EvalState & state, const Pos & pos, Value * * args, Va try { visit(v, parser(tomlStream).parse()); } catch (std::runtime_error & e) { - throw EvalError("while parsing a TOML string at %s: %s", pos, e.what()); + throw EvalError( + ErrorInfo { + .hint = hintfmt("while parsing a TOML string: %s", e.what()), + .nixCode = NixCode { .errPos = pos } + }); } } diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index eb7548543..1f16a22b1 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -6,7 +6,6 @@ #include "derivations.hh" #include "nar-info.hh" #include "references.hh" -#include "error.hh" #include #include From 2a19bf86197083e17d9b35596c21e3c1b3f4a170 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 12 May 2020 11:27:37 -0600 Subject: [PATCH 039/120] move pos to the first arg, to indicate its not used in a fmt template --- src/libexpr/eval-inline.hh | 10 +++---- src/libexpr/eval.cc | 58 +++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh index e6b838665..eee49e02e 100644 --- a/src/libexpr/eval-inline.hh +++ b/src/libexpr/eval-inline.hh @@ -7,7 +7,7 @@ namespace nix { -LocalNoInlineNoReturn(void throwEvalError(const char * s, const Pos & pos)) +LocalNoInlineNoReturn(void throwEvalError(const Pos & pos, const char * s)) { throw EvalError( ErrorInfo { @@ -22,7 +22,7 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v)) } -LocalNoInlineNoReturn(void throwTypeError(const char * s, const Value & v, const Pos & pos)) +LocalNoInlineNoReturn(void throwTypeError(const Pos & pos, const char * s, const Value & v)) { throw TypeError( ErrorInfo { @@ -51,7 +51,7 @@ void EvalState::forceValue(Value & v, const Pos & pos) else if (v.type == tApp) callFunction(*v.app.left, *v.app.right, v, noPos); else if (v.type == tBlackhole) - throwEvalError("infinite recursion encountered", pos); + throwEvalError(pos, "infinite recursion encountered"); } @@ -67,7 +67,7 @@ inline void EvalState::forceAttrs(Value & v, const Pos & pos) { forceValue(v, pos); if (v.type != tAttrs) - throwTypeError("value is %1% while a set was expected", v, pos); + throwTypeError(pos, "value is %1% while a set was expected", v); } @@ -83,7 +83,7 @@ inline void EvalState::forceList(Value & v, const Pos & pos) { forceValue(v, pos); if (!v.isList()) - throwTypeError("value is %1% while a list was expected", v, pos); + throwTypeError(pos, "value is %1% while a list was expected", v); } /* Note: Various places expect the allocated memory to be zeroed. */ diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 7af665118..e4bc6dc83 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -504,7 +504,7 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2)) throw EvalError(s, s2); } -LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const Pos & pos)) +LocalNoInlineNoReturn(void throwEvalError(const Pos & pos, const char * s, const string & s2)) { throw EvalError( ErrorInfo { @@ -518,7 +518,7 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, con throw EvalError(s, s2, s3); } -LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, const string & s3, const Pos & pos)) +LocalNoInlineNoReturn(void throwEvalError(const Pos & pos, const char * s, const string & s2, const string & s3)) { throw EvalError( ErrorInfo { @@ -527,7 +527,7 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const string & s2, con }); } -LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, const Pos & p1, const Pos & p2)) +LocalNoInlineNoReturn(void throwEvalError(const Pos & p1, const char * s, const Symbol & sym, const Pos & p2)) { // p1 is where the error occurred; p2 is a position mentioned in the message. throw EvalError( @@ -537,7 +537,7 @@ LocalNoInlineNoReturn(void throwEvalError(const char * s, const Symbol & sym, co }); } -LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos)) +LocalNoInlineNoReturn(void throwTypeError(const Pos & pos, const char * s)) { throw TypeError( ErrorInfo { @@ -551,7 +551,7 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s1)) throw TypeError(s, s1); } -LocalNoInlineNoReturn(void throwTypeError(const char * s, const ExprLambda & fun, const Symbol & s2, const Pos & pos)) +LocalNoInlineNoReturn(void throwTypeError(const Pos & pos, const char * s, const ExprLambda & fun, const Symbol & s2)) { throw TypeError( ErrorInfo { @@ -560,7 +560,7 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const ExprLambda & fun }); } -LocalNoInlineNoReturn(void throwAssertionError(const char * s, const string & s1, const Pos & pos)) +LocalNoInlineNoReturn(void throwAssertionError(const Pos & pos, const char * s, const string & s1)) { throw AssertionError( ErrorInfo { @@ -569,7 +569,7 @@ LocalNoInlineNoReturn(void throwAssertionError(const char * s, const string & s1 }); } -LocalNoInlineNoReturn(void throwUndefinedVarError(const char * s, const string & s1, const Pos & pos)) +LocalNoInlineNoReturn(void throwUndefinedVarError(const Pos & pos, const char * s, const string & s1)) { throw UndefinedVarError( ErrorInfo { @@ -643,7 +643,7 @@ inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval) return j->value; } if (!env->prevWith) - throwUndefinedVarError("undefined variable '%1%'", var.name, var.pos); + throwUndefinedVarError(var.pos, "undefined variable '%1%'", var.name); for (size_t l = env->prevWith; l; --l, env = env->up) ; } } @@ -841,7 +841,7 @@ inline bool EvalState::evalBool(Env & env, Expr * e, const Pos & pos) Value v; e->eval(*this, env, v); if (v.type != tBool) - throwTypeError("value is %1% while a Boolean was expected", v, pos); + throwTypeError(pos, "value is %1% while a Boolean was expected", v); return v.boolean; } @@ -955,7 +955,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v) Symbol nameSym = state.symbols.create(nameVal.string.s); Bindings::iterator j = v.attrs->find(nameSym); if (j != v.attrs->end()) - throwEvalError("dynamic attribute '%1%' already defined at %2%", nameSym, i.pos, *j->pos); + throwEvalError(i.pos, "dynamic attribute '%1%' already defined at %2%", nameSym, *j->pos); i.valueExpr->setName(nameSym); /* Keep sorted order so find can catch duplicates */ @@ -1043,7 +1043,7 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v) } else { state.forceAttrs(*vAttrs, pos); if ((j = vAttrs->attrs->find(name)) == vAttrs->attrs->end()) - throwEvalError("attribute '%1%' missing", name, pos); + throwEvalError(pos, "attribute '%1%' missing", name); } vAttrs = j->value; pos2 = j->pos; @@ -1169,7 +1169,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po } if (fun.type != tLambda) - throwTypeError("attempt to call something which is not a function but %1%", fun, pos); + throwTypeError(pos, "attempt to call something which is not a function but %1%", fun); ExprLambda & lambda(*fun.lambda.fun); @@ -1197,8 +1197,8 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po for (auto & i : lambda.formals->formals) { Bindings::iterator j = arg.attrs->find(i.name); if (j == arg.attrs->end()) { - if (!i.def) throwTypeError("%1% called without required argument '%2%'", - lambda, i.name, pos); + if (!i.def) throwTypeError(pos, "%1% called without required argument '%2%'", + lambda, i.name); env2.values[displ++] = i.def->maybeThunk(*this, env2); } else { attrsUsed++; @@ -1213,7 +1213,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po user. */ for (auto & i : *arg.attrs) if (lambda.formals->argNames.find(i.name) == lambda.formals->argNames.end()) - throwTypeError("%1% called with unexpected argument '%2%'", lambda, i.name, pos); + throwTypeError(pos, "%1% called with unexpected argument '%2%'", lambda, i.name); abort(); // can't happen } } @@ -1302,7 +1302,7 @@ void ExprAssert::eval(EvalState & state, Env & env, Value & v) if (!state.evalBool(env, cond, pos)) { std::ostringstream out; cond->show(out); - throwAssertionError("assertion '%1%' failed at %2%", out.str(), pos); + throwAssertionError(pos, "assertion '%1%' failed at %2%", out.str()); } body->eval(state, env, v); } @@ -1454,14 +1454,14 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v) nf = n; nf += vTmp.fpoint; } else - throwEvalError("cannot add %1% to an integer", showType(vTmp), pos); + throwEvalError(pos, "cannot add %1% to an integer", showType(vTmp)); } else if (firstType == tFloat) { if (vTmp.type == tInt) { nf += vTmp.integer; } else if (vTmp.type == tFloat) { nf += vTmp.fpoint; } else - throwEvalError("cannot add %1% to a float", showType(vTmp), pos); + throwEvalError(pos, "cannot add %1% to a float", showType(vTmp)); } else s << state.coerceToString(pos, vTmp, context, false, firstType == tString); } @@ -1472,7 +1472,7 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v) mkFloat(v, nf); else if (firstType == tPath) { if (!context.empty()) - throwEvalError("a string that refers to a store path cannot be appended to a path", pos); + throwEvalError(pos, "a string that refers to a store path cannot be appended to a path"); auto path = canonPath(s.str()); mkPath(v, path.c_str()); } else @@ -1521,7 +1521,7 @@ NixInt EvalState::forceInt(Value & v, const Pos & pos) { forceValue(v, pos); if (v.type != tInt) - throwTypeError("value is %1% while an integer was expected", v, pos); + throwTypeError(pos, "value is %1% while an integer was expected", v); return v.integer; } @@ -1532,7 +1532,7 @@ NixFloat EvalState::forceFloat(Value & v, const Pos & pos) if (v.type == tInt) return v.integer; else if (v.type != tFloat) - throwTypeError("value is %1% while a float was expected", v, pos); + throwTypeError(pos, "value is %1% while a float was expected", v); return v.fpoint; } @@ -1541,7 +1541,7 @@ bool EvalState::forceBool(Value & v, const Pos & pos) { forceValue(v, pos); if (v.type != tBool) - throwTypeError("value is %1% while a Boolean was expected", v, pos); + throwTypeError(pos, "value is %1% while a Boolean was expected", v); return v.boolean; } @@ -1556,7 +1556,7 @@ void EvalState::forceFunction(Value & v, const Pos & pos) { forceValue(v, pos); if (v.type != tLambda && v.type != tPrimOp && v.type != tPrimOpApp && !isFunctor(v)) - throwTypeError("value is %1% while a function was expected", v, pos); + throwTypeError(pos, "value is %1% while a function was expected", v); } @@ -1565,7 +1565,7 @@ string EvalState::forceString(Value & v, const Pos & pos) forceValue(v, pos); if (v.type != tString) { if (pos) - throwTypeError("value is %1% while a string was expected", v, pos); + throwTypeError(pos, "value is %1% while a string was expected", v); else throwTypeError("value is %1% while a string was expected", v); } @@ -1594,8 +1594,8 @@ string EvalState::forceStringNoCtx(Value & v, const Pos & pos) string s = forceString(v, pos); if (v.string.context) { if (pos) - throwEvalError("the string '%1%' is not allowed to refer to a store path (such as '%2%')", - v.string.s, v.string.context[0], pos); + throwEvalError(pos, "the string '%1%' is not allowed to refer to a store path (such as '%2%')", + v.string.s, v.string.context[0]); else throwEvalError("the string '%1%' is not allowed to refer to a store path (such as '%2%')", v.string.s, v.string.context[0]); @@ -1651,7 +1651,7 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context, return *maybeString; } auto i = v.attrs->find(sOutPath); - if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string", pos); + if (i == v.attrs->end()) throwTypeError(pos, "cannot coerce a set to a string"); return coerceToString(pos, *i->value, context, coerceMore, copyToStore); } @@ -1682,7 +1682,7 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context, } } - throwTypeError("cannot coerce %1% to a string", v, pos); + throwTypeError(pos, "cannot coerce %1% to a string", v); } @@ -1713,7 +1713,7 @@ Path EvalState::coerceToPath(const Pos & pos, Value & v, PathSet & context) { string path = coerceToString(pos, v, context, false, false); if (path == "" || path[0] != '/') - throwEvalError("string '%1%' doesn't represent an absolute path", path, pos); + throwEvalError(pos, "string '%1%' doesn't represent an absolute path", path); return path; } From 19cffc29c995af8fb155f2764664f0b079879b4f Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 12 May 2020 12:09:12 -0600 Subject: [PATCH 040/120] remove unused extra json fields --- src/libstore/local-store.cc | 1 - src/libstore/remote-store.cc | 9 --------- src/libutil/logging.cc | 24 ------------------------ 3 files changed, 34 deletions(-) diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 1f16a22b1..63a825af0 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -1364,7 +1364,6 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store, auto state(_state.lock()); invalidatePath(*state, path); } else { - // TODO log as warning if repair successful?? logError( ErrorInfo { .name = "Missing path with referrers", diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 7c50c1065..cc336e460 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -780,15 +780,6 @@ std::exception_ptr RemoteStore::Connection::processStderr(Sink * sink, Source * } else if (msg == STDERR_NEXT) - // TODO: is this really an ErrorInfo error? Seems like we're forwarding the - // stderr output of the remote to current stderr/log - // ErrorInfo gets lost in this scenario. - // An alternative might be a logger on the remote that forwards ErrorInfo and etc. - // logError( - // ErrorInfo { - // // .name = "Remote Store" TODO reasonable name. - // .hint = hintfmt(chomp(readString(from))) - // }); printError(chomp(readString(from))); else if (msg == STDERR_START_ACTIVITY) { diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 7c75456ee..736ce604e 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -150,7 +150,6 @@ struct JSONLogger : Logger { void logEI(const ErrorInfo & ei) override { - // add fields like Pos info and etc? std::ostringstream oss; oss << ei; @@ -159,29 +158,6 @@ struct JSONLogger : Logger { json["level"] = ei.level; json["msg"] = oss.str(); - // Extra things that COULD go into json. Useful? - // TODO: decide if useful. - // TODO: make a json obj that goes into json["msg"]? - json["name"] = ei.name; - json["description"] = ei.description; - if (ei.hint.has_value()) { - json["hint"] = ei.hint->str(); - } - if (ei.nixCode.has_value()) { - if (ei.nixCode->errPos.line != 0) - json["line"] = ei.nixCode->errPos.line; - if (ei.nixCode->errPos.column != 0) - json["column"] = ei.nixCode->errPos.column; - if (ei.nixCode->errPos.file != "") - json["file"] = ei.nixCode->errPos.file; - if (ei.nixCode->prevLineOfCode.has_value()) - json["prevLineOfCode"] = *ei.nixCode->prevLineOfCode; - if (ei.nixCode->errLineOfCode.has_value()) - json["errLineOfCode"] = *ei.nixCode->errLineOfCode; - if (ei.nixCode->nextLineOfCode.has_value()) - json["nextLineOfCode"] = *ei.nixCode->nextLineOfCode; - } - write(json); } From d608793e4feb79fe615e3071c7ce561dd2dea0a2 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 12 May 2020 12:09:57 -0600 Subject: [PATCH 041/120] remove uncrustify cfg --- .uncrustify.cfg | 2990 ----------------------------------------------- 1 file changed, 2990 deletions(-) delete mode 100644 .uncrustify.cfg diff --git a/.uncrustify.cfg b/.uncrustify.cfg deleted file mode 100644 index 6bf91ec3c..000000000 --- a/.uncrustify.cfg +++ /dev/null @@ -1,2990 +0,0 @@ -# Uncrustify-0.70.1_f - -# -# General options -# - -# The type of line endings. -# -# Default: auto -newlines = auto # lf/crlf/cr/auto - -# The original size of tabs in the input. -# -# Default: 8 -input_tab_size = 4 # unsigned number - -# The size of tabs in the output (only used if align_with_tabs=true). -# -# Default: 8 -output_tab_size = 4 # unsigned number - -# The ASCII value of the string escape char, usually 92 (\) or (Pawn) 94 (^). -# -# Default: 92 -string_escape_char = 92 # unsigned number - -# Alternate string escape char (usually only used for Pawn). -# Only works right before the quote char. -string_escape_char2 = 0 # unsigned number - -# Replace tab characters found in string literals with the escape sequence \t -# instead. -string_replace_tab_chars = false # true/false - -# Allow interpreting '>=' and '>>=' as part of a template in code like -# 'void f(list>=val);'. If true, 'assert(x<0 && y>=3)' will be broken. -# Improvements to template detection may make this option obsolete. -tok_split_gte = false # true/false - -# Specify the marker used in comments to disable processing of part of the -# file. -# -# Default: *INDENT-OFF* -disable_processing_cmt = " *INDENT-OFF*" # string - -# Specify the marker used in comments to (re)enable processing in a file. -# -# Default: *INDENT-ON* -enable_processing_cmt = " *INDENT-ON*" # string - -# Enable parsing of digraphs. -enable_digraphs = false # true/false - -# Add or remove the UTF-8 BOM (recommend 'remove'). -utf8_bom = ignore # ignore/add/remove/force - -# If the file contains bytes with values between 128 and 255, but is not -# UTF-8, then output as UTF-8. -utf8_byte = false # true/false - -# Force the output encoding to UTF-8. -utf8_force = false # true/false - -# Add or remove space between 'do' and '{'. -sp_do_brace_open = ignore # ignore/add/remove/force - -# Add or remove space between '}' and 'while'. -sp_brace_close_while = ignore # ignore/add/remove/force - -# Add or remove space between 'while' and '('. -sp_while_paren_open = ignore # ignore/add/remove/force - -# -# Spacing options -# - -# Add or remove space around non-assignment symbolic operators ('+', '/', '%', -# '<<', and so forth). -sp_arith = ignore # ignore/add/remove/force - -# Add or remove space around arithmetic operators '+' and '-'. -# -# Overrides sp_arith. -sp_arith_additive = ignore # ignore/add/remove/force - -# Add or remove space around assignment operator '=', '+=', etc. -sp_assign = ignore # ignore/add/remove/force - -# Add or remove space around '=' in C++11 lambda capture specifications. -# -# Overrides sp_assign. -sp_cpp_lambda_assign = ignore # ignore/add/remove/force - -# Add or remove space after the capture specification of a C++11 lambda when -# an argument list is present, as in '[] (int x){ ... }'. -sp_cpp_lambda_square_paren = ignore # ignore/add/remove/force - -# Add or remove space after the capture specification of a C++11 lambda with -# no argument list is present, as in '[] { ... }'. -sp_cpp_lambda_square_brace = remove # ignore/add/remove/force - -# Add or remove space after the argument list of a C++11 lambda, as in -# '[](int x) { ... }'. -sp_cpp_lambda_paren_brace = ignore # ignore/add/remove/force - -# Add or remove space between a lambda body and its call operator of an -# immediately invoked lambda, as in '[]( ... ){ ... } ( ... )'. -sp_cpp_lambda_fparen = ignore # ignore/add/remove/force - -# Add or remove space around assignment operator '=' in a prototype. -# -# If set to ignore, use sp_assign. -sp_assign_default = ignore # ignore/add/remove/force - -# Add or remove space before assignment operator '=', '+=', etc. -# -# Overrides sp_assign. -sp_before_assign = ignore # ignore/add/remove/force - -# Add or remove space after assignment operator '=', '+=', etc. -# -# Overrides sp_assign. -sp_after_assign = ignore # ignore/add/remove/force - -# Add or remove space in 'NS_ENUM ('. -sp_enum_paren = ignore # ignore/add/remove/force - -# Add or remove space around assignment '=' in enum. -sp_enum_assign = ignore # ignore/add/remove/force - -# Add or remove space before assignment '=' in enum. -# -# Overrides sp_enum_assign. -sp_enum_before_assign = ignore # ignore/add/remove/force - -# Add or remove space after assignment '=' in enum. -# -# Overrides sp_enum_assign. -sp_enum_after_assign = ignore # ignore/add/remove/force - -# Add or remove space around assignment ':' in enum. -sp_enum_colon = ignore # ignore/add/remove/force - -# Add or remove space around preprocessor '##' concatenation operator. -# -# Default: add -sp_pp_concat = add # ignore/add/remove/force - -# Add or remove space after preprocessor '#' stringify operator. -# Also affects the '#@' charizing operator. -sp_pp_stringify = ignore # ignore/add/remove/force - -# Add or remove space before preprocessor '#' stringify operator -# as in '#define x(y) L#y'. -sp_before_pp_stringify = ignore # ignore/add/remove/force - -# Add or remove space around boolean operators '&&' and '||'. -sp_bool = ignore # ignore/add/remove/force - -# Add or remove space around compare operator '<', '>', '==', etc. -sp_compare = ignore # ignore/add/remove/force - -# Add or remove space inside '(' and ')'. -sp_inside_paren = ignore # ignore/add/remove/force - -# Add or remove space between nested parentheses, i.e. '((' vs. ') )'. -sp_paren_paren = ignore # ignore/add/remove/force - -# Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('. -sp_cparen_oparen = ignore # ignore/add/remove/force - -# Whether to balance spaces inside nested parentheses. -sp_balance_nested_parens = false # true/false - -# Add or remove space between ')' and '{'. -sp_paren_brace = ignore # ignore/add/remove/force - -# Add or remove space between nested braces, i.e. '{{' vs '{ {'. -sp_brace_brace = ignore # ignore/add/remove/force - -# Add or remove space before pointer star '*'. -sp_before_ptr_star = ignore # ignore/add/remove/force - -# Add or remove space before pointer star '*' that isn't followed by a -# variable name. If set to ignore, sp_before_ptr_star is used instead. -sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force - -# Add or remove space between pointer stars '*'. -sp_between_ptr_star = ignore # ignore/add/remove/force - -# Add or remove space after pointer star '*', if followed by a word. -# -# Overrides sp_type_func. -sp_after_ptr_star = ignore # ignore/add/remove/force - -# Add or remove space after pointer caret '^', if followed by a word. -sp_after_ptr_block_caret = ignore # ignore/add/remove/force - -# Add or remove space after pointer star '*', if followed by a qualifier. -sp_after_ptr_star_qualifier = ignore # ignore/add/remove/force - -# Add or remove space after a pointer star '*', if followed by a function -# prototype or function definition. -# -# Overrides sp_after_ptr_star and sp_type_func. -sp_after_ptr_star_func = ignore # ignore/add/remove/force - -# Add or remove space after a pointer star '*', if followed by an open -# parenthesis, as in 'void* (*)(). -sp_ptr_star_paren = ignore # ignore/add/remove/force - -# Add or remove space before a pointer star '*', if followed by a function -# prototype or function definition. -sp_before_ptr_star_func = ignore # ignore/add/remove/force - -# Add or remove space before a reference sign '&'. -sp_before_byref = ignore # ignore/add/remove/force - -# Add or remove space before a reference sign '&' that isn't followed by a -# variable name. If set to ignore, sp_before_byref is used instead. -sp_before_unnamed_byref = ignore # ignore/add/remove/force - -# Add or remove space after reference sign '&', if followed by a word. -# -# Overrides sp_type_func. -sp_after_byref = ignore # ignore/add/remove/force - -# Add or remove space after a reference sign '&', if followed by a function -# prototype or function definition. -# -# Overrides sp_after_byref and sp_type_func. -sp_after_byref_func = ignore # ignore/add/remove/force - -# Add or remove space before a reference sign '&', if followed by a function -# prototype or function definition. -sp_before_byref_func = ignore # ignore/add/remove/force - -# Add or remove space between type and word. -# -# Default: force -sp_after_type = force # ignore/add/remove/force - -# Add or remove space between 'decltype(...)' and word. -sp_after_decltype = ignore # ignore/add/remove/force - -# (D) Add or remove space before the parenthesis in the D constructs -# 'template Foo(' and 'class Foo('. -sp_before_template_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'template' and '<'. -# If set to ignore, sp_before_angle is used. -sp_template_angle = ignore # ignore/add/remove/force - -# Add or remove space before '<'. -sp_before_angle = ignore # ignore/add/remove/force - -# Add or remove space inside '<' and '>'. -sp_inside_angle = ignore # ignore/add/remove/force - -# Add or remove space inside '<>'. -sp_inside_angle_empty = ignore # ignore/add/remove/force - -# Add or remove space between '>' and ':'. -sp_angle_colon = ignore # ignore/add/remove/force - -# Add or remove space after '>'. -sp_after_angle = ignore # ignore/add/remove/force - -# Add or remove space between '>' and '(' as found in 'new List(foo);'. -sp_angle_paren = ignore # ignore/add/remove/force - -# Add or remove space between '>' and '()' as found in 'new List();'. -sp_angle_paren_empty = ignore # ignore/add/remove/force - -# Add or remove space between '>' and a word as in 'List m;' or -# 'template static ...'. -sp_angle_word = ignore # ignore/add/remove/force - -# Add or remove space between '>' and '>' in '>>' (template stuff). -# -# Default: add -sp_angle_shift = ignore # ignore/add/remove/force - -# (C++11) Permit removal of the space between '>>' in 'foo >'. Note -# that sp_angle_shift cannot remove the space without this option. -sp_permit_cpp11_shift = true # true/false - -# Add or remove space before '(' of control statements ('if', 'for', 'switch', -# 'while', etc.). -sp_before_sparen = ignore # ignore/add/remove/force - -# Add or remove space inside '(' and ')' of control statements. -sp_inside_sparen = ignore # ignore/add/remove/force - -# Add or remove space after '(' of control statements. -# -# Overrides sp_inside_sparen. -sp_inside_sparen_open = ignore # ignore/add/remove/force - -# Add or remove space before ')' of control statements. -# -# Overrides sp_inside_sparen. -sp_inside_sparen_close = ignore # ignore/add/remove/force - -# Add or remove space after ')' of control statements. -sp_after_sparen = ignore # ignore/add/remove/force - -# Add or remove space between ')' and '{' of of control statements. -sp_sparen_brace = ignore # ignore/add/remove/force - -# (D) Add or remove space between 'invariant' and '('. -sp_invariant_paren = ignore # ignore/add/remove/force - -# (D) Add or remove space after the ')' in 'invariant (C) c'. -sp_after_invariant_paren = ignore # ignore/add/remove/force - -# Add or remove space before empty statement ';' on 'if', 'for' and 'while'. -sp_special_semi = ignore # ignore/add/remove/force - -# Add or remove space before ';'. -# -# Default: remove -sp_before_semi = remove # ignore/add/remove/force - -# Add or remove space before ';' in non-empty 'for' statements. -sp_before_semi_for = ignore # ignore/add/remove/force - -# Add or remove space before a semicolon of an empty part of a for statement. -sp_before_semi_for_empty = ignore # ignore/add/remove/force - -# Add or remove space after ';', except when followed by a comment. -# -# Default: add -sp_after_semi = add # ignore/add/remove/force - -# Add or remove space after ';' in non-empty 'for' statements. -# -# Default: force -sp_after_semi_for = force # ignore/add/remove/force - -# Add or remove space after the final semicolon of an empty part of a for -# statement, as in 'for ( ; ; )'. -sp_after_semi_for_empty = ignore # ignore/add/remove/force - -# Add or remove space before '[' (except '[]'). -sp_before_square = ignore # ignore/add/remove/force - -# Add or remove space before '[' for a variable definition. -# -# Default: remove -sp_before_vardef_square = remove # ignore/add/remove/force - -# Add or remove space before '[' for asm block. -sp_before_square_asm_block = ignore # ignore/add/remove/force - -# Add or remove space before '[]'. -sp_before_squares = ignore # ignore/add/remove/force - -# Add or remove space before C++17 structured bindings. -sp_cpp_before_struct_binding = ignore # ignore/add/remove/force - -# Add or remove space inside a non-empty '[' and ']'. -sp_inside_square = ignore # ignore/add/remove/force - -# (OC) Add or remove space inside a non-empty Objective-C boxed array '@[' and -# ']'. If set to ignore, sp_inside_square is used. -sp_inside_square_oc_array = ignore # ignore/add/remove/force - -# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. -sp_after_comma = ignore # ignore/add/remove/force - -# Add or remove space before ','. -# -# Default: remove -sp_before_comma = remove # ignore/add/remove/force - -# (C#) Add or remove space between ',' and ']' in multidimensional array type -# like 'int[,,]'. -sp_after_mdatype_commas = ignore # ignore/add/remove/force - -# (C#) Add or remove space between '[' and ',' in multidimensional array type -# like 'int[,,]'. -sp_before_mdatype_commas = ignore # ignore/add/remove/force - -# (C#) Add or remove space between ',' in multidimensional array type -# like 'int[,,]'. -sp_between_mdatype_commas = ignore # ignore/add/remove/force - -# Add or remove space between an open parenthesis and comma, -# i.e. '(,' vs. '( ,'. -# -# Default: force -sp_paren_comma = force # ignore/add/remove/force - -# Add or remove space before the variadic '...' when preceded by a -# non-punctuator. -sp_before_ellipsis = remove # ignore/add/remove/force - -# Add or remove space between a type and '...'. -sp_type_ellipsis = ignore # ignore/add/remove/force - -# (D) Add or remove space between a type and '?'. -sp_type_question = ignore # ignore/add/remove/force - -# Add or remove space between ')' and '...'. -sp_paren_ellipsis = ignore # ignore/add/remove/force - -# Add or remove space between ')' and a qualifier such as 'const'. -sp_paren_qualifier = ignore # ignore/add/remove/force - -# Add or remove space between ')' and 'noexcept'. -sp_paren_noexcept = ignore # ignore/add/remove/force - -# Add or remove space after class ':'. -sp_after_class_colon = ignore # ignore/add/remove/force - -# Add or remove space before class ':'. -sp_before_class_colon = ignore # ignore/add/remove/force - -# Add or remove space after class constructor ':'. -sp_after_constr_colon = ignore # ignore/add/remove/force - -# Add or remove space before class constructor ':'. -sp_before_constr_colon = ignore # ignore/add/remove/force - -# Add or remove space before case ':'. -# -# Default: remove -sp_before_case_colon = remove # ignore/add/remove/force - -# Add or remove space between 'operator' and operator sign. -sp_after_operator = ignore # ignore/add/remove/force - -# Add or remove space between the operator symbol and the open parenthesis, as -# in 'operator ++('. -sp_after_operator_sym = ignore # ignore/add/remove/force - -# Overrides sp_after_operator_sym when the operator has no arguments, as in -# 'operator *()'. -sp_after_operator_sym_empty = ignore # ignore/add/remove/force - -# Add or remove space after C/D cast, i.e. 'cast(int)a' vs. 'cast(int) a' or -# '(int)a' vs. '(int) a'. -sp_after_cast = ignore # ignore/add/remove/force - -# Add or remove spaces inside cast parentheses. -sp_inside_paren_cast = ignore # ignore/add/remove/force - -# Add or remove space between the type and open parenthesis in a C++ cast, -# i.e. 'int(exp)' vs. 'int (exp)'. -sp_cpp_cast_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'sizeof' and '('. -sp_sizeof_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'sizeof' and '...'. -sp_sizeof_ellipsis = ignore # ignore/add/remove/force - -# Add or remove space between 'sizeof...' and '('. -sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'decltype' and '('. -sp_decltype_paren = ignore # ignore/add/remove/force - -# (Pawn) Add or remove space after the tag keyword. -sp_after_tag = ignore # ignore/add/remove/force - -# Add or remove space inside enum '{' and '}'. -sp_inside_braces_enum = ignore # ignore/add/remove/force - -# Add or remove space inside struct/union '{' and '}'. -sp_inside_braces_struct = ignore # ignore/add/remove/force - -# (OC) Add or remove space inside Objective-C boxed dictionary '{' and '}' -sp_inside_braces_oc_dict = ignore # ignore/add/remove/force - -# Add or remove space after open brace in an unnamed temporary -# direct-list-initialization. -sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force - -# Add or remove space before close brace in an unnamed temporary -# direct-list-initialization. -sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force - -# Add or remove space inside an unnamed temporary direct-list-initialization. -sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force - -# Add or remove space inside '{' and '}'. -sp_inside_braces = ignore # ignore/add/remove/force - -# Add or remove space inside '{}'. -sp_inside_braces_empty = ignore # ignore/add/remove/force - -# Add or remove space around trailing return operator '->'. -sp_trailing_return = ignore # ignore/add/remove/force - -# Add or remove space between return type and function name. A minimum of 1 -# is forced except for pointer return types. -sp_type_func = ignore # ignore/add/remove/force - -# Add or remove space between type and open brace of an unnamed temporary -# direct-list-initialization. -sp_type_brace_init_lst = ignore # ignore/add/remove/force - -# Add or remove space between function name and '(' on function declaration. -sp_func_proto_paren = ignore # ignore/add/remove/force - -# Add or remove space between function name and '()' on function declaration -# without parameters. -sp_func_proto_paren_empty = ignore # ignore/add/remove/force - -# Add or remove space between function name and '(' with a typedef specifier. -sp_func_type_paren = ignore # ignore/add/remove/force - -# Add or remove space between alias name and '(' of a non-pointer function type typedef. -sp_func_def_paren = ignore # ignore/add/remove/force - -# Add or remove space between function name and '()' on function definition -# without parameters. -sp_func_def_paren_empty = ignore # ignore/add/remove/force - -# Add or remove space inside empty function '()'. -# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. -sp_inside_fparens = ignore # ignore/add/remove/force - -# Add or remove space inside function '(' and ')'. -sp_inside_fparen = ignore # ignore/add/remove/force - -# Add or remove space inside the first parentheses in a function type, as in -# 'void (*x)(...)'. -sp_inside_tparen = ignore # ignore/add/remove/force - -# Add or remove space between the ')' and '(' in a function type, as in -# 'void (*x)(...)'. -sp_after_tparen_close = ignore # ignore/add/remove/force - -# Add or remove space between ']' and '(' when part of a function call. -sp_square_fparen = ignore # ignore/add/remove/force - -# Add or remove space between ')' and '{' of function. -sp_fparen_brace = ignore # ignore/add/remove/force - -# Add or remove space between ')' and '{' of s function call in object -# initialization. -# -# Overrides sp_fparen_brace. -sp_fparen_brace_initializer = ignore # ignore/add/remove/force - -# (Java) Add or remove space between ')' and '{{' of double brace initializer. -sp_fparen_dbrace = ignore # ignore/add/remove/force - -# Add or remove space between function name and '(' on function calls. -sp_func_call_paren = ignore # ignore/add/remove/force - -# Add or remove space between function name and '()' on function calls without -# parameters. If set to ignore (the default), sp_func_call_paren is used. -sp_func_call_paren_empty = ignore # ignore/add/remove/force - -# Add or remove space between the user function name and '(' on function -# calls. You need to set a keyword to be a user function in the config file, -# like: -# set func_call_user tr _ i18n -sp_func_call_user_paren = ignore # ignore/add/remove/force - -# Add or remove space inside user function '(' and ')'. -sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force - -# Add or remove space between nested parentheses with user functions, -# i.e. '((' vs. '( ('. -sp_func_call_user_paren_paren = ignore # ignore/add/remove/force - -# Add or remove space between a constructor/destructor and the open -# parenthesis. -sp_func_class_paren = ignore # ignore/add/remove/force - -# Add or remove space between a constructor without parameters or destructor -# and '()'. -sp_func_class_paren_empty = ignore # ignore/add/remove/force - -# Add or remove space between 'return' and '('. -sp_return_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'return' and '{'. -sp_return_brace = ignore # ignore/add/remove/force - -# Add or remove space between '__attribute__' and '('. -sp_attribute_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'defined' and '(' in '#if defined (FOO)'. -sp_defined_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'throw' and '(' in 'throw (something)'. -sp_throw_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'throw' and anything other than '(' as in -# '@throw [...];'. -sp_after_throw = ignore # ignore/add/remove/force - -# Add or remove space between 'catch' and '(' in 'catch (something) { }'. -# If set to ignore, sp_before_sparen is used. -sp_catch_paren = ignore # ignore/add/remove/force - -# (OC) Add or remove space between '@catch' and '(' -# in '@catch (something) { }'. If set to ignore, sp_catch_paren is used. -sp_oc_catch_paren = ignore # ignore/add/remove/force - -# (OC) Add or remove space between class name and '(' -# in '@interface className(categoryName):BaseClass' -sp_oc_classname_paren = ignore # ignore/add/remove/force - -# (D) Add or remove space between 'version' and '(' -# in 'version (something) { }'. If set to ignore, sp_before_sparen is used. -sp_version_paren = ignore # ignore/add/remove/force - -# (D) Add or remove space between 'scope' and '(' -# in 'scope (something) { }'. If set to ignore, sp_before_sparen is used. -sp_scope_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'super' and '(' in 'super (something)'. -# -# Default: remove -sp_super_paren = remove # ignore/add/remove/force - -# Add or remove space between 'this' and '(' in 'this (something)'. -# -# Default: remove -sp_this_paren = remove # ignore/add/remove/force - -# Add or remove space between a macro name and its definition. -sp_macro = ignore # ignore/add/remove/force - -# Add or remove space between a macro function ')' and its definition. -sp_macro_func = ignore # ignore/add/remove/force - -# Add or remove space between 'else' and '{' if on the same line. -sp_else_brace = ignore # ignore/add/remove/force - -# Add or remove space between '}' and 'else' if on the same line. -sp_brace_else = ignore # ignore/add/remove/force - -# Add or remove space between '}' and the name of a typedef on the same line. -sp_brace_typedef = ignore # ignore/add/remove/force - -# Add or remove space before the '{' of a 'catch' statement, if the '{' and -# 'catch' are on the same line, as in 'catch (decl) {'. -sp_catch_brace = ignore # ignore/add/remove/force - -# (OC) Add or remove space before the '{' of a '@catch' statement, if the '{' -# and '@catch' are on the same line, as in '@catch (decl) {'. -# If set to ignore, sp_catch_brace is used. -sp_oc_catch_brace = ignore # ignore/add/remove/force - -# Add or remove space between '}' and 'catch' if on the same line. -sp_brace_catch = ignore # ignore/add/remove/force - -# (OC) Add or remove space between '}' and '@catch' if on the same line. -# If set to ignore, sp_brace_catch is used. -sp_oc_brace_catch = ignore # ignore/add/remove/force - -# Add or remove space between 'finally' and '{' if on the same line. -sp_finally_brace = ignore # ignore/add/remove/force - -# Add or remove space between '}' and 'finally' if on the same line. -sp_brace_finally = ignore # ignore/add/remove/force - -# Add or remove space between 'try' and '{' if on the same line. -sp_try_brace = ignore # ignore/add/remove/force - -# Add or remove space between get/set and '{' if on the same line. -sp_getset_brace = ignore # ignore/add/remove/force - -# Add or remove space between a variable and '{' for C++ uniform -# initialization. -# -# Default: add -sp_word_brace = add # ignore/add/remove/force - -# Add or remove space between a variable and '{' for a namespace. -# -# Default: add -sp_word_brace_ns = add # ignore/add/remove/force - -# Add or remove space before the '::' operator. -sp_before_dc = ignore # ignore/add/remove/force - -# Add or remove space after the '::' operator. -sp_after_dc = ignore # ignore/add/remove/force - -# (D) Add or remove around the D named array initializer ':' operator. -sp_d_array_colon = ignore # ignore/add/remove/force - -# Add or remove space after the '!' (not) unary operator. -# -# Default: remove -sp_not = remove # ignore/add/remove/force - -# Add or remove space after the '~' (invert) unary operator. -# -# Default: remove -sp_inv = remove # ignore/add/remove/force - -# Add or remove space after the '&' (address-of) unary operator. This does not -# affect the spacing after a '&' that is part of a type. -# -# Default: remove -sp_addr = remove # ignore/add/remove/force - -# Add or remove space around the '.' or '->' operators. -# -# Default: remove -sp_member = remove # ignore/add/remove/force - -# Add or remove space after the '*' (dereference) unary operator. This does -# not affect the spacing after a '*' that is part of a type. -# -# Default: remove -sp_deref = remove # ignore/add/remove/force - -# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. -# -# Default: remove -sp_sign = remove # ignore/add/remove/force - -# Add or remove space between '++' and '--' the word to which it is being -# applied, as in '(--x)' or 'y++;'. -# -# Default: remove -sp_incdec = remove # ignore/add/remove/force - -# Add or remove space before a backslash-newline at the end of a line. -# -# Default: add -sp_before_nl_cont = add # ignore/add/remove/force - -# (OC) Add or remove space after the scope '+' or '-', as in '-(void) foo;' -# or '+(int) bar;'. -sp_after_oc_scope = ignore # ignore/add/remove/force - -# (OC) Add or remove space after the colon in message specs, -# i.e. '-(int) f:(int) x;' vs. '-(int) f: (int) x;'. -sp_after_oc_colon = ignore # ignore/add/remove/force - -# (OC) Add or remove space before the colon in message specs, -# i.e. '-(int) f: (int) x;' vs. '-(int) f : (int) x;'. -sp_before_oc_colon = ignore # ignore/add/remove/force - -# (OC) Add or remove space after the colon in immutable dictionary expression -# 'NSDictionary *test = @{@"foo" :@"bar"};'. -sp_after_oc_dict_colon = ignore # ignore/add/remove/force - -# (OC) Add or remove space before the colon in immutable dictionary expression -# 'NSDictionary *test = @{@"foo" :@"bar"};'. -sp_before_oc_dict_colon = ignore # ignore/add/remove/force - -# (OC) Add or remove space after the colon in message specs, -# i.e. '[object setValue:1];' vs. '[object setValue: 1];'. -sp_after_send_oc_colon = ignore # ignore/add/remove/force - -# (OC) Add or remove space before the colon in message specs, -# i.e. '[object setValue:1];' vs. '[object setValue :1];'. -sp_before_send_oc_colon = ignore # ignore/add/remove/force - -# (OC) Add or remove space after the (type) in message specs, -# i.e. '-(int)f: (int) x;' vs. '-(int)f: (int)x;'. -sp_after_oc_type = ignore # ignore/add/remove/force - -# (OC) Add or remove space after the first (type) in message specs, -# i.e. '-(int) f:(int)x;' vs. '-(int)f:(int)x;'. -sp_after_oc_return_type = ignore # ignore/add/remove/force - -# (OC) Add or remove space between '@selector' and '(', -# i.e. '@selector(msgName)' vs. '@selector (msgName)'. -# Also applies to '@protocol()' constructs. -sp_after_oc_at_sel = ignore # ignore/add/remove/force - -# (OC) Add or remove space between '@selector(x)' and the following word, -# i.e. '@selector(foo) a:' vs. '@selector(foo)a:'. -sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force - -# (OC) Add or remove space inside '@selector' parentheses, -# i.e. '@selector(foo)' vs. '@selector( foo )'. -# Also applies to '@protocol()' constructs. -sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force - -# (OC) Add or remove space before a block pointer caret, -# i.e. '^int (int arg){...}' vs. ' ^int (int arg){...}'. -sp_before_oc_block_caret = ignore # ignore/add/remove/force - -# (OC) Add or remove space after a block pointer caret, -# i.e. '^int (int arg){...}' vs. '^ int (int arg){...}'. -sp_after_oc_block_caret = ignore # ignore/add/remove/force - -# (OC) Add or remove space between the receiver and selector in a message, -# as in '[receiver selector ...]'. -sp_after_oc_msg_receiver = ignore # ignore/add/remove/force - -# (OC) Add or remove space after '@property'. -sp_after_oc_property = ignore # ignore/add/remove/force - -# (OC) Add or remove space between '@synchronized' and the open parenthesis, -# i.e. '@synchronized(foo)' vs. '@synchronized (foo)'. -sp_after_oc_synchronized = ignore # ignore/add/remove/force - -# Add or remove space around the ':' in 'b ? t : f'. -sp_cond_colon = ignore # ignore/add/remove/force - -# Add or remove space before the ':' in 'b ? t : f'. -# -# Overrides sp_cond_colon. -sp_cond_colon_before = ignore # ignore/add/remove/force - -# Add or remove space after the ':' in 'b ? t : f'. -# -# Overrides sp_cond_colon. -sp_cond_colon_after = ignore # ignore/add/remove/force - -# Add or remove space around the '?' in 'b ? t : f'. -sp_cond_question = ignore # ignore/add/remove/force - -# Add or remove space before the '?' in 'b ? t : f'. -# -# Overrides sp_cond_question. -sp_cond_question_before = ignore # ignore/add/remove/force - -# Add or remove space after the '?' in 'b ? t : f'. -# -# Overrides sp_cond_question. -sp_cond_question_after = ignore # ignore/add/remove/force - -# In the abbreviated ternary form '(a ?: b)', add or remove space between '?' -# and ':'. -# -# Overrides all other sp_cond_* options. -sp_cond_ternary_short = ignore # ignore/add/remove/force - -# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make -# sense here. -sp_case_label = ignore # ignore/add/remove/force - -# (D) Add or remove space around the D '..' operator. -sp_range = ignore # ignore/add/remove/force - -# Add or remove space after ':' in a Java/C++11 range-based 'for', -# as in 'for (Type var : expr)'. -sp_after_for_colon = ignore # ignore/add/remove/force - -# Add or remove space before ':' in a Java/C++11 range-based 'for', -# as in 'for (Type var : expr)'. -sp_before_for_colon = ignore # ignore/add/remove/force - -# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. -sp_extern_paren = ignore # ignore/add/remove/force - -# Add or remove space after the opening of a C++ comment, -# i.e. '// A' vs. '//A'. -sp_cmt_cpp_start = ignore # ignore/add/remove/force - -# If true, space is added with sp_cmt_cpp_start will be added after doxygen -# sequences like '///', '///<', '//!' and '//!<'. -sp_cmt_cpp_doxygen = false # true/false - -# If true, space is added with sp_cmt_cpp_start will be added after Qt -# translator or meta-data comments like '//:', '//=', and '//~'. -sp_cmt_cpp_qttr = false # true/false - -# Add or remove space between #else or #endif and a trailing comment. -sp_endif_cmt = ignore # ignore/add/remove/force - -# Add or remove space after 'new', 'delete' and 'delete[]'. -sp_after_new = ignore # ignore/add/remove/force - -# Add or remove space between 'new' and '(' in 'new()'. -sp_between_new_paren = ignore # ignore/add/remove/force - -# Add or remove space between ')' and type in 'new(foo) BAR'. -sp_after_newop_paren = ignore # ignore/add/remove/force - -# Add or remove space inside parenthesis of the new operator -# as in 'new(foo) BAR'. -sp_inside_newop_paren = ignore # ignore/add/remove/force - -# Add or remove space after the open parenthesis of the new operator, -# as in 'new(foo) BAR'. -# -# Overrides sp_inside_newop_paren. -sp_inside_newop_paren_open = ignore # ignore/add/remove/force - -# Add or remove space before the close parenthesis of the new operator, -# as in 'new(foo) BAR'. -# -# Overrides sp_inside_newop_paren. -sp_inside_newop_paren_close = ignore # ignore/add/remove/force - -# Add or remove space before a trailing or embedded comment. -sp_before_tr_emb_cmt = ignore # ignore/add/remove/force - -# Number of spaces before a trailing or embedded comment. -sp_num_before_tr_emb_cmt = 0 # unsigned number - -# (Java) Add or remove space between an annotation and the open parenthesis. -sp_annotation_paren = ignore # ignore/add/remove/force - -# If true, vbrace tokens are dropped to the previous token and skipped. -sp_skip_vbrace_tokens = false # true/false - -# Add or remove space after 'noexcept'. -sp_after_noexcept = ignore # ignore/add/remove/force - -# Add or remove space after '_'. -sp_vala_after_translation = ignore # ignore/add/remove/force - -# If true, a is inserted after #define. -force_tab_after_define = false # true/false - -# -# Indenting options -# - -# The number of columns to indent per level. Usually 2, 3, 4, or 8. -# -# Default: 8 -indent_columns = 4 # unsigned number - -# The continuation indent. If non-zero, this overrides the indent of '(', '[' -# and '=' continuation indents. Negative values are OK; negative value is -# absolute and not increased for each '(' or '[' level. -# -# For FreeBSD, this is set to 4. -indent_continue = 0 # number - -# The continuation indent, only for class header line(s). If non-zero, this -# overrides the indent of 'class' continuation indents. -indent_continue_class_head = 0 # unsigned number - -# Whether to indent empty lines (i.e. lines which contain only spaces before -# the newline character). -indent_single_newlines = false # true/false - -# The continuation indent for func_*_param if they are true. If non-zero, this -# overrides the indent. -indent_param = 0 # unsigned number - -# How to use tabs when indenting code. -# -# 0: Spaces only -# 1: Indent with tabs to brace level, align with spaces (default) -# 2: Indent and align with tabs, using spaces when not on a tabstop -# -# Default: 1 -indent_with_tabs = 0 # unsigned number - -# Whether to indent comments that are not at a brace level with tabs on a -# tabstop. Requires indent_with_tabs=2. If false, will use spaces. -indent_cmt_with_tabs = false # true/false - -# Whether to indent strings broken by '\' so that they line up. -indent_align_string = false # true/false - -# The number of spaces to indent multi-line XML strings. -# Requires indent_align_string=true. -indent_xml_string = 0 # unsigned number - -# Spaces to indent '{' from level. -indent_brace = 0 # unsigned number - -# Whether braces are indented to the body level. -indent_braces = false # true/false - -# Whether to disable indenting function braces if indent_braces=true. -indent_braces_no_func = false # true/false - -# Whether to disable indenting class braces if indent_braces=true. -indent_braces_no_class = false # true/false - -# Whether to disable indenting struct braces if indent_braces=true. -indent_braces_no_struct = false # true/false - -# Whether to indent based on the size of the brace parent, -# i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. -indent_brace_parent = false # true/false - -# Whether to indent based on the open parenthesis instead of the open brace -# in '({\n'. -indent_paren_open_brace = false # true/false - -# (C#) Whether to indent the brace of a C# delegate by another level. -indent_cs_delegate_brace = false # true/false - -# (C#) Whether to indent a C# delegate (to handle delegates with no brace) by -# another level. -indent_cs_delegate_body = false # true/false - -# Whether to indent the body of a 'namespace'. -indent_namespace = false # true/false - -# Whether to indent only the first namespace, and not any nested namespaces. -# Requires indent_namespace=true. -indent_namespace_single_indent = false # true/false - -# The number of spaces to indent a namespace block. -# If set to zero, use the value indent_columns -indent_namespace_level = 0 # unsigned number - -# If the body of the namespace is longer than this number, it won't be -# indented. Requires indent_namespace=true. 0 means no limit. -indent_namespace_limit = 0 # unsigned number - -# Whether the 'extern "C"' body is indented. -indent_extern = false # true/false - -# Whether the 'class' body is indented. -indent_class = true # true/false - -# Whether to indent the stuff after a leading base class colon. -indent_class_colon = false # true/false - -# Whether to indent based on a class colon instead of the stuff after the -# colon. Requires indent_class_colon=true. -indent_class_on_colon = false # true/false - -# Whether to indent the stuff after a leading class initializer colon. -indent_constr_colon = false # true/false - -# Virtual indent from the ':' for member initializers. -# -# Default: 2 -indent_ctor_init_leading = 2 # unsigned number - -# Additional indent for constructor initializer list. -# Negative values decrease indent down to the first column. -indent_ctor_init = 0 # number - -# Whether to indent 'if' following 'else' as a new block under the 'else'. -# If false, 'else\nif' is treated as 'else if' for indenting purposes. -indent_else_if = false # true/false - -# Amount to indent variable declarations after a open brace. -# -# <0: Relative -# >=0: Absolute -indent_var_def_blk = 0 # number - -# Whether to indent continued variable declarations instead of aligning. -indent_var_def_cont = true # true/false - -# Whether to indent continued shift expressions ('<<' and '>>') instead of -# aligning. Set align_left_shift=false when enabling this. -indent_shift = false # true/false - -# Whether to force indentation of function definitions to start in column 1. -indent_func_def_force_col1 = true # true/false - -# Whether to indent continued function call parameters one indent level, -# rather than aligning parameters under the open parenthesis. -indent_func_call_param = true # true/false - -# Whether to indent continued function definition parameters one indent level, -# rather than aligning parameters under the open parenthesis. -indent_func_def_param = true # true/false - -# for function definitions, only if indent_func_def_param is false -# Allows to align params when appropriate and indent them when not -# behave as if it was true if paren position is more than this value -# if paren position is more than the option value -indent_func_def_param_paren_pos_threshold = 0 # unsigned number - -# Whether to indent continued function call prototype one indent level, -# rather than aligning parameters under the open parenthesis. -indent_func_proto_param = true # true/false - -# Whether to indent continued function call declaration one indent level, -# rather than aligning parameters under the open parenthesis. -indent_func_class_param = true # true/false - -# Whether to indent continued class variable constructors one indent level, -# rather than aligning parameters under the open parenthesis. -indent_func_ctor_var_param = true # true/false - -# Whether to indent continued template parameter list one indent level, -# rather than aligning parameters under the open parenthesis. -indent_template_param = true # true/false - -# Double the indent for indent_func_xxx_param options. -# Use both values of the options indent_columns and indent_param. -indent_func_param_double = false # true/false - -# Indentation column for standalone 'const' qualifier on a function -# prototype. -indent_func_const = 0 # unsigned number - -# Indentation column for standalone 'throw' qualifier on a function -# prototype. -indent_func_throw = 0 # unsigned number - -# How to indent within a macro followed by a brace on the same line -# This allows reducing the indent in macros that have (for example) -# `do { ... } while (0)` blocks bracketing them. -# -# true: add an indent for the brace on the same line as the macro -# false: do not add an indent for the brace on the same line as the macro -# -# Default: true -indent_macro_brace = true # true/false - -# The number of spaces to indent a continued '->' or '.'. -# Usually set to 0, 1, or indent_columns. -indent_member = 0 # unsigned number - -# Whether lines broken at '.' or '->' should be indented by a single indent. -# The indent_member option will not be effective if this is set to true. -indent_member_single = false # true/false - -# Spaces to indent single line ('//') comments on lines before code. -indent_sing_line_comments = 0 # unsigned number - -# Whether to indent trailing single line ('//') comments relative to the code -# instead of trying to keep the same absolute column. -indent_relative_single_line_comments = false # true/false - -# Spaces to indent 'case' from 'switch'. Usually 0 or indent_columns. -indent_switch_case = indent_columns # unsigned number - -# indent 'break' with 'case' from 'switch'. -indent_switch_break_with_case = false # true/false - -# Whether to indent preprocessor statements inside of switch statements. -# -# Default: true -indent_switch_pp = true # true/false - -# Spaces to shift the 'case' line, without affecting any other lines. -# Usually 0. -indent_case_shift = 0 # unsigned number - -# Spaces to indent '{' from 'case'. By default, the brace will appear under -# the 'c' in case. Usually set to 0 or indent_columns. Negative values are OK. -indent_case_brace = 0 # number - -# Whether to indent comments found in first column. -indent_col1_comment = false # true/false - -# Whether to indent multi string literal in first column. -indent_col1_multi_string_literal = false # true/false - -# How to indent goto labels. -# -# >0: Absolute column where 1 is the leftmost column -# <=0: Subtract from brace indent -# -# Default: 1 -indent_label = 1 # number - -# How to indent access specifiers that are followed by a -# colon. -# -# >0: Absolute column where 1 is the leftmost column -# <=0: Subtract from brace indent -# -# Default: 1 -indent_access_spec = -4 # number - -# Whether to indent the code after an access specifier by one level. -# If true, this option forces 'indent_access_spec=0'. -indent_access_spec_body = false # true/false - -# If an open parenthesis is followed by a newline, whether to indent the next -# line so that it lines up after the open parenthesis (not recommended). -indent_paren_nl = false # true/false - -# How to indent a close parenthesis after a newline. -# -# 0: Indent to body level (default) -# 1: Align under the open parenthesis -# 2: Indent to the brace level -indent_paren_close = 0 # unsigned number - -# Whether to indent the open parenthesis of a function definition, -# if the parenthesis is on its own line. -indent_paren_after_func_def = false # true/false - -# Whether to indent the open parenthesis of a function declaration, -# if the parenthesis is on its own line. -indent_paren_after_func_decl = false # true/false - -# Whether to indent the open parenthesis of a function call, -# if the parenthesis is on its own line. -indent_paren_after_func_call = false # true/false - -# Whether to indent a comma when inside a parenthesis. -# If true, aligns under the open parenthesis. -indent_comma_paren = false # true/false - -# Whether to indent a Boolean operator when inside a parenthesis. -# If true, aligns under the open parenthesis. -indent_bool_paren = false # true/false - -# Whether to indent a semicolon when inside a for parenthesis. -# If true, aligns under the open for parenthesis. -indent_semicolon_for_paren = false # true/false - -# Whether to align the first expression to following ones -# if indent_bool_paren=true. -indent_first_bool_expr = false # true/false - -# Whether to align the first expression to following ones -# if indent_semicolon_for_paren=true. -indent_first_for_expr = false # true/false - -# If an open square is followed by a newline, whether to indent the next line -# so that it lines up after the open square (not recommended). -indent_square_nl = false # true/false - -# (ESQL/C) Whether to preserve the relative indent of 'EXEC SQL' bodies. -indent_preserve_sql = false # true/false - -# Whether to align continued statements at the '='. If false or if the '=' is -# followed by a newline, the next line is indent one tab. -# -# Default: true -indent_align_assign = false # true/false - -# Whether to align continued statements at the '('. If false or the '(' is -# followed by a newline, the next line indent is one tab. -# -# Default: true -indent_align_paren = true # true/false, - -# (OC) Whether to indent Objective-C blocks at brace level instead of usual -# rules. -indent_oc_block = false # true/false - -# (OC) Indent for Objective-C blocks in a message relative to the parameter -# name. -# -# =0: Use indent_oc_block rules -# >0: Use specified number of spaces to indent -indent_oc_block_msg = 0 # unsigned number - -# (OC) Minimum indent for subsequent parameters -indent_oc_msg_colon = 0 # unsigned number - -# (OC) Whether to prioritize aligning with initial colon (and stripping spaces -# from lines, if necessary). -# -# Default: true -indent_oc_msg_prioritize_first_colon = true # true/false - -# (OC) Whether to indent blocks the way that Xcode does by default -# (from the keyword if the parameter is on its own line; otherwise, from the -# previous indentation level). Requires indent_oc_block_msg=true. -indent_oc_block_msg_xcode_style = false # true/false - -# (OC) Whether to indent blocks from where the brace is, relative to a -# message keyword. Requires indent_oc_block_msg=true. -indent_oc_block_msg_from_keyword = false # true/false - -# (OC) Whether to indent blocks from where the brace is, relative to a message -# colon. Requires indent_oc_block_msg=true. -indent_oc_block_msg_from_colon = false # true/false - -# (OC) Whether to indent blocks from where the block caret is. -# Requires indent_oc_block_msg=true. -indent_oc_block_msg_from_caret = false # true/false - -# (OC) Whether to indent blocks from where the brace caret is. -# Requires indent_oc_block_msg=true. -indent_oc_block_msg_from_brace = false # true/false - -# When indenting after virtual brace open and newline add further spaces to -# reach this minimum indent. -indent_min_vbrace_open = 0 # unsigned number - -# Whether to add further spaces after regular indent to reach next tabstop -# when identing after virtual brace open and newline. -indent_vbrace_open_on_tabstop = false # true/false - -# How to indent after a brace followed by another token (not a newline). -# true: indent all contained lines to match the token -# false: indent all contained lines to match the brace -# -# Default: true -indent_token_after_brace = true # true/false - -# Whether to indent the body of a C++11 lambda. -indent_cpp_lambda_body = false # true/false - -# (C#) Whether to indent a 'using' block if no braces are used. -# -# Default: true -indent_using_block = true # true/false - -# How to indent the continuation of ternary operator. -# -# 0: Off (default) -# 1: When the `if_false` is a continuation, indent it under `if_false` -# 2: When the `:` is a continuation, indent it under `?` -indent_ternary_operator = 0 # unsigned number - -# If true, the indentation of the chunks after a `return new` sequence will be set at return indentation column. -indent_off_after_return_new = false # true/false - -# If true, the tokens after return are indented with regular single indentation. -# By default (false) the indentation is after the return token. -indent_single_after_return = false # true/false - -# Whether to ignore indent and alignment for 'asm' blocks (i.e. assume they -# have their own indentation). -indent_ignore_asm_block = false # true/false - -# -# Newline adding and removing options -# - -# Whether to collapse empty blocks between '{' and '}'. -nl_collapse_empty_body = false # true/false - -# Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. -nl_assign_leave_one_liners = true # true/false - -# Don't split one-line braced statements inside a 'class xx { }' body. -nl_class_leave_one_liners = true # true/false - -# Don't split one-line enums, as in 'enum foo { BAR = 15 };' -nl_enum_leave_one_liners = true # true/false - -# Don't split one-line get or set functions. -nl_getset_leave_one_liners = true # true/false - -# (C#) Don't split one-line property get or set functions. -nl_cs_property_leave_one_liners = true # true/false - -# Don't split one-line function definitions, as in 'int foo() { return 0; }'. -# night modify nl_func_type_name -nl_func_leave_one_liners = true # true/false - -# Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. -nl_cpp_lambda_leave_one_liners = true # true/false - -# Don't split one-line if/else statements, as in 'if(...) b++;'. -nl_if_leave_one_liners = true # true/false - -# Don't split one-line while statements, as in 'while(...) b++;'. -nl_while_leave_one_liners = true # true/false - -# Don't split one-line for statements, as in 'for(...) b++;'. -nl_for_leave_one_liners = true # true/false - -# (OC) Don't split one-line Objective-C messages. -nl_oc_msg_leave_one_liner = false # true/false - -# (OC) Add or remove newline between method declaration and '{'. -nl_oc_mdef_brace = ignore # ignore/add/remove/force - -# (OC) Add or remove newline between Objective-C block signature and '{'. -nl_oc_block_brace = ignore # ignore/add/remove/force - -# (OC) Add or remove blank line before '@interface' statement. -nl_oc_before_interface = ignore # ignore/add/remove/force - -# (OC) Add or remove blank line before '@implementation' statement. -nl_oc_before_implementation = ignore # ignore/add/remove/force - -# (OC) Add or remove blank line before '@end' statement. -nl_oc_before_end = ignore # ignore/add/remove/force - -# (OC) Add or remove newline between '@interface' and '{'. -nl_oc_interface_brace = ignore # ignore/add/remove/force - -# (OC) Add or remove newline between '@implementation' and '{'. -nl_oc_implementation_brace = ignore # ignore/add/remove/force - -# Add or remove newlines at the start of the file. -nl_start_of_file = ignore # ignore/add/remove/force - -# The minimum number of newlines at the start of the file (only used if -# nl_start_of_file is 'add' or 'force'). -nl_start_of_file_min = 0 # unsigned number - -# Add or remove newline at the end of the file. -nl_end_of_file = ignore # ignore/add/remove/force - -# The minimum number of newlines at the end of the file (only used if -# nl_end_of_file is 'add' or 'force'). -nl_end_of_file_min = 0 # unsigned number - -# Add or remove newline between '=' and '{'. -nl_assign_brace = ignore # ignore/add/remove/force - -# (D) Add or remove newline between '=' and '['. -nl_assign_square = ignore # ignore/add/remove/force - -# Add or remove newline between '[]' and '{'. -nl_tsquare_brace = ignore # ignore/add/remove/force - -# (D) Add or remove newline after '= ['. Will also affect the newline before -# the ']'. -nl_after_square_assign = ignore # ignore/add/remove/force - -# Add or remove newline between a function call's ')' and '{', as in -# 'list_for_each(item, &list) { }'. -nl_fcall_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'enum' and '{'. -nl_enum_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'enum' and 'class'. -nl_enum_class = ignore # ignore/add/remove/force - -# Add or remove newline between 'enum class' and the identifier. -nl_enum_class_identifier = ignore # ignore/add/remove/force - -# Add or remove newline between 'enum class' type and ':'. -nl_enum_identifier_colon = ignore # ignore/add/remove/force - -# Add or remove newline between 'enum class identifier :' and type. -nl_enum_colon_type = ignore # ignore/add/remove/force - -# Add or remove newline between 'struct and '{'. -nl_struct_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'union' and '{'. -nl_union_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'if' and '{'. -nl_if_brace = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'else'. -nl_brace_else = ignore # ignore/add/remove/force - -# Add or remove newline between 'else if' and '{'. If set to ignore, -# nl_if_brace is used instead. -nl_elseif_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'else' and '{'. -nl_else_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'else' and 'if'. -nl_else_if = ignore # ignore/add/remove/force - -# Add or remove newline before 'if'/'else if' closing parenthesis. -nl_before_if_closing_paren = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'finally'. -nl_brace_finally = ignore # ignore/add/remove/force - -# Add or remove newline between 'finally' and '{'. -nl_finally_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'try' and '{'. -nl_try_brace = ignore # ignore/add/remove/force - -# Add or remove newline between get/set and '{'. -nl_getset_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'for' and '{'. -nl_for_brace = ignore # ignore/add/remove/force - -# Add or remove newline before the '{' of a 'catch' statement, as in -# 'catch (decl) {'. -nl_catch_brace = ignore # ignore/add/remove/force - -# (OC) Add or remove newline before the '{' of a '@catch' statement, as in -# '@catch (decl) {'. If set to ignore, nl_catch_brace is used. -nl_oc_catch_brace = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'catch'. -nl_brace_catch = ignore # ignore/add/remove/force - -# (OC) Add or remove newline between '}' and '@catch'. If set to ignore, -# nl_brace_catch is used. -nl_oc_brace_catch = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and ']'. -nl_brace_square = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and ')' in a function invocation. -nl_brace_fparen = ignore # ignore/add/remove/force - -# Add or remove newline between 'while' and '{'. -nl_while_brace = ignore # ignore/add/remove/force - -# (D) Add or remove newline between 'scope (x)' and '{'. -nl_scope_brace = ignore # ignore/add/remove/force - -# (D) Add or remove newline between 'unittest' and '{'. -nl_unittest_brace = ignore # ignore/add/remove/force - -# (D) Add or remove newline between 'version (x)' and '{'. -nl_version_brace = ignore # ignore/add/remove/force - -# (C#) Add or remove newline between 'using' and '{'. -nl_using_brace = ignore # ignore/add/remove/force - -# Add or remove newline between two open or close braces. Due to general -# newline/brace handling, REMOVE may not work. -nl_brace_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'do' and '{'. -nl_do_brace = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'while' of 'do' statement. -nl_brace_while = ignore # ignore/add/remove/force - -# Add or remove newline between 'switch' and '{'. -nl_switch_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'synchronized' and '{'. -nl_synchronized_brace = ignore # ignore/add/remove/force - -# Add a newline between ')' and '{' if the ')' is on a different line than the -# if/for/etc. -# -# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch and -# nl_catch_brace. -nl_multi_line_cond = false # true/false - -# Add a newline after '(' if an if/for/while/switch condition spans multiple -# lines -nl_multi_line_sparen_open = ignore # ignore/add/remove/force - -# Add a newline before ')' if an if/for/while/switch condition spans multiple -# lines. Overrides nl_before_if_closing_paren if both are specified. -nl_multi_line_sparen_close = ignore # ignore/add/remove/force - -# Force a newline in a define after the macro name for multi-line defines. -nl_multi_line_define = false # true/false - -# Whether to add a newline before 'case', and a blank line before a 'case' -# statement that follows a ';' or '}'. -nl_before_case = false # true/false - -# Whether to add a newline after a 'case' statement. -nl_after_case = false # true/false - -# Add or remove newline between a case ':' and '{'. -# -# Overrides nl_after_case. -nl_case_colon_brace = ignore # ignore/add/remove/force - -# Add or remove newline between ')' and 'throw'. -nl_before_throw = ignore # ignore/add/remove/force - -# Add or remove newline between 'namespace' and '{'. -nl_namespace_brace = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<...>' of a template class. -nl_template_class = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<...>' of a template class declaration. -# -# Overrides nl_template_class. -nl_template_class_decl = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<>' of a specialized class declaration. -# -# Overrides nl_template_class_decl. -nl_template_class_decl_special = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<...>' of a template class definition. -# -# Overrides nl_template_class. -nl_template_class_def = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<>' of a specialized class definition. -# -# Overrides nl_template_class_def. -nl_template_class_def_special = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<...>' of a template function. -nl_template_func = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<...>' of a template function -# declaration. -# -# Overrides nl_template_func. -nl_template_func_decl = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<>' of a specialized function -# declaration. -# -# Overrides nl_template_func_decl. -nl_template_func_decl_special = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<...>' of a template function -# definition. -# -# Overrides nl_template_func. -nl_template_func_def = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<>' of a specialized function -# definition. -# -# Overrides nl_template_func_def. -nl_template_func_def_special = ignore # ignore/add/remove/force - -# Add or remove newline after 'template<...>' of a template variable. -nl_template_var = ignore # ignore/add/remove/force - -# Add or remove newline between 'template<...>' and 'using' of a templated -# type alias. -nl_template_using = ignore # ignore/add/remove/force - -# Add or remove newline between 'class' and '{'. -nl_class_brace = ignore # ignore/add/remove/force - -# Add or remove newline before or after (depending on pos_class_comma, -# may not be IGNORE) each',' in the base class list. -nl_class_init_args = ignore # ignore/add/remove/force - -# Add or remove newline after each ',' in the constructor member -# initialization. Related to nl_constr_colon, pos_constr_colon and -# pos_constr_comma. -nl_constr_init_args = ignore # ignore/add/remove/force - -# Add or remove newline before first element, after comma, and after last -# element, in 'enum'. -nl_enum_own_lines = ignore # ignore/add/remove/force - -# Add or remove newline between return type and function name in a function -# definition. -# might be modified by nl_func_leave_one_liners -nl_func_type_name = ignore # ignore/add/remove/force - -# Add or remove newline between return type and function name inside a class -# definition. If set to ignore, nl_func_type_name or nl_func_proto_type_name -# is used instead. -nl_func_type_name_class = ignore # ignore/add/remove/force - -# Add or remove newline between class specification and '::' -# in 'void A::f() { }'. Only appears in separate member implementation (does -# not appear with in-line implementation). -nl_func_class_scope = ignore # ignore/add/remove/force - -# Add or remove newline between function scope and name, as in -# 'void A :: f() { }'. -nl_func_scope_name = ignore # ignore/add/remove/force - -# Add or remove newline between return type and function name in a prototype. -nl_func_proto_type_name = ignore # ignore/add/remove/force - -# Add or remove newline between a function name and the opening '(' in the -# declaration. -nl_func_paren = ignore # ignore/add/remove/force - -# Overrides nl_func_paren for functions with no parameters. -nl_func_paren_empty = ignore # ignore/add/remove/force - -# Add or remove newline between a function name and the opening '(' in the -# definition. -nl_func_def_paren = ignore # ignore/add/remove/force - -# Overrides nl_func_def_paren for functions with no parameters. -nl_func_def_paren_empty = ignore # ignore/add/remove/force - -# Add or remove newline between a function name and the opening '(' in the -# call. -nl_func_call_paren = ignore # ignore/add/remove/force - -# Overrides nl_func_call_paren for functions with no parameters. -nl_func_call_paren_empty = ignore # ignore/add/remove/force - -# Add or remove newline after '(' in a function declaration. -nl_func_decl_start = ignore # ignore/add/remove/force - -# Add or remove newline after '(' in a function definition. -nl_func_def_start = ignore # ignore/add/remove/force - -# Overrides nl_func_decl_start when there is only one parameter. -nl_func_decl_start_single = ignore # ignore/add/remove/force - -# Overrides nl_func_def_start when there is only one parameter. -nl_func_def_start_single = ignore # ignore/add/remove/force - -# Whether to add a newline after '(' in a function declaration if '(' and ')' -# are in different lines. If false, nl_func_decl_start is used instead. -nl_func_decl_start_multi_line = false # true/false - -# Whether to add a newline after '(' in a function definition if '(' and ')' -# are in different lines. If false, nl_func_def_start is used instead. -nl_func_def_start_multi_line = false # true/false - -# Add or remove newline after each ',' in a function declaration. -nl_func_decl_args = ignore # ignore/add/remove/force - -# Add or remove newline after each ',' in a function definition. -nl_func_def_args = ignore # ignore/add/remove/force - -# Whether to add a newline after each ',' in a function declaration if '(' -# and ')' are in different lines. If false, nl_func_decl_args is used instead. -nl_func_decl_args_multi_line = false # true/false - -# Whether to add a newline after each ',' in a function definition if '(' -# and ')' are in different lines. If false, nl_func_def_args is used instead. -nl_func_def_args_multi_line = false # true/false - -# Add or remove newline before the ')' in a function declaration. -nl_func_decl_end = ignore # ignore/add/remove/force - -# Add or remove newline before the ')' in a function definition. -nl_func_def_end = ignore # ignore/add/remove/force - -# Overrides nl_func_decl_end when there is only one parameter. -nl_func_decl_end_single = ignore # ignore/add/remove/force - -# Overrides nl_func_def_end when there is only one parameter. -nl_func_def_end_single = ignore # ignore/add/remove/force - -# Whether to add a newline before ')' in a function declaration if '(' and ')' -# are in different lines. If false, nl_func_decl_end is used instead. -nl_func_decl_end_multi_line = false # true/false - -# Whether to add a newline before ')' in a function definition if '(' and ')' -# are in different lines. If false, nl_func_def_end is used instead. -nl_func_def_end_multi_line = false # true/false - -# Add or remove newline between '()' in a function declaration. -nl_func_decl_empty = ignore # ignore/add/remove/force - -# Add or remove newline between '()' in a function definition. -nl_func_def_empty = ignore # ignore/add/remove/force - -# Add or remove newline between '()' in a function call. -nl_func_call_empty = ignore # ignore/add/remove/force - -# Whether to add a newline after '(' in a function call, -# has preference over nl_func_call_start_multi_line. -nl_func_call_start = ignore # ignore/add/remove/force - -# Whether to add a newline after '(' in a function call if '(' and ')' are in -# different lines. -nl_func_call_start_multi_line = false # true/false - -# Whether to add a newline after each ',' in a function call if '(' and ')' -# are in different lines. -nl_func_call_args_multi_line = false # true/false - -# Whether to add a newline before ')' in a function call if '(' and ')' are in -# different lines. -nl_func_call_end_multi_line = false # true/false - -# Whether to add a newline after '<' of a template parameter list. -nl_template_start = false # true/false - -# Whether to add a newline after each ',' in a template parameter list. -nl_template_args = false # true/false - -# Whether to add a newline before '>' of a template parameter list. -nl_template_end = false # true/false - -# (OC) Whether to put each Objective-C message parameter on a separate line. -# See nl_oc_msg_leave_one_liner. -nl_oc_msg_args = false # true/false - -# Add or remove newline between function signature and '{'. -nl_fdef_brace = ignore # ignore/add/remove/force - -# Add or remove newline between function signature and '{', -# if signature ends with ')'. Overrides nl_fdef_brace. -nl_fdef_brace_cond = ignore # ignore/add/remove/force - -# Add or remove newline between C++11 lambda signature and '{'. -nl_cpp_ldef_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'return' and the return expression. -nl_return_expr = ignore # ignore/add/remove/force - -# Whether to add a newline after semicolons, except in 'for' statements. -nl_after_semicolon = false # true/false - -# (Java) Add or remove newline between the ')' and '{{' of the double brace -# initializer. -nl_paren_dbrace_open = ignore # ignore/add/remove/force - -# Whether to add a newline after the type in an unnamed temporary -# direct-list-initialization. -nl_type_brace_init_lst = ignore # ignore/add/remove/force - -# Whether to add a newline after the open brace in an unnamed temporary -# direct-list-initialization. -nl_type_brace_init_lst_open = ignore # ignore/add/remove/force - -# Whether to add a newline before the close brace in an unnamed temporary -# direct-list-initialization. -nl_type_brace_init_lst_close = ignore # ignore/add/remove/force - -# Whether to add a newline after '{'. This also adds a newline before the -# matching '}'. -nl_after_brace_open = false # true/false - -# Whether to add a newline between the open brace and a trailing single-line -# comment. Requires nl_after_brace_open=true. -nl_after_brace_open_cmt = false # true/false - -# Whether to add a newline after a virtual brace open with a non-empty body. -# These occur in un-braced if/while/do/for statement bodies. -nl_after_vbrace_open = false # true/false - -# Whether to add a newline after a virtual brace open with an empty body. -# These occur in un-braced if/while/do/for statement bodies. -nl_after_vbrace_open_empty = false # true/false - -# Whether to add a newline after '}'. Does not apply if followed by a -# necessary ';'. -nl_after_brace_close = false # true/false - -# Whether to add a newline after a virtual brace close, -# as in 'if (foo) a++; return;'. -nl_after_vbrace_close = false # true/false - -# Add or remove newline between the close brace and identifier, -# as in 'struct { int a; } b;'. Affects enumerations, unions and -# structures. If set to ignore, uses nl_after_brace_close. -nl_brace_struct_var = ignore # ignore/add/remove/force - -# Whether to alter newlines in '#define' macros. -nl_define_macro = false # true/false - -# Whether to alter newlines between consecutive parenthesis closes. The number -# of closing parentheses in a line will depend on respective open parenthesis -# lines. -nl_squeeze_paren_close = false # true/false - -# Whether to remove blanks after '#ifxx' and '#elxx', or before '#elxx' and -# '#endif'. Does not affect top-level #ifdefs. -nl_squeeze_ifdef = false # true/false - -# Makes the nl_squeeze_ifdef option affect the top-level #ifdefs as well. -nl_squeeze_ifdef_top_level = false # true/false - -# Add or remove blank line before 'if'. -nl_before_if = ignore # ignore/add/remove/force - -# Add or remove blank line after 'if' statement. Add/Force work only if the -# next token is not a closing brace. -nl_after_if = ignore # ignore/add/remove/force - -# Add or remove blank line before 'for'. -nl_before_for = ignore # ignore/add/remove/force - -# Add or remove blank line after 'for' statement. -nl_after_for = ignore # ignore/add/remove/force - -# Add or remove blank line before 'while'. -nl_before_while = ignore # ignore/add/remove/force - -# Add or remove blank line after 'while' statement. -nl_after_while = ignore # ignore/add/remove/force - -# Add or remove blank line before 'switch'. -nl_before_switch = ignore # ignore/add/remove/force - -# Add or remove blank line after 'switch' statement. -nl_after_switch = ignore # ignore/add/remove/force - -# Add or remove blank line before 'synchronized'. -nl_before_synchronized = ignore # ignore/add/remove/force - -# Add or remove blank line after 'synchronized' statement. -nl_after_synchronized = ignore # ignore/add/remove/force - -# Add or remove blank line before 'do'. -nl_before_do = ignore # ignore/add/remove/force - -# Add or remove blank line after 'do/while' statement. -nl_after_do = ignore # ignore/add/remove/force - -# Whether to put a blank line before 'return' statements, unless after an open -# brace. -nl_before_return = false # true/false - -# Whether to put a blank line after 'return' statements, unless followed by a -# close brace. -nl_after_return = false # true/false - -# (Java) Whether to put a blank line before a member '.' or '->' operators. -nl_before_member = ignore # ignore/add/remove/force - -# (Java) Whether to put a blank line after a member '.' or '->' operators. -nl_after_member = ignore # ignore/add/remove/force - -# Whether to double-space commented-entries in 'struct'/'union'/'enum'. -nl_ds_struct_enum_cmt = false # true/false - -# Whether to force a newline before '}' of a 'struct'/'union'/'enum'. -# (Lower priority than eat_blanks_before_close_brace.) -nl_ds_struct_enum_close_brace = false # true/false - -# Add or remove newline before or after (depending on pos_class_colon) a class -# colon, as in 'class Foo : public Bar'. -nl_class_colon = ignore # ignore/add/remove/force - -# Add or remove newline around a class constructor colon. The exact position -# depends on nl_constr_init_args, pos_constr_colon and pos_constr_comma. -nl_constr_colon = ignore # ignore/add/remove/force - -# Whether to collapse a two-line namespace, like 'namespace foo\n{ decl; }' -# into a single line. If true, prevents other brace newline rules from turning -# such code into four lines. -nl_namespace_two_to_one_liner = false # true/false - -# Whether to remove a newline in simple unbraced if statements, turning them -# into one-liners, as in 'if(b)\n i++;' => 'if(b) i++;'. -nl_create_if_one_liner = false # true/false - -# Whether to remove a newline in simple unbraced for statements, turning them -# into one-liners, as in 'for (...)\n stmt;' => 'for (...) stmt;'. -nl_create_for_one_liner = false # true/false - -# Whether to remove a newline in simple unbraced while statements, turning -# them into one-liners, as in 'while (expr)\n stmt;' => 'while (expr) stmt;'. -nl_create_while_one_liner = false # true/false - -# Whether to collapse a function definition whose body (not counting braces) -# is only one line so that the entire definition (prototype, braces, body) is -# a single line. -nl_create_func_def_one_liner = false # true/false - -# Whether to collapse a function definition whose body (not counting braces) -# is only one line so that the entire definition (prototype, braces, body) is -# a single line. -nl_create_list_one_liner = false # true/false - -# Whether to split one-line simple unbraced if statements into two lines by -# adding a newline, as in 'if(b) i++;'. -nl_split_if_one_liner = false # true/false - -# Whether to split one-line simple unbraced for statements into two lines by -# adding a newline, as in 'for (...) stmt;'. -nl_split_for_one_liner = false # true/false - -# Whether to split one-line simple unbraced while statements into two lines by -# adding a newline, as in 'while (expr) stmt;'. -nl_split_while_one_liner = false # true/false - -# -# Blank line options -# - -# The maximum number of consecutive newlines (3 = 2 blank lines). -nl_max = 0 # unsigned number - -# The maximum number of consecutive newlines in a function. -nl_max_blank_in_func = 0 # unsigned number - -# The number of newlines before a function prototype. -nl_before_func_body_proto = 0 # unsigned number - -# The number of newlines before a multi-line function definition. -nl_before_func_body_def = 0 # unsigned number - -# The number of newlines before a class constructor/destructor prototype. -nl_before_func_class_proto = 0 # unsigned number - -# The number of newlines before a class constructor/destructor definition. -nl_before_func_class_def = 0 # unsigned number - -# The number of newlines after a function prototype. -nl_after_func_proto = 0 # unsigned number - -# The number of newlines after a function prototype, if not followed by -# another function prototype. -nl_after_func_proto_group = 0 # unsigned number - -# The number of newlines after a class constructor/destructor prototype. -nl_after_func_class_proto = 0 # unsigned number - -# The number of newlines after a class constructor/destructor prototype, -# if not followed by another constructor/destructor prototype. -nl_after_func_class_proto_group = 0 # unsigned number - -# Whether one-line method definitions inside a class body should be treated -# as if they were prototypes for the purposes of adding newlines. -# -# Requires nl_class_leave_one_liners=true. Overrides nl_before_func_body_def -# and nl_before_func_class_def for one-liners. -nl_class_leave_one_liner_groups = false # true/false - -# The number of newlines after '}' of a multi-line function body. -nl_after_func_body = 0 # unsigned number - -# The number of newlines after '}' of a multi-line function body in a class -# declaration. Also affects class constructors/destructors. -# -# Overrides nl_after_func_body. -nl_after_func_body_class = 0 # unsigned number - -# The number of newlines after '}' of a single line function body. Also -# affects class constructors/destructors. -# -# Overrides nl_after_func_body and nl_after_func_body_class. -nl_after_func_body_one_liner = 0 # unsigned number - -# The number of blank lines after a block of variable definitions at the top -# of a function body. -# -# 0: No change (default). -nl_func_var_def_blk = 0 # unsigned number - -# The number of newlines before a block of typedefs. If nl_after_access_spec -# is non-zero, that option takes precedence. -# -# 0: No change (default). -nl_typedef_blk_start = 0 # unsigned number - -# The number of newlines after a block of typedefs. -# -# 0: No change (default). -nl_typedef_blk_end = 0 # unsigned number - -# The maximum number of consecutive newlines within a block of typedefs. -# -# 0: No change (default). -nl_typedef_blk_in = 0 # unsigned number - -# The number of newlines before a block of variable definitions not at the top -# of a function body. If nl_after_access_spec is non-zero, that option takes -# precedence. -# -# 0: No change (default). -nl_var_def_blk_start = 0 # unsigned number - -# The number of newlines after a block of variable definitions not at the top -# of a function body. -# -# 0: No change (default). -nl_var_def_blk_end = 0 # unsigned number - -# The maximum number of consecutive newlines within a block of variable -# definitions. -# -# 0: No change (default). -nl_var_def_blk_in = 0 # unsigned number - -# The minimum number of newlines before a multi-line comment. -# Doesn't apply if after a brace open or another multi-line comment. -nl_before_block_comment = 0 # unsigned number - -# The minimum number of newlines before a single-line C comment. -# Doesn't apply if after a brace open or other single-line C comments. -nl_before_c_comment = 0 # unsigned number - -# The minimum number of newlines before a CPP comment. -# Doesn't apply if after a brace open or other CPP comments. -nl_before_cpp_comment = 0 # unsigned number - -# Whether to force a newline after a multi-line comment. -nl_after_multiline_comment = false # true/false - -# Whether to force a newline after a label's colon. -nl_after_label_colon = false # true/false - -# The number of newlines after '}' or ';' of a struct/enum/union definition. -nl_after_struct = 0 # unsigned number - -# The number of newlines before a class definition. -nl_before_class = 0 # unsigned number - -# The number of newlines after '}' or ';' of a class definition. -nl_after_class = 0 # unsigned number - -# The number of newlines before a namespace. -nl_before_namespace = 0 # unsigned number - -# The number of newlines after '{' of a namespace. This also adds newlines -# before the matching '}'. -# -# 0: Apply eat_blanks_after_open_brace or eat_blanks_before_close_brace if -# applicable, otherwise no change. -# -# Overrides eat_blanks_after_open_brace and eat_blanks_before_close_brace. -nl_inside_namespace = 0 # unsigned number - -# The number of newlines after '}' of a namespace. -nl_after_namespace = 0 # unsigned number - -# The number of newlines before an access specifier label. This also includes -# the Qt-specific 'signals:' and 'slots:'. Will not change the newline count -# if after a brace open. -# -# 0: No change (default). -nl_before_access_spec = 0 # unsigned number - -# The number of newlines after an access specifier label. This also includes -# the Qt-specific 'signals:' and 'slots:'. Will not change the newline count -# if after a brace open. -# -# 0: No change (default). -# -# Overrides nl_typedef_blk_start and nl_var_def_blk_start. -nl_after_access_spec = 0 # unsigned number - -# The number of newlines between a function definition and the function -# comment, as in '// comment\n void foo() {...}'. -# -# 0: No change (default). -nl_comment_func_def = 0 # unsigned number - -# The number of newlines after a try-catch-finally block that isn't followed -# by a brace close. -# -# 0: No change (default). -nl_after_try_catch_finally = 0 # unsigned number - -# (C#) The number of newlines before and after a property, indexer or event -# declaration. -# -# 0: No change (default). -nl_around_cs_property = 0 # unsigned number - -# (C#) The number of newlines between the get/set/add/remove handlers. -# -# 0: No change (default). -nl_between_get_set = 0 # unsigned number - -# (C#) Add or remove newline between property and the '{'. -nl_property_brace = ignore # ignore/add/remove/force - -# Whether to remove blank lines after '{'. -eat_blanks_after_open_brace = false # true/false - -# Whether to remove blank lines before '}'. -eat_blanks_before_close_brace = false # true/false - -# How aggressively to remove extra newlines not in preprocessor. -# -# 0: No change (default) -# 1: Remove most newlines not handled by other config -# 2: Remove all newlines and reformat completely by config -nl_remove_extra_newlines = 0 # unsigned number - -# (Java) Add or remove newline after an annotation statement. Only affects -# annotations that are after a newline. -nl_after_annotation = ignore # ignore/add/remove/force - -# (Java) Add or remove newline between two annotations. -nl_between_annotation = ignore # ignore/add/remove/force - -# -# Positioning options -# - -# The position of arithmetic operators in wrapped expressions. -pos_arith = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of assignment in wrapped expressions. Do not affect '=' -# followed by '{'. -pos_assign = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of Boolean operators in wrapped expressions. -pos_bool = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of comparison operators in wrapped expressions. -pos_compare = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of conditional operators, as in the '?' and ':' of -# 'expr ? stmt : stmt', in wrapped expressions. -pos_conditional = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of the comma in wrapped expressions. -pos_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of the comma in enum entries. -pos_enum_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of the comma in the base class list if there is more than one -# line. Affects nl_class_init_args. -pos_class_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of the comma in the constructor initialization list. -# Related to nl_constr_colon, nl_constr_init_args and pos_constr_colon. -pos_constr_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of trailing/leading class colon, between class and base class -# list. Affects nl_class_colon. -pos_class_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# The position of colons between constructor and member initialization. -# Related to nl_constr_colon, nl_constr_init_args and pos_constr_comma. -pos_constr_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force - -# -# Line splitting options -# - -# Try to limit code width to N columns. -code_width = 0 # unsigned number - -# Whether to fully split long 'for' statements at semi-colons. -ls_for_split_full = false # true/false - -# Whether to fully split long function prototypes/calls at commas. -# The option ls_code_width has priority over the option ls_func_split_full. -ls_func_split_full = false # true/false - -# Whether to split lines as close to code_width as possible and ignore some -# groupings. -# The option ls_code_width has priority over the option ls_func_split_full. -ls_code_width = false # true/false - -# -# Code alignment options (not left column spaces/tabs) -# - -# Whether to keep non-indenting tabs. -align_keep_tabs = false # true/false - -# Whether to use tabs for aligning. -align_with_tabs = false # true/false - -# Whether to bump out to the next tab when aligning. -align_on_tabstop = false # true/false - -# Whether to right-align numbers. -align_number_right = false # true/false - -# Whether to keep whitespace not required for alignment. -align_keep_extra_space = false # true/false - -# Whether to align variable definitions in prototypes and functions. -align_func_params = false # true/false - -# The span for aligning parameter definitions in function on parameter name. -# -# 0: Don't align (default). -align_func_params_span = 0 # unsigned number - -# The threshold for aligning function parameter definitions. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_func_params_thresh = 0 # number - -# The gap for aligning function parameter definitions. -align_func_params_gap = 0 # unsigned number - -# The span for aligning constructor value. -# -# 0: Don't align (default). -align_constr_value_span = 0 # unsigned number - -# The threshold for aligning constructor value. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_constr_value_thresh = 0 # number - -# The gap for aligning constructor value. -align_constr_value_gap = 0 # unsigned number - -# Whether to align parameters in single-line functions that have the same -# name. The function names must already be aligned with each other. -align_same_func_call_params = false # true/false - -# The span for aligning function-call parameters for single line functions. -# -# 0: Don't align (default). -align_same_func_call_params_span = 0 # unsigned number - -# The threshold for aligning function-call parameters for single line -# functions. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_same_func_call_params_thresh = 0 # number - -# The span for aligning variable definitions. -# -# 0: Don't align (default). -align_var_def_span = 0 # unsigned number - -# How to consider (or treat) the '*' in the alignment of variable definitions. -# -# 0: Part of the type 'void * foo;' (default) -# 1: Part of the variable 'void *foo;' -# 2: Dangling 'void *foo;' -# Dangling: the '*' will not be taken into account when aligning. -align_var_def_star_style = 0 # unsigned number - -# How to consider (or treat) the '&' in the alignment of variable definitions. -# -# 0: Part of the type 'long & foo;' (default) -# 1: Part of the variable 'long &foo;' -# 2: Dangling 'long &foo;' -# Dangling: the '&' will not be taken into account when aligning. -align_var_def_amp_style = 0 # unsigned number - -# The threshold for aligning variable definitions. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_var_def_thresh = 0 # number - -# The gap for aligning variable definitions. -align_var_def_gap = 0 # unsigned number - -# Whether to align the colon in struct bit fields. -align_var_def_colon = false # true/false - -# The gap for aligning the colon in struct bit fields. -align_var_def_colon_gap = 0 # unsigned number - -# Whether to align any attribute after the variable name. -align_var_def_attribute = false # true/false - -# Whether to align inline struct/enum/union variable definitions. -align_var_def_inline = false # true/false - -# The span for aligning on '=' in assignments. -# -# 0: Don't align (default). -align_assign_span = 0 # unsigned number - -# The span for aligning on '=' in function prototype modifier. -# -# 0: Don't align (default). -align_assign_func_proto_span = 0 # unsigned number - -# The threshold for aligning on '=' in assignments. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_assign_thresh = 0 # number - -# How to apply align_assign_span to function declaration "assignments", i.e. -# 'virtual void foo() = 0' or '~foo() = {default|delete}'. -# -# 0: Align with other assignments (default) -# 1: Align with each other, ignoring regular assignments -# 2: Don't align -align_assign_decl_func = 0 # unsigned number - -# The span for aligning on '=' in enums. -# -# 0: Don't align (default). -align_enum_equ_span = 0 # unsigned number - -# The threshold for aligning on '=' in enums. -# Use a negative number for absolute thresholds. -# -# 0: no limit (default). -align_enum_equ_thresh = 0 # number - -# The span for aligning class member definitions. -# -# 0: Don't align (default). -align_var_class_span = 0 # unsigned number - -# The threshold for aligning class member definitions. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_var_class_thresh = 0 # number - -# The gap for aligning class member definitions. -align_var_class_gap = 0 # unsigned number - -# The span for aligning struct/union member definitions. -# -# 0: Don't align (default). -align_var_struct_span = 0 # unsigned number - -# The threshold for aligning struct/union member definitions. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_var_struct_thresh = 0 # number - -# The gap for aligning struct/union member definitions. -align_var_struct_gap = 0 # unsigned number - -# The span for aligning struct initializer values. -# -# 0: Don't align (default). -align_struct_init_span = 0 # unsigned number - -# The span for aligning single-line typedefs. -# -# 0: Don't align (default). -align_typedef_span = 0 # unsigned number - -# The minimum space between the type and the synonym of a typedef. -align_typedef_gap = 0 # unsigned number - -# How to align typedef'd functions with other typedefs. -# -# 0: Don't mix them at all (default) -# 1: Align the open parenthesis with the types -# 2: Align the function type name with the other type names -align_typedef_func = 0 # unsigned number - -# How to consider (or treat) the '*' in the alignment of typedefs. -# -# 0: Part of the typedef type, 'typedef int * pint;' (default) -# 1: Part of type name: 'typedef int *pint;' -# 2: Dangling: 'typedef int *pint;' -# Dangling: the '*' will not be taken into account when aligning. -align_typedef_star_style = 0 # unsigned number - -# How to consider (or treat) the '&' in the alignment of typedefs. -# -# 0: Part of the typedef type, 'typedef int & intref;' (default) -# 1: Part of type name: 'typedef int &intref;' -# 2: Dangling: 'typedef int &intref;' -# Dangling: the '&' will not be taken into account when aligning. -align_typedef_amp_style = 0 # unsigned number - -# The span for aligning comments that end lines. -# -# 0: Don't align (default). -align_right_cmt_span = 0 # unsigned number - -# Minimum number of columns between preceding text and a trailing comment in -# order for the comment to qualify for being aligned. Must be non-zero to have -# an effect. -align_right_cmt_gap = 0 # unsigned number - -# If aligning comments, whether to mix with comments after '}' and #endif with -# less than three spaces before the comment. -align_right_cmt_mix = false # true/false - -# Whether to only align trailing comments that are at the same brace level. -align_right_cmt_same_level = false # true/false - -# Minimum column at which to align trailing comments. Comments which are -# aligned beyond this column, but which can be aligned in a lesser column, -# may be "pulled in". -# -# 0: Ignore (default). -align_right_cmt_at_col = 0 # unsigned number - -# The span for aligning function prototypes. -# -# 0: Don't align (default). -align_func_proto_span = 0 # unsigned number - -# The threshold for aligning function prototypes. -# Use a negative number for absolute thresholds. -# -# 0: No limit (default). -align_func_proto_thresh = 0 # number - -# Minimum gap between the return type and the function name. -align_func_proto_gap = 0 # unsigned number - -# Whether to align function prototypes on the 'operator' keyword instead of -# what follows. -align_on_operator = false # true/false - -# Whether to mix aligning prototype and variable declarations. If true, -# align_var_def_XXX options are used instead of align_func_proto_XXX options. -align_mix_var_proto = false # true/false - -# Whether to align single-line functions with function prototypes. -# Uses align_func_proto_span. -align_single_line_func = false # true/false - -# Whether to align the open brace of single-line functions. -# Requires align_single_line_func=true. Uses align_func_proto_span. -align_single_line_brace = false # true/false - -# Gap for align_single_line_brace. -align_single_line_brace_gap = 0 # unsigned number - -# (OC) The span for aligning Objective-C message specifications. -# -# 0: Don't align (default). -align_oc_msg_spec_span = 0 # unsigned number - -# Whether to align macros wrapped with a backslash and a newline. This will -# not work right if the macro contains a multi-line comment. -align_nl_cont = false # true/false - -# Whether to align macro functions and variables together. -align_pp_define_together = false # true/false - -# The span for aligning on '#define' bodies. -# -# =0: Don't align (default) -# >0: Number of lines (including comments) between blocks -align_pp_define_span = 0 # unsigned number - -# The minimum space between label and value of a preprocessor define. -align_pp_define_gap = 0 # unsigned number - -# Whether to align lines that start with '<<' with previous '<<'. -# -# Default: true -align_left_shift = true # true/false - -# Whether to align text after 'asm volatile ()' colons. -align_asm_colon = false # true/false - -# (OC) Span for aligning parameters in an Objective-C message call -# on the ':'. -# -# 0: Don't align. -align_oc_msg_colon_span = 0 # unsigned number - -# (OC) Whether to always align with the first parameter, even if it is too -# short. -align_oc_msg_colon_first = false # true/false - -# (OC) Whether to align parameters in an Objective-C '+' or '-' declaration -# on the ':'. -align_oc_decl_colon = false # true/false - -# -# Comment modification options -# - -# Try to wrap comments at N columns. -cmt_width = 0 # unsigned number - -# How to reflow comments. -# -# 0: No reflowing (apart from the line wrapping due to cmt_width) (default) -# 1: No touching at all -# 2: Full reflow -cmt_reflow_mode = 0 # unsigned number - -# Whether to convert all tabs to spaces in comments. If false, tabs in -# comments are left alone, unless used for indenting. -cmt_convert_tab_to_spaces = false # true/false - -# Whether to apply changes to multi-line comments, including cmt_width, -# keyword substitution and leading chars. -# -# Default: true -cmt_indent_multi = true # true/false - -# Whether to group c-comments that look like they are in a block. -cmt_c_group = false # true/false - -# Whether to put an empty '/*' on the first line of the combined c-comment. -cmt_c_nl_start = false # true/false - -# Whether to add a newline before the closing '*/' of the combined c-comment. -cmt_c_nl_end = false # true/false - -# Whether to change cpp-comments into c-comments. -cmt_cpp_to_c = false # true/false - -# Whether to group cpp-comments that look like they are in a block. Only -# meaningful if cmt_cpp_to_c=true. -cmt_cpp_group = false # true/false - -# Whether to put an empty '/*' on the first line of the combined cpp-comment -# when converting to a c-comment. -# -# Requires cmt_cpp_to_c=true and cmt_cpp_group=true. -cmt_cpp_nl_start = false # true/false - -# Whether to add a newline before the closing '*/' of the combined cpp-comment -# when converting to a c-comment. -# -# Requires cmt_cpp_to_c=true and cmt_cpp_group=true. -cmt_cpp_nl_end = false # true/false - -# Whether to put a star on subsequent comment lines. -cmt_star_cont = false # true/false - -# The number of spaces to insert at the start of subsequent comment lines. -cmt_sp_before_star_cont = 0 # unsigned number - -# The number of spaces to insert after the star on subsequent comment lines. -cmt_sp_after_star_cont = 0 # unsigned number - -# For multi-line comments with a '*' lead, remove leading spaces if the first -# and last lines of the comment are the same length. -# -# Default: true -cmt_multi_check_last = true # true/false - -# For multi-line comments with a '*' lead, remove leading spaces if the first -# and last lines of the comment are the same length AND if the length is -# bigger as the first_len minimum. -# -# Default: 4 -cmt_multi_first_len_minimum = 4 # unsigned number - -# Path to a file that contains text to insert at the beginning of a file if -# the file doesn't start with a C/C++ comment. If the inserted text contains -# '$(filename)', that will be replaced with the current file's name. -cmt_insert_file_header = "" # string - -# Path to a file that contains text to insert at the end of a file if the -# file doesn't end with a C/C++ comment. If the inserted text contains -# '$(filename)', that will be replaced with the current file's name. -cmt_insert_file_footer = "" # string - -# Path to a file that contains text to insert before a function definition if -# the function isn't preceded by a C/C++ comment. If the inserted text -# contains '$(function)', '$(javaparam)' or '$(fclass)', these will be -# replaced with, respectively, the name of the function, the javadoc '@param' -# and '@return' stuff, or the name of the class to which the member function -# belongs. -cmt_insert_func_header = "" # string - -# Path to a file that contains text to insert before a class if the class -# isn't preceded by a C/C++ comment. If the inserted text contains '$(class)', -# that will be replaced with the class name. -cmt_insert_class_header = "" # string - -# Path to a file that contains text to insert before an Objective-C message -# specification, if the method isn't preceded by a C/C++ comment. If the -# inserted text contains '$(message)' or '$(javaparam)', these will be -# replaced with, respectively, the name of the function, or the javadoc -# '@param' and '@return' stuff. -cmt_insert_oc_msg_header = "" # string - -# Whether a comment should be inserted if a preprocessor is encountered when -# stepping backwards from a function name. -# -# Applies to cmt_insert_oc_msg_header, cmt_insert_func_header and -# cmt_insert_class_header. -cmt_insert_before_preproc = false # true/false - -# Whether a comment should be inserted if a function is declared inline to a -# class definition. -# -# Applies to cmt_insert_func_header. -# -# Default: true -cmt_insert_before_inlines = true # true/false - -# Whether a comment should be inserted if the function is a class constructor -# or destructor. -# -# Applies to cmt_insert_func_header. -cmt_insert_before_ctor_dtor = false # true/false - -# -# Code modifying options (non-whitespace) -# - -# Add or remove braces on a single-line 'do' statement. -mod_full_brace_do = ignore # ignore/add/remove/force - -# Add or remove braces on a single-line 'for' statement. -mod_full_brace_for = ignore # ignore/add/remove/force - -# (Pawn) Add or remove braces on a single-line function definition. -mod_full_brace_function = ignore # ignore/add/remove/force - -# Add or remove braces on a single-line 'if' statement. Braces will not be -# removed if the braced statement contains an 'else'. -mod_full_brace_if = ignore # ignore/add/remove/force - -# Whether to enforce that all blocks of an 'if'/'else if'/'else' chain either -# have, or do not have, braces. If true, braces will be added if any block -# needs braces, and will only be removed if they can be removed from all -# blocks. -# -# Overrides mod_full_brace_if. -mod_full_brace_if_chain = false # true/false - -# Whether to add braces to all blocks of an 'if'/'else if'/'else' chain. -# If true, mod_full_brace_if_chain will only remove braces from an 'if' that -# does not have an 'else if' or 'else'. -mod_full_brace_if_chain_only = false # true/false - -# Add or remove braces on single-line 'while' statement. -mod_full_brace_while = ignore # ignore/add/remove/force - -# Add or remove braces on single-line 'using ()' statement. -mod_full_brace_using = ignore # ignore/add/remove/force - -# Don't remove braces around statements that span N newlines -mod_full_brace_nl = 0 # unsigned number - -# Whether to prevent removal of braces from 'if'/'for'/'while'/etc. blocks -# which span multiple lines. -# -# Affects: -# mod_full_brace_for -# mod_full_brace_if -# mod_full_brace_if_chain -# mod_full_brace_if_chain_only -# mod_full_brace_while -# mod_full_brace_using -# -# Does not affect: -# mod_full_brace_do -# mod_full_brace_function -mod_full_brace_nl_block_rem_mlcond = false # true/false - -# Add or remove unnecessary parenthesis on 'return' statement. -mod_paren_on_return = ignore # ignore/add/remove/force - -# (Pawn) Whether to change optional semicolons to real semicolons. -mod_pawn_semicolon = false # true/false - -# Whether to fully parenthesize Boolean expressions in 'while' and 'if' -# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'. -mod_full_paren_if_bool = false # true/false - -# Whether to remove superfluous semicolons. -mod_remove_extra_semicolon = false # true/false - -# If a function body exceeds the specified number of newlines and doesn't have -# a comment after the close brace, a comment will be added. -mod_add_long_function_closebrace_comment = 0 # unsigned number - -# If a namespace body exceeds the specified number of newlines and doesn't -# have a comment after the close brace, a comment will be added. -mod_add_long_namespace_closebrace_comment = 0 # unsigned number - -# If a class body exceeds the specified number of newlines and doesn't have a -# comment after the close brace, a comment will be added. -mod_add_long_class_closebrace_comment = 0 # unsigned number - -# If a switch body exceeds the specified number of newlines and doesn't have a -# comment after the close brace, a comment will be added. -mod_add_long_switch_closebrace_comment = 0 # unsigned number - -# If an #ifdef body exceeds the specified number of newlines and doesn't have -# a comment after the #endif, a comment will be added. -mod_add_long_ifdef_endif_comment = 0 # unsigned number - -# If an #ifdef or #else body exceeds the specified number of newlines and -# doesn't have a comment after the #else, a comment will be added. -mod_add_long_ifdef_else_comment = 0 # unsigned number - -# Whether to take care of the case by the mod_sort_xx options. -mod_sort_case_sensitive = false # true/false - -# Whether to sort consecutive single-line 'import' statements. -mod_sort_import = false # true/false - -# (C#) Whether to sort consecutive single-line 'using' statements. -mod_sort_using = false # true/false - -# Whether to sort consecutive single-line '#include' statements (C/C++) and -# '#import' statements (Objective-C). Be aware that this has the potential to -# break your code if your includes/imports have ordering dependencies. -mod_sort_include = false # true/false - -# Whether to move a 'break' that appears after a fully braced 'case' before -# the close brace, as in 'case X: { ... } break;' => 'case X: { ... break; }'. -mod_move_case_break = false # true/false - -# Add or remove braces around a fully braced case statement. Will only remove -# braces if there are no variable declarations in the block. -mod_case_brace = ignore # ignore/add/remove/force - -# Whether to remove a void 'return;' that appears as the last statement in a -# function. -mod_remove_empty_return = false # true/false - -# Add or remove the comma after the last value of an enumeration. -mod_enum_last_comma = ignore # ignore/add/remove/force - -# (OC) Whether to organize the properties. If true, properties will be -# rearranged according to the mod_sort_oc_property_*_weight factors. -mod_sort_oc_properties = false # true/false - -# (OC) Weight of a class property modifier. -mod_sort_oc_property_class_weight = 0 # number - -# (OC) Weight of 'atomic' and 'nonatomic'. -mod_sort_oc_property_thread_safe_weight = 0 # number - -# (OC) Weight of 'readwrite' when organizing properties. -mod_sort_oc_property_readwrite_weight = 0 # number - -# (OC) Weight of a reference type specifier ('retain', 'copy', 'assign', -# 'weak', 'strong') when organizing properties. -mod_sort_oc_property_reference_weight = 0 # number - -# (OC) Weight of getter type ('getter=') when organizing properties. -mod_sort_oc_property_getter_weight = 0 # number - -# (OC) Weight of setter type ('setter=') when organizing properties. -mod_sort_oc_property_setter_weight = 0 # number - -# (OC) Weight of nullability type ('nullable', 'nonnull', 'null_unspecified', -# 'null_resettable') when organizing properties. -mod_sort_oc_property_nullability_weight = 0 # number - -# -# Preprocessor options -# - -# Add or remove indentation of preprocessor directives inside #if blocks -# at brace level 0 (file-level). -pp_indent = ignore # ignore/add/remove/force - -# Whether to indent #if/#else/#endif at the brace level. If false, these are -# indented from column 1. -pp_indent_at_level = false # true/false - -# Specifies the number of columns to indent preprocessors per level -# at brace level 0 (file-level). If pp_indent_at_level=false, also specifies -# the number of columns to indent preprocessors per level -# at brace level > 0 (function-level). -# -# Default: 1 -pp_indent_count = 1 # unsigned number - -# Add or remove space after # based on pp_level of #if blocks. -pp_space = ignore # ignore/add/remove/force - -# Sets the number of spaces per level added with pp_space. -pp_space_count = 0 # unsigned number - -# The indent for '#region' and '#endregion' in C# and '#pragma region' in -# C/C++. Negative values decrease indent down to the first column. -pp_indent_region = 0 # number - -# Whether to indent the code between #region and #endregion. -pp_region_indent_code = false # true/false - -# If pp_indent_at_level=true, sets the indent for #if, #else and #endif when -# not at file-level. Negative values decrease indent down to the first column. -# -# =0: Indent preprocessors using output_tab_size -# >0: Column at which all preprocessors will be indented -pp_indent_if = 0 # number - -# Whether to indent the code between #if, #else and #endif. -pp_if_indent_code = false # true/false - -# Whether to indent '#define' at the brace level. If false, these are -# indented from column 1. -pp_define_at_level = false # true/false - -# Whether to ignore the '#define' body while formatting. -pp_ignore_define_body = false # true/false - -# Whether to indent case statements between #if, #else, and #endif. -# Only applies to the indent of the preprocesser that the case statements -# directly inside of. -# -# Default: true -pp_indent_case = true # true/false - -# Whether to indent whole function definitions between #if, #else, and #endif. -# Only applies to the indent of the preprocesser that the function definition -# is directly inside of. -# -# Default: true -pp_indent_func_def = true # true/false - -# Whether to indent extern C blocks between #if, #else, and #endif. -# Only applies to the indent of the preprocesser that the extern block is -# directly inside of. -# -# Default: true -pp_indent_extern = true # true/false - -# Whether to indent braces directly inside #if, #else, and #endif. -# Only applies to the indent of the preprocesser that the braces are directly -# inside of. -# -# Default: true -pp_indent_brace = true # true/false - -# -# Sort includes options -# - -# The regex for include category with priority 0. -include_category_0 = "" # string - -# The regex for include category with priority 1. -include_category_1 = "" # string - -# The regex for include category with priority 2. -include_category_2 = "" # string - -# -# Use or Do not Use options -# - -# true: indent_func_call_param will be used (default) -# false: indent_func_call_param will NOT be used -# -# Default: true -use_indent_func_call_param = true # true/false - -# The value of the indentation for a continuation line is calculated -# differently if the statement is: -# - a declaration: your case with QString fileName ... -# - an assignment: your case with pSettings = new QSettings( ... -# -# At the second case the indentation value might be used twice: -# - at the assignment -# - at the function call (if present) -# -# To prevent the double use of the indentation value, use this option with the -# value 'true'. -# -# true: indent_continue will be used only once -# false: indent_continue will be used every time (default) -use_indent_continue_only_once = false # true/false - -# The value might be used twice: -# - at the assignment -# - at the opening brace -# -# To prevent the double use of the indentation value, use this option with the -# value 'true'. -# -# true: indentation will be used only once -# false: indentation will be used every time (default) -indent_cpp_lambda_only_once = true # true/false - -# Whether sp_after_angle takes precedence over sp_inside_fparen. This was the -# historic behavior, but is probably not the desired behavior, so this is off -# by default. -use_sp_after_angle_always = false # true/false - -# Whether to apply special formatting for Qt SIGNAL/SLOT macros. Essentially, -# this tries to format these so that they match Qt's normalized form (i.e. the -# result of QMetaObject::normalizedSignature), which can slightly improve the -# performance of the QObject::connect call, rather than how they would -# otherwise be formatted. -# -# See options_for_QT.cpp for details. -# -# Default: true -use_options_overriding_for_qt_macros = true # true/false - -# -# Warn levels - 1: error, 2: warning (default), 3: note -# - -# (C#) Warning is given if doing tab-to-\t replacement and we have found one -# in a C# verbatim string literal. -# -# Default: 2 -warn_level_tabs_found_in_verbatim_string_literals = 2 # unsigned number - -# Meaning of the settings: -# Ignore - do not do any changes -# Add - makes sure there is 1 or more space/brace/newline/etc -# Force - makes sure there is exactly 1 space/brace/newline/etc, -# behaves like Add in some contexts -# Remove - removes space/brace/newline/etc -# -# -# - Token(s) can be treated as specific type(s) with the 'set' option: -# `set tokenType tokenString [tokenString...]` -# -# Example: -# `set BOOL __AND__ __OR__` -# -# tokenTypes are defined in src/token_enum.h, use them without the -# 'CT_' prefix: 'CT_BOOL' => 'BOOL' -# -# -# - Token(s) can be treated as type(s) with the 'type' option. -# `type tokenString [tokenString...]` -# -# Example: -# `type int c_uint_8 Rectangle` -# -# This can also be achieved with `set TYPE int c_uint_8 Rectangle` -# -# -# To embed whitespace in tokenStrings use the '\' escape character, or quote -# the tokenStrings. These quotes are supported: "'` -# -# -# - Support for the auto detection of languages through the file ending can be -# added using the 'file_ext' command. -# `file_ext langType langString [langString..]` -# -# Example: -# `file_ext CPP .ch .cxx .cpp.in` -# -# langTypes are defined in uncrusify_types.h in the lang_flag_e enum, use -# them without the 'LANG_' prefix: 'LANG_CPP' => 'CPP' -# -# -# - Custom macro-based indentation can be set up using 'macro-open', -# 'macro-else' and 'macro-close'. -# `(macro-open | macro-else | macro-close) tokenString` -# -# Example: -# `macro-open BEGIN_TEMPLATE_MESSAGE_MAP` -# `macro-open BEGIN_MESSAGE_MAP` -# `macro-close END_MESSAGE_MAP` -# -# -# option(s) with 'not default' value: 0 -# - -file_ext CPP .ch .cxx .cpp.in .cc .hh - From 72ecccee5781ec0b57b2860f677b8a64db43cda7 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 12 May 2020 12:19:34 -0600 Subject: [PATCH 042/120] convert to logWarning format --- src/libexpr/parser.y | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 3ae7bbafd..49fb8ad37 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -717,7 +717,11 @@ std::pair EvalState::resolveSearchPathElem(const SearchPathEl res = { true, store->toRealPath(fetchers::downloadTarball( store, resolveUri(elem.second), "source", false).storePath) }; } catch (FileTransferError & e) { - printError("warning: Nix search path entry '%1%' cannot be downloaded, ignoring", elem.second); + logWarning( + ErrorInfo { + .name = "Entry download", + .hint = hintfmt("Nix search path entry '%1%' cannot be downloaded, ignoring", elem.second) + }); res = { false, "" }; } } else { @@ -727,7 +731,7 @@ std::pair EvalState::resolveSearchPathElem(const SearchPathEl else { logWarning( ErrorInfo { - .name = "Search path not found", + .name = "Entry not found", .hint = hintfmt("warning: Nix search path entry '%1%' does not exist, ignoring", elem.second) }); res = { false, "" }; From 960d4362ed2215f87a596e0a994e39aa28680db1 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 12 May 2020 13:54:18 -0600 Subject: [PATCH 043/120] hint only --- src/error-demo/error-demo.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 8f484431c..82e9f0580 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -149,5 +149,13 @@ int main() .errPos = Pos(problem_file, 40, 13) }}); + // Error with only hint and name.. + logError( + ErrorInfo { .name = "error name", + .hint = hintfmt("hint %1%", "only"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13) + }}); + return 0; } From ecbb8e9c0a4374b26defde2cd10932d633affed3 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 12 May 2020 14:41:30 -0600 Subject: [PATCH 044/120] no blank line if no LOC --- Makefile | 3 ++- src/error-demo/error-demo.cc | 1 + src/libutil/error.cc | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 0ba011e2a..05c4bdc8a 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,8 @@ makefiles = \ misc/upstart/local.mk \ doc/manual/local.mk \ tests/local.mk \ - tests/plugins/local.mk + tests/plugins/local.mk \ + src/error-demo/local.mk -include Makefile.config diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 82e9f0580..0216092e3 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -1,5 +1,6 @@ #include "logging.hh" #include "nixexpr.hh" +#include "util.hh" #include #include diff --git a/src/libutil/error.cc b/src/libutil/error.cc index e4f45a2d3..0765a2945 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -182,7 +182,7 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) } // lines of code. - if (einfo.nixCode.has_value()) { + if (einfo.nixCode.has_value() && einfo.nixCode->errLineOfCode.has_value()) { printCodeLines(out, prefix, *einfo.nixCode); out << prefix << std::endl; } From bfca5fc395bdaf5823413e1a1679f1b0b6db29dd Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 13 May 2020 09:52:36 -0600 Subject: [PATCH 045/120] change status messages to info level --- src/libstore/build.cc | 2 +- src/libstore/gc.cc | 12 ++++++------ src/libstore/local-store.cc | 18 +++++++++--------- src/libutil/logging.cc | 6 +++++- src/libutil/util.cc | 13 +------------ src/nix-env/user-env.cc | 2 +- src/nix/make-content-addressable.cc | 2 +- src/nix/upgrade-nix.cc | 2 +- 8 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 0359b10ac..961110d58 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -4862,7 +4862,7 @@ void Worker::waitForInput() if (!waitingForAWhile.empty()) { useTimeout = true; if (lastWokenUp == steady_time_point::min()) - printError("waiting for locks or build slots..."); + printInfo("waiting for locks or build slots..."); if (lastWokenUp == steady_time_point::min() || lastWokenUp > before) lastWokenUp = before; timeout = std::max(1L, (long) std::chrono::duration_cast( diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index e99423257..e529416b7 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -41,7 +41,7 @@ AutoCloseFD LocalStore::openGCLock(LockType lockType) throw SysError("opening global GC lock '%1%'", fnGCLock); if (!lockFile(fdGCLock.get(), lockType, false)) { - printError("waiting for the big garbage collector lock..."); + printInfo("waiting for the big garbage collector lock..."); lockFile(fdGCLock.get(), lockType, true); } @@ -231,7 +231,7 @@ void LocalStore::findTempRoots(FDs & fds, Roots & tempRoots, bool censor) only succeed if the owning process has died. In that case we don't care about its temporary roots. */ if (lockFile(fd->get(), ltWrite, false)) { - printError("removing stale temporary roots file '%1%'", path); + printInfo("removing stale temporary roots file '%1%'", path); unlink(path.c_str()); writeFull(fd->get(), "d"); continue; @@ -751,7 +751,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) /* Find the roots. Since we've grabbed the GC lock, the set of permanent roots cannot increase now. */ - printError("finding garbage collector roots..."); + printInfo("finding garbage collector roots..."); Roots rootMap; if (!options.ignoreLiveness) findRootsNoTemp(rootMap, true); @@ -803,9 +803,9 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) } else if (options.maxFreed > 0) { if (state.shouldDelete) - printError("deleting garbage..."); + printInfo("deleting garbage..."); else - printError("determining live/dead paths..."); + printInfo("determining live/dead paths..."); try { @@ -872,7 +872,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) /* Clean up the links directory. */ if (options.action == GCOptions::gcDeleteDead || options.action == GCOptions::gcDeleteSpecific) { - printError("deleting unused links..."); + printInfo("deleting unused links..."); removeUnusedLinks(state); } diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 63a825af0..59d551032 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -152,7 +152,7 @@ LocalStore::LocalStore(const Params & params) globalLock = openLockFile(globalLockPath.c_str(), true); if (!lockFile(globalLock.get(), ltRead, false)) { - printError("waiting for the big Nix store lock..."); + printInfo("waiting for the big Nix store lock..."); lockFile(globalLock.get(), ltRead, true); } @@ -183,7 +183,7 @@ LocalStore::LocalStore(const Params & params) "please upgrade Nix to version 1.11 first."); if (!lockFile(globalLock.get(), ltWrite, false)) { - printError("waiting for exclusive access to the Nix store..."); + printInfo("waiting for exclusive access to the Nix store..."); lockFile(globalLock.get(), ltWrite, true); } @@ -261,7 +261,7 @@ LocalStore::~LocalStore() } if (future.valid()) { - printError("waiting for auto-GC to finish on exit..."); + printInfo("waiting for auto-GC to finish on exit..."); future.get(); } @@ -1210,7 +1210,7 @@ void LocalStore::invalidatePathChecked(const StorePath & path) bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) { - printError(format("reading the Nix store...")); + printInfo(format("reading the Nix store...")); bool errors = false; @@ -1251,7 +1251,7 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) }); if (repair) { if (unlink(linkPath.c_str()) == 0) - printError("removed link '%s'", linkPath); + printInfo("removed link '%s'", linkPath); else throw SysError("removing corrupt link '%s'", linkPath); } else { @@ -1294,14 +1294,14 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) /* Fill in missing hashes. */ if (info->narHash == nullHash) { - printError("fixing missing hash on '%s'", printStorePath(i)); + printInfo("fixing missing hash on '%s'", printStorePath(i)); info->narHash = current.first; update = true; } /* Fill in missing narSize fields (from old stores). */ if (info->narSize == 0) { - printError("updating size field on '%s' to %s", printStorePath(i), current.second); + printInfo("updating size field on '%s' to %s", printStorePath(i), current.second); info->narSize = current.second; update = true; } @@ -1360,7 +1360,7 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store, } if (canInvalidate) { - printError("path '%s' disappeared, removing from database...", pathS); + printInfo("path '%s' disappeared, removing from database...", pathS); auto state(_state.lock()); invalidatePath(*state, path); } else { @@ -1431,7 +1431,7 @@ static void makeMutable(const Path & path) void LocalStore::upgradeStore7() { if (getuid() != 0) return; - printError("removing immutable bits from the Nix store (this may take a while)..."); + printInfo("removing immutable bits from the Nix store (this may take a while)..."); makeMutable(realStoreDir); } diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 736ce604e..071a7ec7e 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -251,7 +251,11 @@ bool handleJSONLogMessage(const std::string & msg, } } catch (std::exception & e) { - printError("bad log message from builder: %s", e.what()); + logError( + ErrorInfo { + .name = "Json log message", + .hint = hintfmt("bad log message from builder: %s", e.what()) + }); } return true; diff --git a/src/libutil/util.cc b/src/libutil/util.cc index ac7c2967b..dcf89ff69 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -857,7 +857,7 @@ int Pid::kill() #if __FreeBSD__ || __APPLE__ if (errno != EPERM || ::kill(pid, 0) != 0) #endif - printError((SysError("killing process %d", pid).msg())); + logError(SysError("killing process %d", pid).info()); } return wait(); @@ -1447,17 +1447,6 @@ string base64Decode(const string & s) } -// void callFailure(const std::function & failure, std::exception_ptr exc) -// { -// try { -// failure(exc); -// } catch (std::exception & e) { -// printError("uncaught exception: %s", e.what()); -// abort(); -// } -// } - - static Sync> windowSize{{0, 0}}; diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc index 2484b9759..f804b77a0 100644 --- a/src/nix-env/user-env.cc +++ b/src/nix-env/user-env.cc @@ -146,7 +146,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, Path lockTokenCur = optimisticLockProfile(profile); if (lockToken != lockTokenCur) { - printError("profile '%1%' changed while we were busy; restarting", profile); + printInfo("profile '%1%' changed while we were busy; restarting", profile); return false; } diff --git a/src/nix/make-content-addressable.cc b/src/nix/make-content-addressable.cc index 8803461f4..0da4fa4b4 100644 --- a/src/nix/make-content-addressable.cc +++ b/src/nix/make-content-addressable.cc @@ -85,7 +85,7 @@ struct CmdMakeContentAddressable : StorePathsCommand, MixJSON info.ca = makeFixedOutputCA(true, info.narHash); if (!json) - printError("rewrote '%s' to '%s'", pathS, store->printStorePath(info.path)); + printInfo("rewrote '%s' to '%s'", pathS, store->printStorePath(info.path)); auto source = sinkToSource([&](Sink & nextSink) { RewritingSink rsink2(oldHashPart, storePathToHash(store->printStorePath(info.path)), nextSink); diff --git a/src/nix/upgrade-nix.cc b/src/nix/upgrade-nix.cc index 9e7ebcd9c..fdf94e5a3 100644 --- a/src/nix/upgrade-nix.cc +++ b/src/nix/upgrade-nix.cc @@ -98,7 +98,7 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand {"--profile", profileDir, "-i", store->printStorePath(storePath), "--no-sandbox"}); } - printError(ANSI_GREEN "upgrade to version %s done" ANSI_NORMAL, version); + printInfo(ANSI_GREEN "upgrade to version %s done" ANSI_NORMAL, version); } /* Return the profile in which Nix is installed. */ From c79d4addab7ea476f551bc8727e4d1f27adcef31 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 13 May 2020 10:02:18 -0600 Subject: [PATCH 046/120] consistent capitalization --- src/build-remote/build-remote.cc | 2 +- src/libstore/builtins/buildenv.cc | 4 ++-- src/libstore/filetransfer.cc | 2 +- src/libstore/gc.cc | 2 +- src/libstore/local-store.cc | 4 ++-- src/libstore/optimise-store.cc | 4 ++-- src/libstore/sqlite.cc | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc index 0d6859596..0caa97fa4 100644 --- a/src/build-remote/build-remote.cc +++ b/src/build-remote/build-remote.cc @@ -202,7 +202,7 @@ static int _main(int argc, char * * argv) auto msg = chomp(drainFD(5, false)); logError( ErrorInfo { - .name = "remote build", + .name = "Remote build", .hint = hintfmt("cannot build on '%s': %s%s", bestMachine->storeUri, e.what(), (msg.empty() ? "" : ": " + msg)) diff --git a/src/libstore/builtins/buildenv.cc b/src/libstore/builtins/buildenv.cc index 64085fcc9..6c493ed77 100644 --- a/src/libstore/builtins/buildenv.cc +++ b/src/libstore/builtins/buildenv.cc @@ -24,7 +24,7 @@ static void createLinks(State & state, const Path & srcDir, const Path & dstDir, if (e.errNo == ENOTDIR) { logWarning( ErrorInfo { - .name = "Create Links - Directory", + .name = "Create links - directory", .hint = hintfmt("not including '%s' in the user environment because it's not a directory", srcDir) }); return; @@ -47,7 +47,7 @@ static void createLinks(State & state, const Path & srcDir, const Path & dstDir, if (e.errNo == ENOENT || e.errNo == ENOTDIR) { logWarning( ErrorInfo { - .name = "Create Links - Skipping Symlink", + .name = "Create links - skipping symlink", .hint = hintfmt("skipping dangling symlink '%s'", dstFile) }); continue; diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index 3285edded..89588d662 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -601,7 +601,7 @@ struct curlFileTransfer : public FileTransfer } catch (std::exception & e) { logError( ErrorInfo { - .name = "download", + .name = "File transfer", .hint = hintfmt("unexpected error in download thread: %s", e.what()) }); diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index e529416b7..d53d458e9 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -132,7 +132,7 @@ Path LocalFSStore::addPermRoot(const StorePath & storePath, logWarning( ErrorInfo { - .name = "GC Root", + .name = "GC root", .hint = hintfmt("warning: '%1%' is not in a directory where the garbage collector looks for roots; " "therefore, '%2%' might be removed by the garbage collector", gcRoot, printStorePath(storePath)) diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 59d551032..194eefc78 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -1244,7 +1244,7 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) if (hash != link.name) { logError( ErrorInfo { - .name = "Invalid Hash", + .name = "Invalid hash", .hint = hintfmt( "link '%s' was modified! expected hash '%s', got '%s'", linkPath, link.name, hash) @@ -1283,7 +1283,7 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) if (info->narHash != nullHash && info->narHash != current.first) { logError( ErrorInfo { - .name = "Invalid Hash - Path Modified", + .name = "Invalid hash - path modified", .hint = hintfmt("path '%s' was modified! expected hash '%s', got '%s'", printStorePath(i), info->narHash.to_string(), current.first.to_string()) }); diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc index 9f6112183..c9ecca5a8 100644 --- a/src/libstore/optimise-store.cc +++ b/src/libstore/optimise-store.cc @@ -132,7 +132,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, if (S_ISREG(st.st_mode) && (st.st_mode & S_IWUSR)) { logWarning( ErrorInfo { - .name = "Suspicious File", + .name = "Suspicious file", .hint = hintfmt("skipping suspicious writable file '%1%'", path) }); return; @@ -200,7 +200,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, if (st.st_size != stLink.st_size) { logWarning( ErrorInfo { - .name = "Corrupted Link", + .name = "Corrupted link", .hint = hintfmt("removing corrupted link '%1%'", linkPath) }); unlink(linkPath.c_str()); diff --git a/src/libstore/sqlite.cc b/src/libstore/sqlite.cc index 082c54005..34ef5e57b 100644 --- a/src/libstore/sqlite.cc +++ b/src/libstore/sqlite.cc @@ -205,7 +205,7 @@ void handleSQLiteBusy(SQLiteBusy & e) if (now > lastWarned + 10) { lastWarned = now; logWarning( - ErrorInfo { .name = "sqlite busy", + ErrorInfo { .name = "Sqlite busy", .hint = hintfmt(e.what()) }); } From d44bac1d9232374bf823ed24f5a5ae693f89fb7d Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 13 May 2020 12:39:45 -0600 Subject: [PATCH 047/120] remove error-demo from Makefile again --- Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 05c4bdc8a..0ba011e2a 100644 --- a/Makefile +++ b/Makefile @@ -17,8 +17,7 @@ makefiles = \ misc/upstart/local.mk \ doc/manual/local.mk \ tests/local.mk \ - tests/plugins/local.mk \ - src/error-demo/local.mk + tests/plugins/local.mk -include Makefile.config From ef9dd9f9bc18abc9761812e30a26008c99a26166 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 13 May 2020 15:56:39 -0600 Subject: [PATCH 048/120] formatting and a few minor changes --- src/libexpr/parser.y | 2 - src/libexpr/primops.cc | 59 ++++++++++++--------------- src/libexpr/primops/context.cc | 2 - src/libexpr/primops/fetchMercurial.cc | 1 - src/libstore/build.cc | 40 ++++++++---------- src/libstore/gc.cc | 1 - src/libstore/local-store.cc | 2 +- src/libstore/sqlite.cc | 2 +- src/libstore/sqlite.hh | 2 +- src/libutil/types.hh | 8 ++-- src/nix-daemon/nix-daemon.cc | 4 +- src/nix-env/nix-env.cc | 6 +-- src/nix-store/nix-store.cc | 2 +- 13 files changed, 54 insertions(+), 77 deletions(-) diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 49fb8ad37..0417a3c21 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -427,7 +427,6 @@ expr_simple .hint = hintfmt("URL literals are disabled"), .nixCode = NixCode { .errPos = CUR_POS } }); - $$ = new ExprString(data->symbols.create($1)); } | '(' expr ')' { $$ = $2; } @@ -696,7 +695,6 @@ Path EvalState::findFile(SearchPath & searchPath, const string & path, const Pos Path res = r.second + suffix; if (pathExists(res)) return canonPath(res); } - throw ThrownError( ErrorInfo { .hint = hintfmt("file '%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)", path), diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 657ce3001..d21c49813 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -99,7 +99,6 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args path, e.path), .nixCode = NixCode { .errPos = pos } }); - } Path realPath = state.checkSourcePath(state.toRealPath(path, context)); @@ -179,7 +178,7 @@ void prim_importNative(EvalState & state, const Pos & pos, Value * * args, Value ErrorInfo { .hint = hintfmt( "cannot import '%1%', since path '%2%' is not valid", - path, e.path), + path, e.path), .nixCode = NixCode { .errPos = pos } }); } @@ -199,8 +198,8 @@ void prim_importNative(EvalState & state, const Pos & pos, Value * * args, Value if (message) throw EvalError("could not load symbol '%1%' from '%2%': %3%", sym, path, message); else - throw EvalError("symbol '%1%' from '%2%' resolved to NULL when a function pointer was expected" - , sym, path); + throw EvalError("symbol '%1%' from '%2%' resolved to NULL when a function pointer was expected", + sym, path); } (func)(state, v); @@ -233,8 +232,8 @@ void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v) } catch (InvalidPathError & e) { throw EvalError( ErrorInfo { - .hint = hintfmt("cannot execute '%1%', since path '%2%' is not valid" - , program, e.path), + .hint = hintfmt("cannot execute '%1%', since path '%2%' is not valid", + program, e.path), .nixCode = NixCode { .errPos = pos } });} @@ -625,8 +624,6 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * .hint = hintfmt("duplicate derivation output '%1%'", j), .nixCode = NixCode { .errPos = posDrvName } }); - - /* !!! Check whether j is a valid attribute name. */ /* Derivations cannot be named ‘drv’, because @@ -638,7 +635,6 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * .hint = hintfmt("invalid derivation output name 'drv'" ), .nixCode = NixCode { .errPos = posDrvName } }); - outputs.insert(j); } if (outputs.empty()) @@ -1236,7 +1232,6 @@ static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value path), .nixCode = NixCode { .errPos = *attr.pos } }); - } else if (attr.name == state.sName) name = state.forceStringNoCtx(*attr.value, *attr.pos); else if (n == "filter") { @@ -1322,7 +1317,6 @@ void prim_getAttr(EvalState & state, const Pos & pos, Value * * args, Value & v) .hint = hintfmt("attribute '%1%' missing", attr), .nixCode = NixCode { .errPos = pos } }); - // !!! add to stack trace? if (state.countCalls && i->pos) state.attrSelects[*i->pos]++; state.forceValue(*i->value, pos); @@ -1407,7 +1401,6 @@ static void prim_listToAttrs(EvalState & state, const Pos & pos, Value * * args, .hint = hintfmt("'name' attribute missing in a call to 'listToAttrs'"), .nixCode = NixCode { .errPos = pos } }); - string name = state.forceStringNoCtx(*j->value, pos); Symbol sym = state.symbols.create(name); @@ -1419,7 +1412,6 @@ static void prim_listToAttrs(EvalState & state, const Pos & pos, Value * * args, .hint = hintfmt("'value' attribute missing in a call to 'listToAttrs'"), .nixCode = NixCode { .errPos = pos } }); - v.attrs->push_back(Attr(sym, j2->value, j2->pos)); } } @@ -1498,7 +1490,6 @@ static void prim_functionArgs(EvalState & state, const Pos & pos, Value * * args .nixCode = NixCode { .errPos = pos } }); - if (!args[0]->lambda.fun->matchAttrs) { state.mkAttrs(v, 0); return; @@ -2038,16 +2029,16 @@ void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v) if (e.code() == std::regex_constants::error_space) { // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ throw EvalError( - ErrorInfo { - .hint = hintfmt("memory limit exceeded by regular expression '%s'", re), + ErrorInfo { + .hint = hintfmt("memory limit exceeded by regular expression '%s'", re), .nixCode = NixCode { .errPos = pos } }); } else { - throw EvalError( - ErrorInfo { - .hint = hintfmt("invalid regular expression '%s'", re), - .nixCode = NixCode { .errPos = pos } - }); + throw EvalError( + ErrorInfo { + .hint = hintfmt("invalid regular expression '%s'", re), + .nixCode = NixCode { .errPos = pos } + }); } } } @@ -2111,19 +2102,19 @@ static void prim_split(EvalState & state, const Pos & pos, Value * * args, Value } catch (std::regex_error &e) { if (e.code() == std::regex_constants::error_space) { - // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ - throw EvalError( - ErrorInfo { - .hint = hintfmt("memory limit exceeded by regular expression '%s'", re), - .nixCode = NixCode { .errPos = pos } - }); - } else { - throw EvalError( - ErrorInfo { - .hint = hintfmt("invalid regular expression '%s'", re), - .nixCode = NixCode { .errPos = pos } - }); - } + // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ + throw EvalError( + ErrorInfo { + .hint = hintfmt("memory limit exceeded by regular expression '%s'", re), + .nixCode = NixCode { .errPos = pos } + }); + } else { + throw EvalError( + ErrorInfo { + .hint = hintfmt("invalid regular expression '%s'", re), + .nixCode = NixCode { .errPos = pos } + }); + } } } diff --git a/src/libexpr/primops/context.cc b/src/libexpr/primops/context.cc index 768936453..7f895fc01 100644 --- a/src/libexpr/primops/context.cc +++ b/src/libexpr/primops/context.cc @@ -151,7 +151,6 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg .hint = hintfmt("Context key '%s' is not a store path", i.name), .nixCode = NixCode { .errPos = *i.pos } }); - if (!settings.readOnlyMode) state.store->ensurePath(state.store->parseStorePath(i.name)); state.forceAttrs(*i.value, *i.pos); @@ -170,7 +169,6 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg .hint = hintfmt("Tried to add all-outputs context of %s, which is not a derivation, to a string", i.name), .nixCode = NixCode { .errPos = *i.pos } }); - } context.insert("=" + string(i.name)); } diff --git a/src/libexpr/primops/fetchMercurial.cc b/src/libexpr/primops/fetchMercurial.cc index 1e8b9d4a0..bb008ba6b 100644 --- a/src/libexpr/primops/fetchMercurial.cc +++ b/src/libexpr/primops/fetchMercurial.cc @@ -43,7 +43,6 @@ static void prim_fetchMercurial(EvalState & state, const Pos & pos, Value * * ar .hint = hintfmt("unsupported argument '%s' to 'fetchMercurial'", attr.name), .nixCode = NixCode { .errPos = *attr.pos } }); - } if (url.empty()) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 961110d58..64bc9c4b8 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -497,8 +497,8 @@ void handleDiffHook( printError(chomp(diffRes.second)); } catch (Error & error) { ErrorInfo ei = error.info(); - string prevhint = (error.info().hint.has_value() ? error.info().hint->str() : ""); - ei.hint = std::optional(hintfmt("diff hook execution failed: %s", prevhint)); + ei.hint = hintfmt("diff hook execution failed: %s", + (error.info().hint.has_value() ? error.info().hint->str() : "")); logError(ei); } } @@ -1151,7 +1151,7 @@ void DerivationGoal::loadDerivation() if (nrFailed != 0) { logError( - ErrorInfo { + ErrorInfo { .name = "missing derivation during build", .hint = hintfmt("cannot build missing derivation '%s'", worker.store.printStorePath(drvPath)) }); @@ -1306,13 +1306,12 @@ void DerivationGoal::repairClosure() for (auto & i : outputClosure) { if (worker.pathContentsGood(i)) continue; logError( - ErrorInfo { + ErrorInfo { .name = "Corrupt path in closure", .hint = hintfmt( "found corrupted or missing path '%s' in the output closure of '%s'", worker.store.printStorePath(i), worker.store.printStorePath(drvPath)) }); - auto drvPath2 = outputsToDrv.find(i); if (drvPath2 == outputsToDrv.end()) addWaitee(worker.makeSubstitutionGoal(i, Repair)); @@ -1347,7 +1346,7 @@ void DerivationGoal::inputsRealised() if (!useDerivation) throw Error("some dependencies of '%s' are missing", worker.store.printStorePath(drvPath)); logError( - ErrorInfo { + ErrorInfo { .name = "Dependencies could not be built", .hint = hintfmt( "cannot build derivation '%s': %s dependencies couldn't be built", @@ -1811,7 +1810,7 @@ HookReply DerivationGoal::tryBuildHook() } catch (SysError & e) { if (e.errNo == EPIPE) { logError( - ErrorInfo { + ErrorInfo { .name = "Build hook died", .hint = hintfmt( "build hook died unexpectedly: %s", @@ -3676,7 +3675,7 @@ void DerivationGoal::registerOutputs() if (!outputRewrites.empty()) { logWarning( ErrorInfo { - .name = "Rewriting hashes", + .name = "Rewriting hashes", .hint = hintfmt("rewriting hashes in '%1%'; cross fingers", path) }); @@ -3856,7 +3855,7 @@ void DerivationGoal::registerOutputs() throw NotDeterministic(hint); logError( - ErrorInfo { + ErrorInfo { .name = "Output determinism error", .hint = hint }); @@ -4124,7 +4123,7 @@ void DerivationGoal::handleChildOutput(int fd, const string & data) logSize += data.size(); if (settings.maxLogSize && logSize > settings.maxLogSize) { logError( - ErrorInfo { + ErrorInfo { .name = "Max log size exceeded", .hint = hintfmt( "%1% killed after writing more than %2% bytes of log output", @@ -4447,9 +4446,9 @@ void SubstitutionGoal::tryNext() { logWarning( ErrorInfo { - .name = "Invalid path signature", + .name = "Invalid path signature", .hint = hintfmt("substituter '%s' does not have a valid signature for path '%s'", - sub->getUri(), worker.store.printStorePath(storePath)) + sub->getUri(), worker.store.printStorePath(storePath)) }); tryNext(); return; @@ -4809,7 +4808,7 @@ void Worker::run(const Goals & _topGoals) if (!children.empty() || !waitingForAWhile.empty()) waitForInput(); else { - if (awake.empty() && 0 == settings.maxBuildJobs) + if (awake.empty() && 0 == settings.maxBuildJobs) throw Error("unable to start any build; either increase '--max-jobs' " "or enable remote builds"); assert(!awake.empty()); @@ -4933,7 +4932,7 @@ void Worker::waitForInput() after - j->lastOutput >= std::chrono::seconds(settings.maxSilentTime)) { logError( - ErrorInfo { + ErrorInfo { .name = "Silent build timeout", .hint = hintfmt( "%1% timed out after %2% seconds of silence", @@ -4948,7 +4947,7 @@ void Worker::waitForInput() after - j->timeStarted >= std::chrono::seconds(settings.buildTimeout)) { logError( - ErrorInfo { + ErrorInfo { .name = "Build timeout", .hint = hintfmt( "%1% timed out after %2% seconds", @@ -4969,9 +4968,6 @@ void Worker::waitForInput() } - - - unsigned int Worker::exitStatus() { /* @@ -5015,9 +5011,9 @@ bool Worker::pathContentsGood(const StorePath & path) res = info->narHash == nullHash || info->narHash == current.first; } pathContentsGoodCache.insert_or_assign(path.clone(), res); - if (!res) + if (!res) logError( - ErrorInfo { + ErrorInfo { .name = "Corrupted path", .hint = hintfmt("path '%s' is corrupted or missing!", store.printStorePath(path)) }); @@ -5136,8 +5132,4 @@ void LocalStore::repairPath(const StorePath & path) } - } - - - diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index d53d458e9..92f9328c3 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -129,7 +129,6 @@ Path LocalFSStore::addPermRoot(const StorePath & storePath, if (settings.checkRootReachability) { auto roots = findRoots(false); if (roots[storePath.clone()].count(gcRoot) == 0) - logWarning( ErrorInfo { .name = "GC root", diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 194eefc78..6f88a3e32 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -504,7 +504,7 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe chown(path.c_str(), geteuid(), getegid()) == -1) #endif throw SysError("changing owner of '%1%' to %2%", - path, geteuid()); + path, geteuid()); } if (S_ISDIR(st.st_mode)) { diff --git a/src/libstore/sqlite.cc b/src/libstore/sqlite.cc index 34ef5e57b..16cdb6619 100644 --- a/src/libstore/sqlite.cc +++ b/src/libstore/sqlite.cc @@ -196,7 +196,7 @@ SQLiteTxn::~SQLiteTxn() } } -void handleSQLiteBusy(SQLiteBusy & e) +void handleSQLiteBusy(const SQLiteBusy & e) { static std::atomic lastWarned{0}; diff --git a/src/libstore/sqlite.hh b/src/libstore/sqlite.hh index ccfac48d8..dd81ab051 100644 --- a/src/libstore/sqlite.hh +++ b/src/libstore/sqlite.hh @@ -99,7 +99,7 @@ MakeError(SQLiteBusy, SQLiteError); [[noreturn]] void throwSQLiteError(sqlite3 * db, const FormatOrString & fs); -void handleSQLiteBusy(SQLiteBusy & e); +void handleSQLiteBusy(const SQLiteBusy & e); /* Convenience function for retrying a SQLite transaction when the database is busy. */ diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 4d783b564..66072e8f7 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -15,13 +15,13 @@ using std::set; using std::vector; using std::string; -typedef list Strings; -typedef set StringSet; -typedef std::map StringMap; +typedef list Strings; +typedef set StringSet; +typedef std::map StringMap; /* Paths are just strings. */ -typedef std::string Path; +typedef string Path; typedef list Paths; typedef set PathSet; diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc index 731ab22e5..582c78d14 100644 --- a/src/nix-daemon/nix-daemon.cc +++ b/src/nix-daemon/nix-daemon.cc @@ -248,8 +248,8 @@ static void daemonLoop(char * * argv) return; } catch (Error & error) { ErrorInfo ei = error.info(); - string prevhint = (error.info().hint.has_value() ? error.info().hint->str() : ""); - ei.hint = std::optional(hintfmt("error processing connection: %1%", prevhint)); + ei.hint = std::optional(hintfmt("error processing connection: %1%", + (error.info().hint.has_value() ? error.info().hint->str() : ""))); logError(ei); } } diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index 0f99f5fe1..bbce5dcda 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -69,7 +69,7 @@ typedef void (* Operation) (Globals & globals, static string needArg(Strings::iterator & i, Strings & args, const string & arg) { - if (i == args.end()) throw UsageError( "'%1%' requires an argument", arg); + if (i == args.end()) throw UsageError("'%1%' requires an argument", arg); return *i++; } @@ -151,7 +151,7 @@ static void loadSourceExpr(EvalState & state, const Path & path, Value & v) { struct stat st; if (stat(path.c_str(), &st) == -1) - throw SysError("getting inon about '%1%'", path); + throw SysError("getting information about '%1%'", path); if (isNixExpr(path, st)) state.evalFile(path, v); @@ -1233,7 +1233,7 @@ static void switchGeneration(Globals & globals, int dstGen) if (!dst) { if (dstGen == prevGen) throw Error("no generation older than the current (%1%) exists", - curGen); + curGen); else throw Error("generation %1% does not exist", dstGen); } diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 9b5cceccf..77deea5a7 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -731,7 +731,7 @@ static void opVerifyPath(Strings opFlags, Strings opArgs) if (current.first != info->narHash) { logError( ErrorInfo { - .name = "Hash match error", + .name = "Hash mismatch", .hint = hintfmt( "path '%s' was modified! expected hash '%s', got '%s'", store->printStorePath(path), From 4daccb279c547b90b0c17c8a64825f04abdf0f7e Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 14 May 2020 10:28:17 -0600 Subject: [PATCH 049/120] formatting --- src/libexpr/primops.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index d21c49813..9b9cbfc2e 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -767,7 +767,6 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * .nixCode = NixCode { .errPos = posDrvName } }); - /* Check whether the derivation name is valid. */ if (isDerivation(drvName)) throw EvalError( @@ -776,7 +775,6 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * .nixCode = NixCode { .errPos = posDrvName } }); - if (outputHash) { /* Handle fixed-output derivations. */ if (outputs.size() != 1 || *(outputs.begin()) != "out") From 19694aa213961daa5cbe2263bfaca53dc068a40c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 14 May 2020 12:28:18 -0600 Subject: [PATCH 050/120] fix compile errors --- src/libutil/error.cc | 16 ++++++++++++++++ src/libutil/error.hh | 16 ++-------------- src/libutil/types.hh | 2 +- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 0765a2945..59628d875 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -3,6 +3,7 @@ #include #include #include "serialise.hh" +#include namespace nix { @@ -16,6 +17,21 @@ BaseError & BaseError::addPrefix(const FormatOrString & fs) return *this; } +const string& BaseError::calcWhat() const +{ + if (what_.has_value()) + return *what_; + else { + err.name = sname(); + + std::ostringstream oss; + oss << err; + what_ = oss.str(); + + return *what_; + } +} + std::optional ErrorInfo::programName = std::nullopt; std::ostream& operator<<(std::ostream &os, const hintformat &hf) diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 19c6e35a1..b374c2780 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -88,20 +88,8 @@ protected: mutable ErrorInfo err; mutable std::optional what_; - const string& calcWhat() const - { - if (what_.has_value()) - return *what_; - else { - err.name = sname(); - - std::ostringstream oss; - oss << err; - what_ = oss.str(); - - return *what_; - } - } + const string& calcWhat() const; + public: unsigned int status = 1; // exit status diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 66072e8f7..89ae108f9 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -6,7 +6,7 @@ #include #include #include - +#include namespace nix { From d82d230b4015c50e698e3be1ec7a3e12277a3251 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 2 Jun 2020 08:22:24 -0600 Subject: [PATCH 051/120] elide the 'ErrorInfo' in logError and logWarning calls --- src/build-remote/build-remote.cc | 11 +- src/error-demo/error-demo.cc | 111 +++++++++--------- src/libstore/build.cc | 107 ++++++++--------- src/libstore/filetransfer.cc | 11 +- src/libstore/local-store.cc | 45 ++++--- src/libstore/optimise-store.cc | 21 ++-- src/libutil/logging.cc | 7 +- src/nix-env/nix-env.cc | 27 ++--- src/nix-store/nix-store.cc | 17 ++- src/nix/verify.cc | 26 ++-- .../resolve-system-dependencies.cc | 28 ++--- 11 files changed, 187 insertions(+), 224 deletions(-) diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc index 0caa97fa4..2f0b8c825 100644 --- a/src/build-remote/build-remote.cc +++ b/src/build-remote/build-remote.cc @@ -200,12 +200,11 @@ static int _main(int argc, char * * argv) } catch (std::exception & e) { auto msg = chomp(drainFD(5, false)); - logError( - ErrorInfo { - .name = "Remote build", - .hint = hintfmt("cannot build on '%s': %s%s", - bestMachine->storeUri, e.what(), - (msg.empty() ? "" : ": " + msg)) + logError({ + .name = "Remote build", + .hint = hintfmt("cannot build on '%s': %s%s", + bestMachine->storeUri, e.what(), + (msg.empty() ? "" : ": " + msg)) }); bestMachine->enabled = false; continue; diff --git a/src/error-demo/error-demo.cc b/src/error-demo/error-demo.cc index 0216092e3..f1e17b3de 100644 --- a/src/error-demo/error-demo.cc +++ b/src/error-demo/error-demo.cc @@ -62,101 +62,96 @@ int main() // For completeness sake, show 'info' through 'vomit' levels. // But this is maybe a heavy format for those. - logger->logEI( - ErrorInfo { .level = lvlInfo, + logger->logEI({ .level = lvlInfo, .name = "Info name", .description = "Info description", }); - logger->logEI( - ErrorInfo { .level = lvlTalkative, + logger->logEI({ .level = lvlTalkative, .name = "Talkative name", .description = "Talkative description", }); - logger->logEI( - ErrorInfo { .level = lvlChatty, + logger->logEI({ .level = lvlChatty, .name = "Chatty name", .description = "Chatty description", }); - logger->logEI( - ErrorInfo { .level = lvlDebug, + logger->logEI({ .level = lvlDebug, .name = "Debug name", .description = "Debug description", }); - logger->logEI( - ErrorInfo { .level = lvlVomit, + logger->logEI({ .level = lvlVomit, .name = "Vomit name", .description = "Vomit description", }); // Error in a program; no hint and no nix code. - logError( - ErrorInfo { .name = "name", - .description = "error description", - }); + logError({ + .name = "name", + .description = "error description", + }); // Warning with name, description, and hint. // The hintfmt function makes all the substituted text yellow. - logWarning( - ErrorInfo { .name = "name", - .description = "error description", - .hint = hintfmt("there was a %1%", "warning"), - }); + logWarning({ + .name = "name", + .description = "error description", + .hint = hintfmt("there was a %1%", "warning"), + }); // Warning with nix file, line number, column, and the lines of // code where a warning occurred. SymbolTable testTable; auto problem_file = testTable.create("myfile.nix"); - logWarning( - ErrorInfo { .name = "warning name", - .description = "warning description", - .hint = hintfmt("this hint has %1% templated %2%!!", - "yellow", - "values"), - .nixCode = NixCode { - .errPos = Pos(problem_file, 40, 13), - .prevLineOfCode = std::nullopt, - .errLineOfCode = "this is the problem line of code", - .nextLineOfCode = std::nullopt - }}); + logWarning({ + .name = "warning name", + .description = "warning description", + .hint = hintfmt("this hint has %1% templated %2%!!", + "yellow", + "values"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13), + .prevLineOfCode = std::nullopt, + .errLineOfCode = "this is the problem line of code", + .nextLineOfCode = std::nullopt + }}); // Error with previous and next lines of code. - logError( - ErrorInfo { .name = "error name", - .description = "error with code lines", - .hint = hintfmt("this hint has %1% templated %2%!!", - "yellow", - "values"), - .nixCode = NixCode { - .errPos = Pos(problem_file, 40, 13), - .prevLineOfCode = "previous line of code", - .errLineOfCode = "this is the problem line of code", - .nextLineOfCode = "next line of code", - }}); + logError({ + .name = "error name", + .description = "error with code lines", + .hint = hintfmt("this hint has %1% templated %2%!!", + "yellow", + "values"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13), + .prevLineOfCode = "previous line of code", + .errLineOfCode = "this is the problem line of code", + .nextLineOfCode = "next line of code", + }}); // Error without lines of code. - logError( - ErrorInfo { .name = "error name", - .description = "error without any code lines.", - .hint = hintfmt("this hint has %1% templated %2%!!", - "yellow", - "values"), - .nixCode = NixCode { - .errPos = Pos(problem_file, 40, 13) - }}); + logError({ + .name = "error name", + .description = "error without any code lines.", + .hint = hintfmt("this hint has %1% templated %2%!!", + "yellow", + "values"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13) + }}); // Error with only hint and name.. - logError( - ErrorInfo { .name = "error name", - .hint = hintfmt("hint %1%", "only"), - .nixCode = NixCode { - .errPos = Pos(problem_file, 40, 13) - }}); + logError({ + .name = "error name", + .hint = hintfmt("hint %1%", "only"), + .nixCode = NixCode { + .errPos = Pos(problem_file, 40, 13) + }}); return 0; } diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 4630432c9..04e8d2ebe 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1158,10 +1158,9 @@ void DerivationGoal::loadDerivation() trace("loading derivation"); if (nrFailed != 0) { - logError( - ErrorInfo { - .name = "missing derivation during build", - .hint = hintfmt("cannot build missing derivation '%s'", worker.store.printStorePath(drvPath)) + logError({ + .name = "missing derivation during build", + .hint = hintfmt("cannot build missing derivation '%s'", worker.store.printStorePath(drvPath)) }); done(BuildResult::MiscFailure); return; @@ -1313,12 +1312,11 @@ void DerivationGoal::repairClosure() /* Check each path (slow!). */ for (auto & i : outputClosure) { if (worker.pathContentsGood(i)) continue; - logError( - ErrorInfo { - .name = "Corrupt path in closure", - .hint = hintfmt( - "found corrupted or missing path '%s' in the output closure of '%s'", - worker.store.printStorePath(i), worker.store.printStorePath(drvPath)) + logError({ + .name = "Corrupt path in closure", + .hint = hintfmt( + "found corrupted or missing path '%s' in the output closure of '%s'", + worker.store.printStorePath(i), worker.store.printStorePath(drvPath)) }); auto drvPath2 = outputsToDrv.find(i); if (drvPath2 == outputsToDrv.end()) @@ -1353,12 +1351,11 @@ void DerivationGoal::inputsRealised() if (nrFailed != 0) { if (!useDerivation) throw Error("some dependencies of '%s' are missing", worker.store.printStorePath(drvPath)); - logError( - ErrorInfo { - .name = "Dependencies could not be built", - .hint = hintfmt( - "cannot build derivation '%s': %s dependencies couldn't be built", - worker.store.printStorePath(drvPath), nrFailed) + logError({ + .name = "Dependencies could not be built", + .hint = hintfmt( + "cannot build derivation '%s': %s dependencies couldn't be built", + worker.store.printStorePath(drvPath), nrFailed) }); done(BuildResult::DependencyFailed); return; @@ -1844,12 +1841,11 @@ HookReply DerivationGoal::tryBuildHook() } catch (SysError & e) { if (e.errNo == EPIPE) { - logError( - ErrorInfo { - .name = "Build hook died", - .hint = hintfmt( - "build hook died unexpectedly: %s", - chomp(drainFD(worker.hook->fromHook.readSide.get()))) + logError({ + .name = "Build hook died", + .hint = hintfmt( + "build hook died unexpectedly: %s", + chomp(drainFD(worker.hook->fromHook.readSide.get()))) }); worker.hook = 0; return rpDecline; @@ -3692,11 +3688,10 @@ void DerivationGoal::registerOutputs() /* Apply hash rewriting if necessary. */ bool rewritten = false; if (!outputRewrites.empty()) { - logWarning( - ErrorInfo { - .name = "Rewriting hashes", - .hint = hintfmt("rewriting hashes in '%1%'; cross fingers", path) - }); + logWarning({ + .name = "Rewriting hashes", + .hint = hintfmt("rewriting hashes in '%1%'; cross fingers", path) + }); /* Canonicalise first. This ensures that the path we're rewriting doesn't contain a hard link to /etc/shadow or @@ -3875,10 +3870,9 @@ void DerivationGoal::registerOutputs() if (settings.enforceDeterminism) throw NotDeterministic(hint); - logError( - ErrorInfo { - .name = "Output determinism error", - .hint = hint + logError({ + .name = "Output determinism error", + .hint = hint }); @@ -4145,12 +4139,11 @@ void DerivationGoal::handleChildOutput(int fd, const string & data) { logSize += data.size(); if (settings.maxLogSize && logSize > settings.maxLogSize) { - logError( - ErrorInfo { - .name = "Max log size exceeded", - .hint = hintfmt( - "%1% killed after writing more than %2% bytes of log output", - getName(), settings.maxLogSize) + logError({ + .name = "Max log size exceeded", + .hint = hintfmt( + "%1% killed after writing more than %2% bytes of log output", + getName(), settings.maxLogSize) }); killChild(); done(BuildResult::LogLimitExceeded); @@ -4467,12 +4460,11 @@ void SubstitutionGoal::tryNext() && !sub->isTrusted && !info->checkSignatures(worker.store, worker.store.getPublicKeys())) { - logWarning( - ErrorInfo { - .name = "Invalid path signature", - .hint = hintfmt("substituter '%s' does not have a valid signature for path '%s'", - sub->getUri(), worker.store.printStorePath(storePath)) - }); + logWarning({ + .name = "Invalid path signature", + .hint = hintfmt("substituter '%s' does not have a valid signature for path '%s'", + sub->getUri(), worker.store.printStorePath(storePath)) + }); tryNext(); return; } @@ -4954,12 +4946,11 @@ void Worker::waitForInput() j->respectTimeouts && after - j->lastOutput >= std::chrono::seconds(settings.maxSilentTime)) { - logError( - ErrorInfo { - .name = "Silent build timeout", - .hint = hintfmt( - "%1% timed out after %2% seconds of silence", - goal->getName(), settings.maxSilentTime) + logError({ + .name = "Silent build timeout", + .hint = hintfmt( + "%1% timed out after %2% seconds of silence", + goal->getName(), settings.maxSilentTime) }); goal->timedOut(); } @@ -4969,12 +4960,11 @@ void Worker::waitForInput() j->respectTimeouts && after - j->timeStarted >= std::chrono::seconds(settings.buildTimeout)) { - logError( - ErrorInfo { - .name = "Build timeout", - .hint = hintfmt( - "%1% timed out after %2% seconds", - goal->getName(), settings.buildTimeout) + logError({ + .name = "Build timeout", + .hint = hintfmt( + "%1% timed out after %2% seconds", + goal->getName(), settings.buildTimeout) }); goal->timedOut(); } @@ -5035,10 +5025,9 @@ bool Worker::pathContentsGood(const StorePath & path) } pathContentsGoodCache.insert_or_assign(path.clone(), res); if (!res) - logError( - ErrorInfo { - .name = "Corrupted path", - .hint = hintfmt("path '%s' is corrupted or missing!", store.printStorePath(path)) + logError({ + .name = "Corrupted path", + .hint = hintfmt("path '%s' is corrupted or missing!", store.printStorePath(path)) }); return res; } diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index 89588d662..6ca3393ab 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -599,12 +599,11 @@ struct curlFileTransfer : public FileTransfer workerThreadMain(); } catch (nix::Interrupted & e) { } catch (std::exception & e) { - logError( - ErrorInfo { - .name = "File transfer", - .hint = hintfmt("unexpected error in download thread: %s", - e.what()) - }); + logError({ + .name = "File transfer", + .hint = hintfmt("unexpected error in download thread: %s", + e.what()) + }); } { diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index abcfe5271..53fb4ce68 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -87,12 +87,11 @@ LocalStore::LocalStore(const Params & params) struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str()); if (!gr) - logError( - ErrorInfo { - .name = "'build-users-group' not found", - .hint = hintfmt( - "warning: the group '%1%' specified in 'build-users-group' does not exist", - settings.buildUsersGroup) + logError({ + .name = "'build-users-group' not found", + .hint = hintfmt( + "warning: the group '%1%' specified in 'build-users-group' does not exist", + settings.buildUsersGroup) }); else { struct stat st; @@ -1242,12 +1241,11 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) Path linkPath = linksDir + "/" + link.name; string hash = hashPath(htSHA256, linkPath).first.to_string(Base32, false); if (hash != link.name) { - logError( - ErrorInfo { - .name = "Invalid hash", - .hint = hintfmt( - "link '%s' was modified! expected hash '%s', got '%s'", - linkPath, link.name, hash) + logError({ + .name = "Invalid hash", + .hint = hintfmt( + "link '%s' was modified! expected hash '%s', got '%s'", + linkPath, link.name, hash) }); if (repair) { if (unlink(linkPath.c_str()) == 0) @@ -1281,11 +1279,10 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) auto current = hashSink->finish(); if (info->narHash != nullHash && info->narHash != current.first) { - logError( - ErrorInfo { - .name = "Invalid hash - path modified", - .hint = hintfmt("path '%s' was modified! expected hash '%s', got '%s'", - printStorePath(i), info->narHash.to_string(), current.first.to_string()) + logError({ + .name = "Invalid hash - path modified", + .hint = hintfmt("path '%s' was modified! expected hash '%s', got '%s'", + printStorePath(i), info->narHash.to_string(), current.first.to_string()) }); if (repair) repairPath(i); else errors = true; } else { @@ -1337,10 +1334,9 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store, if (!done.insert(pathS).second) return; if (!isStorePath(pathS)) { - logError( - ErrorInfo { - .name = "Nix path not found", - .hint = hintfmt("path '%s' is not in the Nix store", pathS) + logError({ + .name = "Nix path not found", + .hint = hintfmt("path '%s' is not in the Nix store", pathS) }); return; } @@ -1364,10 +1360,9 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store, auto state(_state.lock()); invalidatePath(*state, path); } else { - logError( - ErrorInfo { - .name = "Missing path with referrers", - .hint = hintfmt("path '%s' disappeared, but it still has valid referrers!", pathS) + logError({ + .name = "Missing path with referrers", + .hint = hintfmt("path '%s' disappeared, but it still has valid referrers!", pathS) }); if (repair) try { diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc index c9ecca5a8..cc0507be2 100644 --- a/src/libstore/optimise-store.cc +++ b/src/libstore/optimise-store.cc @@ -130,10 +130,9 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, NixOS (example: $fontconfig/var/cache being modified). Skip those files. FIXME: check the modification time. */ if (S_ISREG(st.st_mode) && (st.st_mode & S_IWUSR)) { - logWarning( - ErrorInfo { - .name = "Suspicious file", - .hint = hintfmt("skipping suspicious writable file '%1%'", path) + logWarning({ + .name = "Suspicious file", + .hint = hintfmt("skipping suspicious writable file '%1%'", path) }); return; } @@ -198,10 +197,9 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, } if (st.st_size != stLink.st_size) { - logWarning( - ErrorInfo { - .name = "Corrupted link", - .hint = hintfmt("removing corrupted link '%1%'", linkPath) + logWarning({ + .name = "Corrupted link", + .hint = hintfmt("removing corrupted link '%1%'", linkPath) }); unlink(linkPath.c_str()); goto retry; @@ -237,10 +235,9 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, /* Atomically replace the old file with the new hard link. */ if (rename(tempLink.c_str(), path.c_str()) == -1) { if (unlink(tempLink.c_str()) == -1) - logError( - ErrorInfo { - .name = "Unlink error", - .hint = hintfmt("unable to unlink '%1%'", tempLink) + logError({ + .name = "Unlink error", + .hint = hintfmt("unable to unlink '%1%'", tempLink) }); if (errno == EMLINK) { /* Some filesystems generate too many links on the rename, diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 071a7ec7e..41378b0db 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -251,10 +251,9 @@ bool handleJSONLogMessage(const std::string & msg, } } catch (std::exception & e) { - logError( - ErrorInfo { - .name = "Json log message", - .hint = hintfmt("bad log message from builder: %s", e.what()) + logError({ + .name = "Json log message", + .hint = hintfmt("bad log message from builder: %s", e.what()) }); } diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index bbce5dcda..8231a07a4 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -123,10 +123,9 @@ static void getAllExprs(EvalState & state, if (hasSuffix(attrName, ".nix")) attrName = string(attrName, 0, attrName.size() - 4); if (!attrs.insert(attrName).second) { - logError( - ErrorInfo { - .name = "Name collision", - .hint = hintfmt("warning: name collision in input Nix expressions, skipping '%1%'", path2) + logError({ + .name = "Name collision", + .hint = hintfmt("warning: name collision in input Nix expressions, skipping '%1%'", path2) }); continue; } @@ -875,11 +874,10 @@ static void queryJSON(Globals & globals, vector & elems) auto placeholder = metaObj.placeholder(j); Value * v = i.queryMeta(j); if (!v) { - logError( - ErrorInfo { - .name = "Invalid meta attribute", - .hint = hintfmt("derivation '%s' has invalid meta attribute '%s'", - i.queryName(), j) + logError({ + .name = "Invalid meta attribute", + .hint = hintfmt("derivation '%s' has invalid meta attribute '%s'", + i.queryName(), j) }); placeholder.write(nullptr); } else { @@ -1131,12 +1129,11 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs) attrs2["name"] = j; Value * v = i.queryMeta(j); if (!v) - logError( - ErrorInfo { - .name = "Invalid meta attribute", - .hint = hintfmt( - "derivation '%s' has invalid meta attribute '%s'", - i.queryName(), j) + logError({ + .name = "Invalid meta attribute", + .hint = hintfmt( + "derivation '%s' has invalid meta attribute '%s'", + i.queryName(), j) }); else { if (v->type == tString) { diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 6b83093b1..5e42736fc 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -704,7 +704,7 @@ static void opVerify(Strings opFlags, Strings opArgs) else throw UsageError("unknown flag '%1%'", i); if (store->verifyStore(checkContents, repair)) { - logWarning(ErrorInfo { + logWarning({ .name = "Store consistency", .description = "not all errors were fixed" }); @@ -729,14 +729,13 @@ static void opVerifyPath(Strings opFlags, Strings opArgs) store->narFromPath(path, sink); auto current = sink.finish(); if (current.first != info->narHash) { - logError( - ErrorInfo { - .name = "Hash mismatch", - .hint = hintfmt( - "path '%s' was modified! expected hash '%s', got '%s'", - store->printStorePath(path), - info->narHash.to_string(), - current.first.to_string()) + logError({ + .name = "Hash mismatch", + .hint = hintfmt( + "path '%s' was modified! expected hash '%s', got '%s'", + store->printStorePath(path), + info->narHash.to_string(), + current.first.to_string()) }); status = 1; } diff --git a/src/nix/verify.cc b/src/nix/verify.cc index 8c845bfc2..8ecd9a8f3 100644 --- a/src/nix/verify.cc +++ b/src/nix/verify.cc @@ -99,15 +99,14 @@ struct CmdVerify : StorePathsCommand if (hash.first != info->narHash) { corrupted++; act2.result(resCorruptedPath, store->printStorePath(info->path)); - logError( - ErrorInfo { - .name = "Hash error - path modified", - .hint = hintfmt( - "path '%s' was modified! expected hash '%s', got '%s'", - store->printStorePath(info->path), - info->narHash.to_string(), - hash.first.to_string()) - }); + logError({ + .name = "Hash error - path modified", + .hint = hintfmt( + "path '%s' was modified! expected hash '%s', got '%s'", + store->printStorePath(info->path), + info->narHash.to_string(), + hash.first.to_string()) + }); } } @@ -156,11 +155,10 @@ struct CmdVerify : StorePathsCommand if (!good) { untrusted++; act2.result(resUntrustedPath, store->printStorePath(info->path)); - logError( - ErrorInfo { - .name = "Untrusted path", - .hint = hintfmt("path '%s' is untrusted", - store->printStorePath(info->path)) + logError({ + .name = "Untrusted path", + .hint = hintfmt("path '%s' is untrusted", + store->printStorePath(info->path)) }); } diff --git a/src/resolve-system-dependencies/resolve-system-dependencies.cc b/src/resolve-system-dependencies/resolve-system-dependencies.cc index dcea72529..82feacb3d 100644 --- a/src/resolve-system-dependencies/resolve-system-dependencies.cc +++ b/src/resolve-system-dependencies/resolve-system-dependencies.cc @@ -39,19 +39,17 @@ std::set runResolver(const Path & filename) throw SysError("statting '%s'", filename); if (!S_ISREG(st.st_mode)) { - logError( - ErrorInfo { - .name = "Regular MACH file", - .hint = hintfmt("file '%s' is not a regular file", filename) + logError({ + .name = "Regular MACH file", + .hint = hintfmt("file '%s' is not a regular file", filename) }); return {}; } if (st.st_size < sizeof(mach_header_64)) { - logError( - ErrorInfo { - .name = "File too short", - .hint = hintfmt("file '%s' is too short for a MACH binary", filename) + logError({ + .name = "File too short", + .hint = hintfmt("file '%s' is too short for a MACH binary", filename) }); return {}; } @@ -74,20 +72,18 @@ std::set runResolver(const Path & filename) } } if (mach64_offset == 0) { - logError( - ErrorInfo { - .name = "No mach64 blobs", - .hint = hintfmt("Could not find any mach64 blobs in file '%1%', continuing...", filename) + logError({ + .name = "No mach64 blobs", + .hint = hintfmt("Could not find any mach64 blobs in file '%1%', continuing...", filename) }); return {}; } } else if (magic == MH_MAGIC_64 || magic == MH_CIGAM_64) { mach64_offset = 0; } else { - logError( - ErrorInfo { - .name = "Magic number", - .hint = hintfmt("Object file has unknown magic number '%1%', skipping it...", magic) + logError({ + .name = "Magic number", + .hint = hintfmt("Object file has unknown magic number '%1%', skipping it...", magic) }); return {}; } From 156d4f8bc892baa4e25814d5f79a332994c750d1 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 2 Jun 2020 08:45:37 -0600 Subject: [PATCH 052/120] remove extra space in SysErrors --- src/libutil/error.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libutil/error.hh b/src/libutil/error.hh index b374c2780..0ca0c8b15 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -155,7 +155,7 @@ public: { errNo = errno; auto hf = hintfmt(args...); - err.hint = hintfmt("%1% : %2%", normaltxt(hf.str()), strerror(errNo)); + err.hint = hintfmt("%1%: %2%", normaltxt(hf.str()), strerror(errNo)); } virtual const char* sname() const override { return "SysError"; } From 6ee03b8444e1838b9985a9fd4f0f46947e958b3b Mon Sep 17 00:00:00 2001 From: zimbatm Date: Wed, 3 Jun 2020 12:38:23 +0200 Subject: [PATCH 053/120] libutils/hash: remove default encoding This will make it easier to reason about the hash encoding and switch to SRI everywhere where possible. --- perl/lib/Nix/Store.xs | 4 ++-- src/libexpr/primops/fetchTree.cc | 4 ++-- src/libfetchers/fetchers.cc | 4 ++-- src/libfetchers/tarball.cc | 6 +++--- src/libstore/build.cc | 2 +- src/libstore/export-import.cc | 2 +- src/libstore/local-store.cc | 10 +++++----- src/libstore/nar-info-disk-cache.cc | 4 ++-- src/libstore/nar-info.cc | 4 ++-- src/libstore/optimise-store.cc | 2 +- src/libstore/store-api.cc | 12 ++++++------ src/libutil/hash.hh | 2 +- src/libutil/tests/hash.cc | 16 ++++++++-------- src/nix-store/nix-store.cc | 6 +++--- src/nix/verify.cc | 2 +- 15 files changed, 40 insertions(+), 40 deletions(-) diff --git a/perl/lib/Nix/Store.xs b/perl/lib/Nix/Store.xs index 890310b3e..945ed49c7 100644 --- a/perl/lib/Nix/Store.xs +++ b/perl/lib/Nix/Store.xs @@ -80,7 +80,7 @@ SV * queryReferences(char * path) SV * queryPathHash(char * path) PPCODE: try { - auto s = store()->queryPathInfo(store()->parseStorePath(path))->narHash.to_string(); + auto s = store()->queryPathInfo(store()->parseStorePath(path))->narHash.to_string(Base32, true); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); } catch (Error & e) { croak("%s", e.what()); @@ -106,7 +106,7 @@ SV * queryPathInfo(char * path, int base32) XPUSHs(&PL_sv_undef); else XPUSHs(sv_2mortal(newSVpv(store()->printStorePath(*info->deriver).c_str(), 0))); - auto s = info->narHash.to_string(base32 ? Base32 : Base16); + auto s = info->narHash.to_string(base32 ? Base32 : Base16, true); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); mXPUSHi(info->registrationTime); mXPUSHi(info->narSize); diff --git a/src/libexpr/primops/fetchTree.cc b/src/libexpr/primops/fetchTree.cc index c5a0d9886..b90408798 100644 --- a/src/libexpr/primops/fetchTree.cc +++ b/src/libexpr/primops/fetchTree.cc @@ -23,7 +23,7 @@ void emitTreeAttrs( assert(tree.info.narHash); mkString(*state.allocAttr(v, state.symbols.create("narHash")), - tree.info.narHash.to_string(SRI)); + tree.info.narHash.to_string(SRI, true)); if (input->getRev()) { mkString(*state.allocAttr(v, state.symbols.create("rev")), input->getRev()->gitRev()); @@ -140,7 +140,7 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v, : hashFile(htSHA256, path); if (hash != *expectedHash) throw Error((unsigned int) 102, "hash mismatch in file downloaded from '%s':\n wanted: %s\n got: %s", - *url, expectedHash->to_string(), hash.to_string()); + *url, expectedHash->to_string(Base32, true), hash.to_string(Base32, true)); } if (state.allowedPaths) diff --git a/src/libfetchers/fetchers.cc b/src/libfetchers/fetchers.cc index 94ac30e38..ca555114d 100644 --- a/src/libfetchers/fetchers.cc +++ b/src/libfetchers/fetchers.cc @@ -47,7 +47,7 @@ Attrs Input::toAttrs() const { auto attrs = toAttrsInternal(); if (narHash) - attrs.emplace("narHash", narHash->to_string(SRI)); + attrs.emplace("narHash", narHash->to_string(SRI, true)); attrs.emplace("type", type()); return attrs; } @@ -67,7 +67,7 @@ std::pair> Input::fetchTree(ref store) if (narHash && narHash != input->narHash) throw Error("NAR hash mismatch in input '%s' (%s), expected '%s', got '%s'", - to_string(), tree.actualPath, narHash->to_string(SRI), input->narHash->to_string(SRI)); + to_string(), tree.actualPath, narHash->to_string(SRI, true), input->narHash->to_string(SRI, true)); return {std::move(tree), input}; } diff --git a/src/libfetchers/tarball.cc b/src/libfetchers/tarball.cc index b6e57379b..1b0eba18a 100644 --- a/src/libfetchers/tarball.cc +++ b/src/libfetchers/tarball.cc @@ -196,9 +196,9 @@ struct TarballInput : Input // NAR hashes are preferred over file hashes since tar/zip files // don't have a canonical representation. if (narHash) - url2.query.insert_or_assign("narHash", narHash->to_string(SRI)); + url2.query.insert_or_assign("narHash", narHash->to_string(SRI, true)); else if (hash) - url2.query.insert_or_assign("hash", hash->to_string(SRI)); + url2.query.insert_or_assign("hash", hash->to_string(SRI, true)); return url2; } @@ -207,7 +207,7 @@ struct TarballInput : Input Attrs attrs; attrs.emplace("url", url.to_string()); if (hash) - attrs.emplace("hash", hash->to_string(SRI)); + attrs.emplace("hash", hash->to_string(SRI, true)); return attrs; } diff --git a/src/libstore/build.cc b/src/libstore/build.cc index f5c132a83..9582a9007 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -3718,7 +3718,7 @@ void DerivationGoal::registerOutputs() worker.hashMismatch = true; delayedException = std::make_exception_ptr( BuildError("hash mismatch in fixed-output derivation '%s':\n wanted: %s\n got: %s", - worker.store.printStorePath(dest), h.to_string(SRI), h2.to_string(SRI))); + worker.store.printStorePath(dest), h.to_string(SRI, true), h2.to_string(SRI, true))); Path actualDest = worker.store.Store::toRealPath(dest); diff --git a/src/libstore/export-import.cc b/src/libstore/export-import.cc index f0d01a240..54471d4a3 100644 --- a/src/libstore/export-import.cc +++ b/src/libstore/export-import.cc @@ -57,7 +57,7 @@ void Store::exportPath(const StorePath & path, Sink & sink) Hash hash = hashAndWriteSink.currentHash(); if (hash != info->narHash && info->narHash != Hash(info->narHash.type)) throw Error("hash of path '%s' has changed from '%s' to '%s'!", - printStorePath(path), info->narHash.to_string(), hash.to_string()); + printStorePath(path), info->narHash.to_string(Base32, true), hash.to_string(Base32, true)); hashAndWriteSink << exportMagic diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 80851b591..1c3795eb1 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -580,7 +580,7 @@ uint64_t LocalStore::addValidPath(State & state, state.stmtRegisterValidPath.use() (printStorePath(info.path)) - (info.narHash.to_string(Base16)) + (info.narHash.to_string(Base16, true)) (info.registrationTime == 0 ? time(0) : info.registrationTime) (info.deriver ? printStorePath(*info.deriver) : "", (bool) info.deriver) (info.narSize, info.narSize != 0) @@ -680,7 +680,7 @@ void LocalStore::updatePathInfo(State & state, const ValidPathInfo & info) { state.stmtUpdatePathInfo.use() (info.narSize, info.narSize != 0) - (info.narHash.to_string(Base16)) + (info.narHash.to_string(Base16, true)) (info.ultimate ? 1 : 0, info.ultimate) (concatStringsSep(" ", info.sigs), !info.sigs.empty()) (info.ca, !info.ca.empty()) @@ -1022,7 +1022,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source, if (hashResult.first != info.narHash) throw Error("hash mismatch importing path '%s';\n wanted: %s\n got: %s", - printStorePath(info.path), info.narHash.to_string(), hashResult.first.to_string()); + printStorePath(info.path), info.narHash.to_string(Base32, true), hashResult.first.to_string(Base32, true)); if (hashResult.second != info.narSize) throw Error("size mismatch importing path '%s';\n wanted: %s\n got: %s", @@ -1155,7 +1155,7 @@ StorePath LocalStore::addTextToStore(const string & name, const string & s, info.narHash = narHash; info.narSize = sink.s->size(); info.references = cloneStorePathSet(references); - info.ca = "text:" + hash.to_string(); + info.ca = "text:" + hash.to_string(Base32, true); registerValidPath(info); } @@ -1273,7 +1273,7 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair) if (info->narHash != nullHash && info->narHash != current.first) { printError("path '%s' was modified! expected hash '%s', got '%s'", - printStorePath(i), info->narHash.to_string(), current.first.to_string()); + printStorePath(i), info->narHash.to_string(Base32, true), current.first.to_string(Base32, true)); if (repair) repairPath(i); else errors = true; } else { diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc index 442541330..e8cf1d177 100644 --- a/src/libstore/nar-info-disk-cache.cc +++ b/src/libstore/nar-info-disk-cache.cc @@ -230,9 +230,9 @@ public: (std::string(info->path.name())) (narInfo ? narInfo->url : "", narInfo != 0) (narInfo ? narInfo->compression : "", narInfo != 0) - (narInfo && narInfo->fileHash ? narInfo->fileHash.to_string() : "", narInfo && narInfo->fileHash) + (narInfo && narInfo->fileHash ? narInfo->fileHash.to_string(Base32, true) : "", narInfo && narInfo->fileHash) (narInfo ? narInfo->fileSize : 0, narInfo != 0 && narInfo->fileSize) - (info->narHash.to_string()) + (info->narHash.to_string(Base32, true)) (info->narSize) (concatStringsSep(" ", info->shortRefs())) (info->deriver ? std::string(info->deriver->to_string()) : "", (bool) info->deriver) diff --git a/src/libstore/nar-info.cc b/src/libstore/nar-info.cc index 1375094b5..6b16be08a 100644 --- a/src/libstore/nar-info.cc +++ b/src/libstore/nar-info.cc @@ -87,10 +87,10 @@ std::string NarInfo::to_string(const Store & store) const assert(compression != ""); res += "Compression: " + compression + "\n"; assert(fileHash.type == htSHA256); - res += "FileHash: " + fileHash.to_string(Base32) + "\n"; + res += "FileHash: " + fileHash.to_string(Base32, true) + "\n"; res += "FileSize: " + std::to_string(fileSize) + "\n"; assert(narHash.type == htSHA256); - res += "NarHash: " + narHash.to_string(Base32) + "\n"; + res += "NarHash: " + narHash.to_string(Base32, true) + "\n"; res += "NarSize: " + std::to_string(narSize) + "\n"; res += "References: " + concatStringsSep(" ", shortRefs()) + "\n"; diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc index 8ac382e9d..3f4b72b9c 100644 --- a/src/libstore/optimise-store.cc +++ b/src/libstore/optimise-store.cc @@ -150,7 +150,7 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats, contents of the symlink (i.e. the result of readlink()), not the contents of the target (which may not even exist). */ Hash hash = hashPath(htSHA256, path).first; - debug(format("'%1%' has hash '%2%'") % path % hash.to_string()); + debug(format("'%1%' has hash '%2%'") % path % hash.to_string(Base32, true)); /* Check if this is a known hash. */ Path linkPath = linksDir + "/" + hash.to_string(Base32, false); diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 095363d0c..0645fca84 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -142,7 +142,7 @@ StorePath Store::makeStorePath(const string & type, const Hash & hash, std::string_view name) const { /* e.g., "source:sha256:1abc...:/nix/store:foo.tar.gz" */ - string s = type + ":" + hash.to_string(Base16) + ":" + storeDir + ":" + std::string(name); + string s = type + ":" + hash.to_string(Base16, true) + ":" + storeDir + ":" + std::string(name); auto h = compressHash(hashString(htSHA256, s), 20); return StorePath::make(h.hash, name); } @@ -186,7 +186,7 @@ StorePath Store::makeFixedOutputPath( hashString(htSHA256, "fixed:out:" + (recursive == FileIngestionMethod::Recursive ? (string) "r:" : "") - + hash.to_string(Base16) + ":"), + + hash.to_string(Base16, true) + ":"), name); } } @@ -461,7 +461,7 @@ void Store::pathInfoToJSON(JSONPlaceholder & jsonOut, const StorePathSet & store auto info = queryPathInfo(storePath); jsonPath - .attr("narHash", info->narHash.to_string(hashBase)) + .attr("narHash", info->narHash.to_string(hashBase, true)) .attr("narSize", info->narSize); { @@ -504,7 +504,7 @@ void Store::pathInfoToJSON(JSONPlaceholder & jsonOut, const StorePathSet & store if (!narInfo->url.empty()) jsonPath.attr("url", narInfo->url); if (narInfo->fileHash) - jsonPath.attr("downloadHash", narInfo->fileHash.to_string()); + jsonPath.attr("downloadHash", narInfo->fileHash.to_string(Base32, true)); if (narInfo->fileSize) jsonPath.attr("downloadSize", narInfo->fileSize); if (showClosureSize) @@ -760,7 +760,7 @@ std::string ValidPathInfo::fingerprint(const Store & store) const store.printStorePath(path)); return "1;" + store.printStorePath(path) + ";" - + narHash.to_string(Base32) + ";" + + narHash.to_string(Base32, true) + ";" + std::to_string(narSize) + ";" + concatStringsSep(",", store.printStorePathSet(references)); } @@ -836,7 +836,7 @@ std::string makeFixedOutputCA(FileIngestionMethod recursive, const Hash & hash) { return "fixed:" + (recursive == FileIngestionMethod::Recursive ? (std::string) "r:" : "") - + hash.to_string(); + + hash.to_string(Base32, true); } diff --git a/src/libutil/hash.hh b/src/libutil/hash.hh index ea9fca3e7..4ff13f6b2 100644 --- a/src/libutil/hash.hh +++ b/src/libutil/hash.hh @@ -79,7 +79,7 @@ struct Hash /* Return a string representation of the hash, in base-16, base-32 or base-64. By default, this is prefixed by the hash type (e.g. "sha256:"). */ - std::string to_string(Base base = Base32, bool includeType = true) const; + std::string to_string(Base base, bool includeType) const; std::string gitRev() const { diff --git a/src/libutil/tests/hash.cc b/src/libutil/tests/hash.cc index 7cb439817..5334b046e 100644 --- a/src/libutil/tests/hash.cc +++ b/src/libutil/tests/hash.cc @@ -11,28 +11,28 @@ namespace nix { // values taken from: https://tools.ietf.org/html/rfc1321 auto s1 = ""; auto hash = hashString(HashType::htMD5, s1); - ASSERT_EQ(hash.to_string(Base::Base16), "md5:d41d8cd98f00b204e9800998ecf8427e"); + ASSERT_EQ(hash.to_string(Base::Base16, true), "md5:d41d8cd98f00b204e9800998ecf8427e"); } TEST(hashString, testKnownMD5Hashes2) { // values taken from: https://tools.ietf.org/html/rfc1321 auto s2 = "abc"; auto hash = hashString(HashType::htMD5, s2); - ASSERT_EQ(hash.to_string(Base::Base16), "md5:900150983cd24fb0d6963f7d28e17f72"); + ASSERT_EQ(hash.to_string(Base::Base16, true), "md5:900150983cd24fb0d6963f7d28e17f72"); } TEST(hashString, testKnownSHA1Hashes1) { // values taken from: https://tools.ietf.org/html/rfc3174 auto s = "abc"; auto hash = hashString(HashType::htSHA1, s); - ASSERT_EQ(hash.to_string(Base::Base16),"sha1:a9993e364706816aba3e25717850c26c9cd0d89d"); + ASSERT_EQ(hash.to_string(Base::Base16, true),"sha1:a9993e364706816aba3e25717850c26c9cd0d89d"); } TEST(hashString, testKnownSHA1Hashes2) { // values taken from: https://tools.ietf.org/html/rfc3174 auto s = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; auto hash = hashString(HashType::htSHA1, s); - ASSERT_EQ(hash.to_string(Base::Base16),"sha1:84983e441c3bd26ebaae4aa1f95129e5e54670f1"); + ASSERT_EQ(hash.to_string(Base::Base16, true),"sha1:84983e441c3bd26ebaae4aa1f95129e5e54670f1"); } TEST(hashString, testKnownSHA256Hashes1) { @@ -40,7 +40,7 @@ namespace nix { auto s = "abc"; auto hash = hashString(HashType::htSHA256, s); - ASSERT_EQ(hash.to_string(Base::Base16), + ASSERT_EQ(hash.to_string(Base::Base16, true), "sha256:ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"); } @@ -48,7 +48,7 @@ namespace nix { // values taken from: https://tools.ietf.org/html/rfc4634 auto s = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; auto hash = hashString(HashType::htSHA256, s); - ASSERT_EQ(hash.to_string(Base::Base16), + ASSERT_EQ(hash.to_string(Base::Base16, true), "sha256:248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"); } @@ -56,7 +56,7 @@ namespace nix { // values taken from: https://tools.ietf.org/html/rfc4634 auto s = "abc"; auto hash = hashString(HashType::htSHA512, s); - ASSERT_EQ(hash.to_string(Base::Base16), + ASSERT_EQ(hash.to_string(Base::Base16, true), "sha512:ddaf35a193617abacc417349ae20413112e6fa4e89a9" "7ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd" "454d4423643ce80e2a9ac94fa54ca49f"); @@ -67,7 +67,7 @@ namespace nix { auto s = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"; auto hash = hashString(HashType::htSHA512, s); - ASSERT_EQ(hash.to_string(Base::Base16), + ASSERT_EQ(hash.to_string(Base::Base16, true), "sha512:8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa1" "7299aeadb6889018501d289e4900f7e4331b99dec4b5433a" "c7d329eeb6dd26545e96e55b874be909"); diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 3a3060ad8..9491a0c26 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -373,7 +373,7 @@ static void opQuery(Strings opFlags, Strings opArgs) auto info = store->queryPathInfo(j); if (query == qHash) { assert(info->narHash.type == htSHA256); - cout << fmt("%s\n", info->narHash.to_string(Base32)); + cout << fmt("%s\n", info->narHash.to_string(Base32, true)); } else if (query == qSize) cout << fmt("%d\n", info->narSize); } @@ -728,7 +728,7 @@ static void opVerifyPath(Strings opFlags, Strings opArgs) if (current.first != info->narHash) { printError( "path '%s' was modified! expected hash '%s', got '%s'", - store->printStorePath(path), info->narHash.to_string(), current.first.to_string()); + store->printStorePath(path), info->narHash.to_string(Base32, true), current.first.to_string(Base32, true)); status = 1; } } @@ -856,7 +856,7 @@ static void opServe(Strings opFlags, Strings opArgs) out << info->narSize // downloadSize << info->narSize; if (GET_PROTOCOL_MINOR(clientVersion) >= 4) - out << (info->narHash ? info->narHash.to_string() : "") << info->ca << info->sigs; + out << (info->narHash ? info->narHash.to_string(Base32, true) : "") << info->ca << info->sigs; } catch (InvalidPath &) { } } diff --git a/src/nix/verify.cc b/src/nix/verify.cc index cf1fa6a99..287dad101 100644 --- a/src/nix/verify.cc +++ b/src/nix/verify.cc @@ -101,7 +101,7 @@ struct CmdVerify : StorePathsCommand act2.result(resCorruptedPath, store->printStorePath(info->path)); printError( "path '%s' was modified! expected hash '%s', got '%s'", - store->printStorePath(info->path), info->narHash.to_string(), hash.first.to_string()); + store->printStorePath(info->path), info->narHash.to_string(Base32, true), hash.first.to_string(Base32, true)); } } From 132d6f2c2419891b92870c61c599a5e6aa97c865 Mon Sep 17 00:00:00 2001 From: Carlo Nucera Date: Wed, 3 Jun 2020 16:08:32 -0400 Subject: [PATCH 054/120] Clarify the description of StorePath construction --- src/libstore/store-api.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 095363d0c..e5492ce34 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -69,7 +69,7 @@ string storePathToHash(const Path & path) /* Store paths have the following form: - /- + = /- where @@ -93,11 +93,14 @@ string storePathToHash(const Path & path) = one of: "text:::..." for plain text files written to the store using - addTextToStore(); ... are the references of the - path. - "source" + addTextToStore(); ... are the store paths referenced + by this path, in the form described by + "source:::...::self" for paths copied to the store using addToStore() when recursive - = true and hashAlgo = "sha256" + = true and hashAlgo = "sha256". Just like in the text case, we + can have the store paths referenced by the path. + Additionally, we can have an optional :self label to denote self + reference. "output:" for either the outputs created by derivations, OR paths copied to the store using addToStore() with recursive != true or @@ -125,6 +128,12 @@ string storePathToHash(const Path & path) the contents of the path (or expected contents of the path for fixed-output derivations) + Note that since an output derivation has always type output, while + something added by addToStore can have type output or source depending + on the hash, this means that the same input can be hashed differently + if added to the store via addToStore or via a derivation, in the sha256 + recursive case. + It would have been nicer to handle fixed-output derivations under "source", e.g. have something like "source:", but we're stuck with this for now... From f97576c5d91d5278155a67e2b8982d2233d4335a Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 3 Jun 2020 14:47:00 -0600 Subject: [PATCH 055/120] newline-as-prefix; no final newline in output. --- src/libutil/error.cc | 73 +++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 59628d875..539a7543f 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -57,20 +57,20 @@ void printCodeLines(std::ostream &out, const string &prefix, const NixCode &nixC { // previous line of code. if (nixCode.prevLineOfCode.has_value()) { - out << fmt("%1% %|2$5d|| %3%", - prefix, - (nixCode.errPos.line - 1), - *nixCode.prevLineOfCode) - << std::endl; + out << std::endl + << fmt("%1% %|2$5d|| %3%", + prefix, + (nixCode.errPos.line - 1), + *nixCode.prevLineOfCode); } if (nixCode.errLineOfCode.has_value()) { // line of code containing the error. - out << fmt("%1% %|2$5d|| %3%", - prefix, - (nixCode.errPos.line), - *nixCode.errLineOfCode) - << std::endl; + out << std::endl + << fmt("%1% %|2$5d|| %3%", + prefix, + (nixCode.errPos.line), + *nixCode.errLineOfCode); // error arrows for the column range. if (nixCode.errPos.column > 0) { int start = nixCode.errPos.column; @@ -81,20 +81,21 @@ void printCodeLines(std::ostream &out, const string &prefix, const NixCode &nixC std::string arrows("^"); - out << fmt("%1% |%2%" ANSI_RED "%3%" ANSI_NORMAL, - prefix, - spaces, - arrows) << std::endl; + out << std::endl + << fmt("%1% |%2%" ANSI_RED "%3%" ANSI_NORMAL, + prefix, + spaces, + arrows); } } // next line of code. if (nixCode.nextLineOfCode.has_value()) { - out << fmt("%1% %|2$5d|| %3%", - prefix, - (nixCode.errPos.line + 1), - *nixCode.nextLineOfCode) - << std::endl; + out << std::endl + << fmt("%1% %|2$5d|| %3%", + prefix, + (nixCode.errPos.line + 1), + *nixCode.nextLineOfCode); } } @@ -167,46 +168,50 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo) levelString, einfo.name, dashes, - einfo.programName.value_or("")) - << std::endl; + einfo.programName.value_or("")); else out << fmt("%1%%2%" ANSI_BLUE " -----%3% %4%" ANSI_NORMAL, prefix, levelString, dashes, - einfo.programName.value_or("")) - << std::endl; + einfo.programName.value_or("")); - // filename, line, column. + bool nl = false; // intersperse newline between sections. if (einfo.nixCode.has_value()) { if (einfo.nixCode->errPos.file != "") { - out << fmt("%1%in file: " ANSI_BLUE "%2% %3%" ANSI_NORMAL, + // filename, line, column. + out << std::endl << fmt("%1%in file: " ANSI_BLUE "%2% %3%" ANSI_NORMAL, prefix, einfo.nixCode->errPos.file, - showErrPos(einfo.nixCode->errPos)) << std::endl; - out << prefix << std::endl; + showErrPos(einfo.nixCode->errPos)); } else { - out << fmt("%1%from command line argument", prefix) << std::endl; - out << prefix << std::endl; + out << std::endl << fmt("%1%from command line argument", prefix); } + nl = true; } // description if (einfo.description != "") { - out << prefix << einfo.description << std::endl; - out << prefix << std::endl; + if (nl) + out << std::endl << prefix; + out << std::endl << prefix << einfo.description; + nl = true; } // lines of code. if (einfo.nixCode.has_value() && einfo.nixCode->errLineOfCode.has_value()) { + if (nl) + out << std::endl << prefix; printCodeLines(out, prefix, *einfo.nixCode); - out << prefix << std::endl; + nl = true; } // hint if (einfo.hint.has_value()) { - out << prefix << *einfo.hint << std::endl; - out << prefix << std::endl; + if (nl) + out << std::endl << prefix; + out << std::endl << prefix << *einfo.hint; + nl = true; } return out; From 721943e1d44b63d1a4055309fad39e1f4c0f9f0d Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 3 Jun 2020 17:32:57 -0600 Subject: [PATCH 056/120] update error grep --- tests/fetchGitRefs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fetchGitRefs.sh b/tests/fetchGitRefs.sh index 93993ae90..23934698e 100644 --- a/tests/fetchGitRefs.sh +++ b/tests/fetchGitRefs.sh @@ -56,7 +56,7 @@ invalid_ref() { else (! git check-ref-format --branch "$1" >/dev/null 2>&1) fi - nix --debug eval --raw "(builtins.fetchGit { url = $repo; ref = ''$1''; }).outPath" 2>&1 | grep 'error: invalid Git branch/tag name' >/dev/null + nix --debug eval --raw "(builtins.fetchGit { url = $repo; ref = ''$1''; }).outPath" 2>&1 | grep 'invalid Git branch/tag name' >/dev/null } From 2299ef705c2d69add371ee4ccca04de9f2628853 Mon Sep 17 00:00:00 2001 From: Matthew Bauer Date: Wed, 3 Jun 2020 15:18:46 -0500 Subject: [PATCH 057/120] Add error message when FileIngestionMethod is out of bounds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bool coerces anything >0 to true, but in the future we may have other file ingestion methods. This shows a better error message when the “recursive” byte isn’t 1. --- src/libstore/daemon.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index f1afdff69..5cff170dd 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -358,8 +358,10 @@ static void performOp(TunnelLogger * logger, ref store, std::string s, baseName; FileIngestionMethod method; { - bool fixed, recursive; + bool fixed; uint8_t recursive; from >> baseName >> fixed /* obsolete */ >> recursive >> s; + if (recursive > (uint8_t) FileIngestionMethod::Recursive) + throw Error("unsupported FileIngestionMethod with value of %i; you may need to upgrade nix-daemon", recursive); method = FileIngestionMethod { recursive }; /* Compatibility hack. */ if (!fixed) { From 94427ffee3493077206f960e3cda9bbb659583be Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 4 Jun 2020 11:53:19 -0600 Subject: [PATCH 058/120] add some comments --- src/libutil/error.cc | 6 +++++- src/libutil/error.hh | 21 +++++++++++++++++++-- src/libutil/logging.hh | 33 ++++++++++++++++++--------------- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 539a7543f..1fcb8111c 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -10,13 +10,16 @@ namespace nix { const std::string nativeSystem = SYSTEM; - +// addPrefix is used for show-trace. Strings added with addPrefix +// will print ahead of the error itself. BaseError & BaseError::addPrefix(const FormatOrString & fs) { prefix_ = fs.s + prefix_; return *this; } +// c++ std::exception descendants must have a 'const char* what()' function. +// This stringifies the error and caches it for use by what(), or similarly by msg(). const string& BaseError::calcWhat() const { if (what_.has_value()) @@ -53,6 +56,7 @@ string showErrPos(const ErrPos &errPos) } } +// if nixCode contains lines of code, print them to the ostream, indicating the error column. void printCodeLines(std::ostream &out, const string &prefix, const NixCode &nixCode) { // previous line of code. diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 0ca0c8b15..8a48fa105 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -22,6 +22,23 @@ namespace nix { +/* + +This file defines two main structs/classes used in nix error handling. + +ErrorInfo provides a standard payload of error information, with conversion to string +happening in the logger rather than at the call site. + +BaseError is the ancestor of nix specific exceptions (and Interrupted), and contains +an ErrorInfo. + +ErrorInfo structs are sent to the logger as part of an exception, or directly with the +logError or logWarning macros. + +See the error-demo.cc program for usage examples. + +*/ + typedef enum { lvlError = 0, lvlWarn, @@ -32,6 +49,7 @@ typedef enum { lvlVomit } Verbosity; +// ErrPos indicates the location of an error in a nix file. struct ErrPos { int line = 0; int column = 0; @@ -42,6 +60,7 @@ struct ErrPos { return line != 0; } + // convert from the Pos struct, found in libexpr. template ErrPos& operator=(const P &pos) { @@ -65,8 +84,6 @@ struct NixCode { std::optional nextLineOfCode; }; -// ------------------------------------------------- -// ErrorInfo. struct ErrorInfo { Verbosity level; string name; diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 39692a291..eeb7233e9 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -150,9 +150,23 @@ bool handleJSONLogMessage(const std::string & msg, extern Verbosity verbosity; /* suppress msgs > this */ -/* Print a message if the current log level is at least the specified - level. Note that this has to be implemented as a macro to ensure - that the arguments are evaluated lazily. */ +/* Print a message with the standard ErrorInfo format. + In general, use these 'log' macros for reporting problems that may require user + intervention or that need more explanation. Use the 'print' macros for more + lightweight status messages. */ +#define logErrorInfo(level, errorInfo...) \ + do { \ + if (level <= nix::verbosity) { \ + logger->logEI(level, errorInfo); \ + } \ + } while (0) + +#define logError(errorInfo...) logErrorInfo(lvlError, errorInfo) +#define logWarning(errorInfo...) logErrorInfo(lvlWarn, errorInfo) + +/* Print a string message if the current log level is at least the specified + level. Note that this has to be implemented as a macro to ensure that the + arguments are evaluated lazily. */ #define printMsg(level, args...) \ do { \ if (level <= nix::verbosity) { \ @@ -166,18 +180,7 @@ extern Verbosity verbosity; /* suppress msgs > this */ #define debug(args...) printMsg(lvlDebug, args) #define vomit(args...) printMsg(lvlVomit, args) -#define logErrorInfo(level, errorInfo...) \ - do { \ - if (level <= nix::verbosity) { \ - logger->logEI(level, errorInfo); \ - } \ - } while (0) - -#define logError(errorInfo...) logErrorInfo(lvlError, errorInfo) -#define logWarning(errorInfo...) logErrorInfo(lvlWarn, errorInfo) - - - +/* if verbosity >= lvlWarn, print a message with a yellow 'warning:' prefix. */ template inline void warn(const std::string & fs, const Args & ... args) { From a7b82fd006606dad591f8da88907e79b4c87b1f7 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 4 Jun 2020 21:04:20 +0000 Subject: [PATCH 059/120] Remove file which shouldn't be committed --- src/libutil/tests/libutil-tests | Bin 9399624 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 src/libutil/tests/libutil-tests diff --git a/src/libutil/tests/libutil-tests b/src/libutil/tests/libutil-tests deleted file mode 100755 index ae871b466c377f4ec0de84cf3374438686cfa896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9399624 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®B*uCSi)rcpXB!-a-5|HTyl7qtx;JyUn6-aCZ4o6HEGWsRW&Of^OC=#u z9BR2g(=u>rvIwU#EE)hkx3p|=Zdradj+SM)xV@fTkvmT|GfJN5ic0Y}Ta1nCkGQFR zxwyfW#O$=va(ZLUT_Ecwp_Vu*n}4jqy~a@mRe1$sZ2_PB;*3QSr?j}-yj}8V`*>to z0oIs{3Q{Q&U`API3|@TZmgHxb70k&k&MnC+n4>vy;FLNoQ;tt5^|!2xKh0plS}IQ} z%E0~cTaR>tD_>HQmzt5ckP@6O{=jLi9tv_7YVKUpnFQTxpW}*3@R$09SWRdM;7@09 zv(Lp}`pg>!O6q@bR}p`A=XGi7!i7BVa5Gd1^~ZaGV5U!3>zeZlyEh&Xz<<#bUNejz z6X;Su$?C#CSbb`yIV(|v_SP96??2t<1* z3Uy+Q7q?(Uqq($N!|tA~?9|!ws;aWF?k%UQ2Ru%Zy$BDS&`chYon0!&+1$Cj4k**$ zIZTc%d#8z8g{fF!;j}m`yI7=CB<5#96&@$atB`wXkzD(gES5){Ze9bQ%-PEOoX zHvZOFfxoTcPMEk#rDd}?-qJy*u(Wgm7GLs8;mGj4=90G%gG=C_PrD-~bl&28xS)A@w2B`0qG!B(lhV`1jn7UTk~qZgn>2oW z_Aor;WopB%Ps4`TpA-0FRu-Ix4;dw$*h)-rmthjV2t;L6y&M7a-FUl>E-;6HHqwhM?ZNAaUSEciZFC4yT(fq{4xkXj;=N9K( zP!%lpFDYEQaQ?ytN#%(n2jfDH>Wvt_FSXP<3+5)47mmzJoV&1S>7pfh7hDjZn46oQ zP&PL>qN;rHyhVeTqM5-7=);5rYEi9w!Th9>dGm5}s}@!zCKk_IoHT6i$WbN!goJq) zlnt*+7&cfuZ->eW@k7K{y4A{m^4s8Q)x{%m2t^kal`UOdH7swz@WS~CNf(SPD=8bk zq`Y`;;b2U{!K09JJib7V?~xbHkNt%R{aA+eX4VKQ4yXj-QO1jf3hq7O7Zveoy_*C zYi{U6znn0_ir2@t8_)KVFTH9nISHM1pl>YuU(j(Q>`334Y!?W-kMDf8m%REQ^6Twe z$oA_GF2EG&>08Qn#Yxv<7$bZuVAIQdzM7sN?vJeM&GH?+ckRRZSpx@cRn#1JxQZyX!JsjUaiqrYxG8q-lEal zGEeM&GH?+ckRR9p3#AqtTNzdWJ?X)acb3eYHk!)aWf5y-lNcX!NK%z55|fqo-)} zER7!2=qojPgGO)C=&c&v(CEIqym_NFdb~ytX!IP7UZv6NHTnjP-mKAgYV>xE9=XoD zA7V6ml19(a=!F`+TBEPl=#3h^MWeTA^bU<4wcfiQ;xu}SM$gjdL5;prqc>>uCXL>z z(G896yW5*LTBFBn^ngas(dbngy(W^E3 zYK`8g(OWcnn?~=@=u!80_d}dUPtoXE8a=4dS8DVIjozfuTQ$0&(S7%N^G0j*c#R&= z=s6m_N~70n^bH!lS)=dN=i=h|%at8a+d!7i#osjlNo=H)`}2jozlwJ2ZL} zfA7+L9Tcb0Q#5*(Mh|NAl^VT4qc>@E^LwN2{0)u2kH1gq_BX%Z?bbV9^qwc?_qE;r z=J#aXdJ2Dk)~#o0^q@vxsnHuWdXq+P)#!#s_r2`h578PuUZV#zdX7e~(&+UXeS=1C z*62Gmdb>uCe8syTVl;Y^M$gdbg&MtDqp#NJjT*g0qqk}F4vikw>fH}<8a+j$XKD1H zMqjDX8#H>8MsL;VhDP_j>dhOi(HoTePJ?kD%zU+Kbf0p6M)i-^=s6m_UZXc_^mdIN zquf7H^U2WY)f&A~qqk}FDCK^I+HQ(Q4{G!Vjozx!eaig-wcU7)o}Dc8$tyD1tysL>lVdaFkFDc7fJyYU)5N2Awk^k$9TuF+$Z z>qj-842@o`(Hk{-n?{dPuGiFdQ#5)|qc>>uR*mjcu8-7q<28DYMz7cC%^JO3qsJ)M zFKRv+8ogShH)`}YjUJ_3FR1ONX!M{)Z_wzi8r`R?&((J0HF}Oluh;0!8ogbk$0+M( zHJ=QPUaip^HF}1!&Q#-9YxG8q-lox`l=Yh$KSiSlHF|?aZ`J5NWxb@f8?VuGGE>hcVdca;sC7O#OlrjJC)>mruc8#9(pm&^R zjULzN?O(6aJ2ZOEKfU9$X!Q7v-u|mKy6+)x|3Z!4s?n1+dBAx^=Aq_=;)M(@z*IZt`VY0>EMPkZ~X*66-wZ~sD#-m1})p7D;;pwT0@c>4!6`c93W zvei4z28|xI&D+09qqk}Fz_Z?Q8Z~ph7H|KR8ogbkXFcy7 zr&*)N?eO-m*XSJ@J?91QI4v4I{zY&92Iah|o*yG$^Y#yF^qm?#<#q2k8#H><8{Ym^ z8of=U2j29K)2Pv--}3ga*64;t&v@HAPLoED+3D@SQlqzP^sINh<237ZWnFZ-vM!2K z);X$PuhBa+dXBRGQRB2|^mt{Rqx!Gb=ssngqxu(W^j3|Yq^y6`I1L&-Qd#Gy{y~kt zQ=_LS>mN1F28|x2taDWVDvjQz(F4l*M~%~{(W8}hj_O~n(G88Bp{#$@I87QoMp@^m z{wp%G0Hke^^df7CcF8a-ZF z=cxXxHM&n(=cxXL8ogDcCn@V9HO>ZQU8L$!$~s5Yt2BC>Mh__KA2m*+Mvqq3IjVoP zMmIEihO+)q<1}gX7-gNK`mfaJ?HWBxS^ubUnl*Zyvd&Tc>ot0ZM$b{!KWdy7jUK7o z-@{LGTdx?69@S>AyHx*`A4$CrBGBL9%~!pmq+ z{B*wcic@s+-wdFQ@rwRe%NzeTo}%NY`K?!qqT{FMtye(N@pT#Nm7(bPrw*)FmZIaI zxUgP1ihi7>;@^r?^cY1CD*6CLuTu2m6}?)~V-H7AEfBbiatcqTNHh$qPHq~yrS<^^aMq3Q*`s+Dxl4VqWcy9 zc10hl=pBk~{uaO3{GmPnM=So3ik__KQHp+=qDL!wilWCT`dCGeQ}l6)9S&F_|(WfbTgQ90D`UXXxq3Df@K2y<~6g^APn-%?BMQ>4b`Zp-dSF56*Z;B{) zDtfk}w<&s#q8o~ytLW{DK1b0z6g^+jeSBV~b6tU=M=JU}MUPVSLPd{O^dd!%QS|wW z9;fIF6g^(iixoXd(HAOuilUb&dO*=j6+J`IgNmM|=oct@j-r<-dZD71D|%4TD-^v- z(JK|bTG1CN`u~0WzaIF%9>Bj3e%aTNfx6zI>|VaWisp)l&ep(X+akAGUDN5GHoKRv zbKrFRx9@Q&_(ZliGKJeZ@ftXpY`TOCw+ee4*>p(}ZWi`vvguMH+$iisvU`!;AncRL zrb~x#y|4$6O_vPeYGEHmHXT00L17X|FVbi5R zI9}M_kxiEX;TU0mMK&${!%@Qiglt;!hke3+muy<>ObqK=w&wX9zojY+7=MQ-uA?EZDTv4#x}o zJF;ns9gY$9S7Z++J4)D}kWEYNuus_Ul1)qOaQkm!{K=-Jb+}E~JIJObb+}d7TgXl% zyII(elTDZ2;YML^B%7An;Ra#fOExXB!}Y?xgKWB$5v~^Y8nS7r9S#cnTC!=09nKN< z6=c&bj&O#smy=CP?Qn{)my%7lI>Pb7E+d<6afD-pJ)dk^f`_AoJ%?;sdWU_&o<%m@ z8Va}nD#oAe6tdfdJ(+A;dWTzuJ&tTza)+CRJ(_G|f4-O-tx-ys*C`o0iVu z7-4@!HZ7UMQNsR&Y+5RZeZqd1>@&%3|3!>H*|cO1w+VX(*|by+w+ed;*|bCsHw*i5 zvT11?ZWQ)LvZs^XAnbd|rX_N?Uf6e#O-ti&wXoNaeKy%aVP8u&Es?`H!oGrRx}_A( z5cYDiXOW#E?4@MW(m5P2>@u=x$sCRm_I$F>BRfjibI7KpbJ!>BS!C0aIo$qpXJ?>x zcY5vTMn4=H0(Hw`Qv#zts_1RZ#Y`bHGO(hvqEDc1zs?MtRhGp@lil0+@?o54YIhqC zvRh1G)NaT$AC(~eVW!u9Y1E>u=XM^zE~vQd#fWs%&L!N=BxgG>dXC&=F1xJc?OaB7AEk+- zRNGP3Sy9A%`-x_ve!eZ{0H1O~ z?DmMmEy?Y6BD-DfaQlnf&Btzq4!5s!r_+eb{oWQs~m1exZQfQ+d_xi?(bcsA3~s^pXhLF zal1XrZpS&?Zg;!Yvs(w17U@#ATM@gx>Tt_+yNzSFdmV0r+-^s++hq>7-fp)azLTW0 z9c~{&bqxJW?B;j4J?eH_&u)h}-0IzKm$2KHR9YQUU|;dX%A?dNt$n(J`;6slwBUt_n?4!6y2xBJ-bFo)aqZnqkC`X7r?Zt3i{$>BD_?KY6zLJqgSZnwSPO47LwHv_6;=-+0y(;aTlxZN7r zE!yF>#_d+iZvUdvA}x2j&0)744!3l-+ZcAc)8RJI?RGf3Epxc-{l-Q54Fnqc84kC% z-EPmZ+YpCaqucE^cH7V4R_k`FVz)L??lvMt|1FD+Qm%gKimaKo*KLk%#Km(UR1@1w zrMMUy!8Kq0s`B zM2L&?ad%Ue%VIMUUJKNIYh;S#VFqyBmLt=?^6Kf%0)8{vR+?E zvcmO}EGWsA2#RH~K^l{4YFmuS9lJDe;|Z?m+UT@#C!IxV=bs805G;Lmxx_{+~wpsDX2z z=;2GpkVJ~W6eQGd9EA-f?++K_KBKdFsGT6EXK!Q8<2`&e z@Aa*j3YhddBspcpH+^f)MJs7_sc2$%XGYYD=Dsz5#XbGYj2?Y!((u9B6d6tssqw6? zebza#&%=ZUP53vu9a6hHt#+I7mFU;5d&eDc#r9pFTDyolSQH1ll5RH1V7F+3&9H(= zze9y{$l=ph&?q>yVW?5oazSWr}pxt)$UAa4%A)AN0NSpZ)5Mp zWI@vx`HYRivCGk~a=zI5!GL#i4Lt`jN!xO|#_Ux_%BMNw7Kka?%KlkwNLEcA5 zZ{r8}ItT+GG+st4yRNpn$UVUx#Af4h)ZDdA^{IW`IjL7tt{CUqo#B^7zdgI_d0~HG z94y9$Z*(d*KI7z#&u<&h8JIGUFfH!I(T%8)GN5rAO1c9XsQtj$D#lV9=`M~`?2Pn{ z7_!~Q3?d6V}H zHdAEWQ#tNkcHHMV5plD)YaiZwo9x3f4un3We81-@!TEj$lk!cs<6gjVHTh2CxJPkZ z&i7`H%lTf(aep9Lj?`bfkNeB5GT$v6h~tiT#vRUa*V=KP;Y2j~-obI_JLB&9Ozs+- z@B1*RA12swi#V>PeO6tO}MY${?ySYEikE1;++aMdN-myXUccUH8$8*?l;>&+gtmncaKCojNq0 zR)3gU^cRFnKapHvD#bQ|JD=s(P*N}d!c{f-zjw35y_4Nv=-&N)cCToZ(<1!W1~?`Da26LF;sVq%)al631ra( zHvaaJ;LD*(E*f$F8O{ z)xXegj@`ggZ(|&`Qm@1X>Nbf>RU_&}IT9V*l9@%Vu?Whp{IPVj@(dH+&Vx z$Z3q@Ll9FyXmSc%0x#OVzeGt>wJ!#Ud^P8@_8Vl6#?V0&CkHx+p2{Kaq7qecY^8I? zK$b%s`C;^IH<54fi2TX>GP%hz6dkQ-d?XH|!zRfj7))RfG@7EKl68iOO4)Q2BuIbm+*LUsL&)$r!@cPg+BBRt^`}iT-EB16QP1@}$U)%L2 zT+(XaHy-8=@tO`5jm8aEVfKo%3U(Cgz|Y^He7~^m%aQ)IQt)8d0+WL%awMmFptx>L4pXa1JSvMN@hRjyEM}K}@ zjET`>gY40BI6QBDmo_6uSC8g(*Gi)?fm#tgnxY(QuHslRa*=ZhxBMka8q2=j#q4dg zUnwVLlbMkcdAKw3K#m;Z$PY7ZT? zTI|OrMwljh$E!rhM;WmfeF24b*Qsj6F{j4D`32!DrUQlA%qE9=pi8KmIaE)C;{Dh@ zA6?9~(YKUHDVr&BdgO?zUm7hW%Y()@oVjKkU%o>2#0^#;UNj>3p{$`Tx`BaX=d+d{~?&HLLP^{y`-*7jcCQBb@t-q6xa-2A_yS6tP9kuozYxmta z(U8}hK-X%-QJF5G< z|Mhp7_hYEhWltI|qI=DTqr?{HZ0N%p&xSoONy==J<&IXv1e)1Uz_|=YjV`%tpm65# zgzs(1vAaraaptm=HO^%L=kmHNsb4xcTTL$STrT_NcGNKc`tvMT(Tvl2u2Nz*a$WZ| zD!9g}c8%QbYmDO>2T%>ng`m6;sC!YGJbjn3nGukO*J83U;oe}KYt3-hn&_%Ef@|Gs z)}kv+aiu8^|3_N2F&$InQ1rAy*i&@(3$pRE%`h_Mog|ALSL_qdvuURM7}x4gwdCxX z$jqAVKXHW|F>22ovBS8EW{`iVkySR!#%Nl6%vow`Y~dPL*fk#PzD7OQ$g*o()P0Tf zxyA`p13iTEE1k#g-XTq%(yPhDnEISvmpZ-5*y~-EIo7#OuXOg>BunatcQ~x3A0EF< z_S|wau5wn``@ESbCIMz7-BJ6BG-Nx?^p{MpTdrafY-6uMb{=PSpGP9+@r$fUnIG4E z4IkHNv1@$8NoiPLUM^X0uxmWgeT}tTBcE#6BlvlX*)f9lEi%z3r#Zczc6v3kSG3dX zCa2dG?Dd^2sUME)KF5wrB~>#AQqSwBTEXoRjN=ySO@BFpf3aKzQv`d>XE}%FMNrOx zFSZlD*V*JnvBh}=Z(@z7`#of$vqXFHcrb!{L^EthGT=w3X|64LYO2J^Rq|&zx=|zd z%f@Im@+yP48{rxoxyDkv#%9q*_fzgv2{`Dr=V5Z&R&SxpNJw_XCs+)~_ZiSSHxcvP^)qK}BuX&j=B^4V7I3kSuAHxf0b z9xV)p7*E4#*NK$j4C*U7e7Z(R%*o!yh>K{1aKD}E<3{;Us7Pb`H?HQM%1Ls1b}pl8 zdyIKpjoRaWm>?qTG15gwUUPB)d5rqCQasJMLe?~n74Cds!yg@^D{eD>-U5o%Vy<09 zo#nA>aXzJ-&)YXhjG=Zun-GLj-AtQ2_mOMK!_4PL7}Ree;qJ_*$j)akHK5PuqYGvK zOyYcQlTm4Rj-}R+&me6+5#(X!Qy^;^zh6)3JM($x8LNLvy3glK&gW5zf?@7!=d%hy zD4(^W0k82YBM&p5H(^l!EcD1HP3FTBVGMbqi=vIO+R#Umk9~Nmf=RhVaqwn3vS2dA zVDs#?vUp)g~&@J)F~7zuTps$okbnmmm*O zW|$|A)d7ZT0r^6Yl8dCTpQ1cI3e*|_Jgi&U*SK&q{XGCq;pzkMIB+q{Kd{a|PFVfW+W$TTphMeX*hu9VZkIM!Ch|RHM-nu7;LdI8SL#d5&tua|D)%KTllZ5hQPA8&R~QDi#i$qsZon#q--NOR1SKG{qonc`^X72&FO#gnqKvzZNCIm%J_+Afu=+0T$$m}Pz!zby7^cKD6! z;up_;s~vtvb@7X2zo5hKyT_>?RJb-$&F~Rv zi(eJ{waG2qFLS#1Ww2k9!*6sKzc}`*claIJ#m^@c*M7XKNp?b}qw<@iIyzyiP+XP& zAw}m7c9RsHJ6H{gm|I_qjplw_!s=TNHH+0|hdPecdmZW^X(>m7qu6h`!>?BtzwaKE z8O?I|y-%tGd|5yyG5ix*l&Yz&>+?z~Gb-|8UJIraPHw1Am_Q*GUJoDSd^bdCc?xy^yJ_r}kX@)Nw*|A~2U zt#cl{4~;UO0B_uyeb#snAJXb7qbRA!P*%PXw(%M{ zh2$~Hm{E=H#V(v=oFP7Kj-{VCG>2{;`~jH*Ne;01Bobq*uSZWh}LC-8iLZKsK>!mct9~p(h-fh$i48A$499P8UeQ#s@za-5~sJ82AYS|9? zaHHIIEJBH^!8oJr5<=V@8*Qg@HN3zT1x0d+Pvk_;*PFK>iYOMeR@S1C@(k7*S)&O) zmbH2TM!WVyje2PXG$|OS` zFmB@LJw$Xot&cS9D4>CWx#&n=5aVB^^e>R(R*>Pb7E0vG!Xe zw~j&wG4@kxzcyA=bc`LXX^i)l$s}K=5>6?^y9gdMQO@V~>0Z0MAM*YKvTG(_3#DDm zjl1t8iF4zF#&Oj62J8WX@=N1b2}Wtp;RfR=Om7DMhQc$jyw|gU8+=`sRI@{5Mg8ds zeBU<&Y__@ExJUlUglc|!p@c-6UmDl&pHh}|X>-s05;EIvv!?qtM~XK49_O2Z?};}a zgdcmY{e0}%V`q+?F?M=-sGvGC5IV0BzXe;BAE@g!Fph?^Hnk<8*?3>XO62ytlLSsY9qvDEZM_Bk;Xo`fhcQzJHFdo~PBO`iwW1^zfN3tAxvT z5#woZRo^Ma$gi<&+dFUh|Swmn<+n|1es!`-tY-h zqhGSPY+FpAHbTzaJMN>Qy{I}pw6I>zrFtlm@bY^=c%&qJ^A;j}4um@`!al|ifH6HD zf`jq=Yl5g^+(0HVeq@#>+skAc?N-NumLy@qNBZ_cQ2b3c3_@5$F<7NVd+0 zDL4ozKjTVd3c}T1gv~@xgyP2EMp%+=!v@g(P15aIYtp6QU#^qm*T*=5=-A^;c$jn_ zF0$#$D0;~M2sSfaI}kK<{jh0lrZspr-eT&zQ1UbsE<9@9cmSyauigvqV?wv^UWX;| zp1&J-CrZ3%3vYvhHxh$ndi->=jn`Re<6TG5L;kn1neqOj#~YCcylEbI)H}c{N8!Sw z1dW%GD)3f%;YB#`en3Y^ysy>+FG1psLUwX)M&aKPG)FHBqhxv{m-i0@rcx?*a8eo_n=fK0nn^SJ%{X{K?{G+j%Cuap1Gott4`bZYeBD z7rYa6nUe158%?@Kh3-R8m>##l!=zh(flW7>qKEt!V>8n=0YO9e!TCO)*N*oXbzLa= zY7{Oy%FkGYOhK39MRzZeTXbt-NxEzA03Dj6xF6qO(nbH%9y=e=vB%T!FzH%?Hr;HB z9`ZL}Gt<3`8XCIJ^L#$9qh>pGT`0L{S2}9lSdC0Um*qwGB9U8kPr;IOn{Edk4&WlL zMOUrR4Zs+g9v@$C(|uKH(_Ku_L;fw;%yhp2K||Lco4k%HiIQ$03fI_Ce#Ya-6m%J0 zbl(!WMb`#P(!JFHx^hW35Xs4drlHVHz!;exJr%lx6uJhA9`b*-%A)(5o^JeXZ@Lni z7@_0~P`KzQKjVF53c7$7U6g|^!lLWA4RlqKZW5A{bQv4%nK>5}rpG{dm@{)oi9L2( zs9!_=J~mwn5Hw>~aIQDqI_kPm@^vU&bd;a57ny=C#fvVH+PB6o7M2{lqloSzNmq28 zN!O&%tptVXF$o?fUB*J2?lbDwkUtKad1lT5f`;zzv%KkEqpk}jKa9dfNBJ2sk}k=M zZaTGZ(M^OU=}x^Bbju}O-L)oN4E_~h^NesWC`^wcc$jo$#Wr0ZNjDjrnXU#18oGP% z8pO2ZDy~g)GfV`c#@3q2vzqkqeI!H1d!t@Z!AiZX|RIuNIcX zyJRi!=vo_bU#>Ut+7-NSfMI&v4-XUX;rTXR8buHJL)grC+rgm0`x-w#<++kxKvN@> z9PElm2^uv>6?idTcujM;x*h1JbbsD;_k*H4f42>waK2FhY%inyd)lake9D- z71?<6DSF8N4{T;U0}L9xg9*>;gx)}NBb0m%3fJgS^Ts-)3cP49ymtuQ!g~Rh#Cv89 z@YYJaC=0Jy!5fNEGCjV%${xKv`1f5fl7*ePh^?dOA^$7b%y|3j@rKOQtfY6)+z2Ia zMB&1t1dZpAD)6Gb@O~k53-4=K67Q3nfVWQKB_KOFdU5!7zRe>`21d#B=&RsGD|q)) z^pL+jWZ|6*2F>W5Im3G;{Uc2ctXI0yQGSMjOhFgvMR$yY?huQv7t!4-=`xX=q^nox z%0OXyB*4Sm^+wOL2k&L-*O32En=Ty)8oCRnd#|KNNxFe3Tw_Q183#x@pBLR})V?)# z@v!9Bov<2o|B!T*SDJJk3f(GDm>!w%FzIH`wdvZa<&b|kHuKah0fL6^IxLL6cD#i& zF+$0cP`KzQKVuLw#n^RxjA`Y*gOo$1I;&kbey} zGu<0N(9r#y;Z1j-r0d(2j`B0EMW&!@^P+o>$St}iSd#7^t3daxr2BoPNw->|JBH}k z<2`tobf3+!>8dDt$iEqzneHbbXy}gC(2b{QkNcV^Tw_PA8=H_R=yrP18ANW;y$egy zwO$9h=Ox{77M-uj9=p>pMyAK_f4AxSD0FKmI)48Wo0%?JPnV2;D9CHASxVDBl$?pe zMMwD=Zy{6AwR+JV;Gp{r{UGVSyB2h>O1iN~PM#486}lWym>$O|baA=%*lnhM4f%aG z-Dn_a#x8rRH{IPd?L*0rqj1qtentl}1zn35-5_e;8oR$)bcYk&yOJ*Na+9uAp<50L z(_<_=%$Yek$EN#``ZeSqfXzI1vw@(YyA=Njl;=I^?`htLl4<(8@F+p!uM)4>3vUV~ zVBwt(OAem@8sL2@@oMlegdDu2$Ly(jCooKpIpT2%xzt>cZR2%P%OU@GY-YTRz@Wjq z1NXT+SJH_R?>9^V7ak>Oj7F*$y(TZb5=y|r%Yh~FX4V7mTZy+0&s9jg1_f^$Fielj z#FG~i@5=LSycmg>FCNgqABDCXw}L@~w-x`ym*+~lfM$Luxw0!BC1{+BRDsv%g?BZf zTX>hkl6Z@+2HtlP?>Ri^An_s}w@2@DV3;0viANzM-UH{^cw;Gg$iG57F(L4t27?Cg zv&ov3^xZV|L&-OwaE%@%Xe>jjz}w)3*GT9V-W{+c-s-D>w@2cAx!lAHDtLVek3F7+ zhq>>)Jln>bL(xP2_1MglvkeRyyx!R4bx(Q)O^r};6K1%Jj#@WvMW&!@@S=N-$St~U zuq55%A<%V7y8SJ>oeEtX2FdjJQap1Z2e18Ho34hUhx{$r%ybcYx)am9SJJ&{zYZn$ z>qz7+#x5=3y^?;OCPpZEB!{_T_L;izox`{y0&@Gtcy^@|!dvz$e6ore9@-uo# zx|LpZNz}eIb|=GqLe~fi z)1wp~=24|8%ceU>(q&*X(_H}s4c&vO-gIx#v=1degu+Ef`56IZ3c4yUx@AOe(UriG zbosTQi;;8>U1ZX=DRi%a!t}TX9wyzIvu(N|6g}iG!)B(t9|#({S0{MWwbHZ?CHLq` zNBJ4^ktyhcUUat-xkXnGOVVAw5_GYW?#*Q;UEoQ3X8r&Q)8ip{m~@+G+H@Hd9nU{t zGt<2c1P$Hy z9ecb950mc088%%RMaT0G*vxe8K+w?j)6gAGJ9Q{I2Zf7{S~vcIOhK39MfVAjTXb*0 zl5{&R2VK0R`>RD4{ggd+Nf;y3W6x5X&Zp3=qUa(2PHbknL-lkc$7xp5^|V)qk}pN! z!lML@SCA_3vb^wmI`Do(M@YO~D}a|I@kS#%dC;s@@Xi5-=@G5q^`CAJ-owkte1rKv>j?1+1-lC2T`H!;krh`F)wgf`^HhH_gV|LoJ8=W3ZVgXC)Xkcxz7AtfUW< zc%9fsTzHhAk%&|=dMRFbb14A}FAJ8$n|c}Wuy;|n-LlxkYf|tw1H<&V5FRF8%~>{H zw8Wc@&5U;g7&LfKoaVifew=20D0ysGI?B(Oj!Z$9b;V_k#_4)@=YjQbkw@B8kvGF&Wr9vBDd(Cf+guTRf7%>PEp*R7G1kSHvnT~dVE}A z(|tA7rn{J;iprPxJO|!<$gXshpRpI2f-cI7E|J=|#x53?9J`~4u2#|&m6>#LTkNr02@2C= z58QCEYzJTy&J5k&jG4*U^S)<^DU~Y9hDju7D-!sxJiHEt2k)Qj;!c zt35Nn1%>JH06a{(N78J%$rL^0zY3d~t_27hx^G5kR?^SXUL8u_fx?AH2^uSqD)8F9 z@E#*{3-3Ny67Tk_;jzcd@G$Y-4%m1LD0;~MAT~2z7z`S`LkQ37 zoNy5B)}iEsy5dpu#(Ja*Ji`m`T|&3;UW6s_wk!eOJreIP7GC@|d-UQlN~Xu|g*INt zBpdHaiXQT}Vl(3%pvN2P*Q}&RNxZ=*T%$(`8rzX7@Y=laekF7Z?;BVW@6#&aZIXD2 z$WERVRx5aCVU$ddC>sav4wXE7&N1oFhv?^%2F%79^dB*4R*oTIUN$LGRMJiPKUbu6BLu<_Et zpuxLfnD!w% zFzIHe+H~#IGM<0HW}cfRK+w=#m*~BceuNHNc;*j4sBuJpX{r zOt%pT8oIaRy;sslNxGl0bGzs$KO=}tLD%F(cNdXcbT`0~bXQh@?j1?@UZF|XpwRsS z3e)2;c$jos#@Tc;DLS5iz-Fd<0|*+rpND#%(bMRd6-qw3D;?!$T#HOW*XTv}9Fbde zO|T^0KgvP(nWX!Do=F$E-5$GRh>ktpgNI4?8E$#tvpA|$QFJ{2fXz(z6A(0XM{DR# zqeE6GxeSGC?5K5P6EX$e1}{2;$St~eVM)5yGSGb`>5jALf(qSf7$ei;_qjG*ABAoW zMaT0G*vxd%db;Ex-eY$!9kTGnAQUb-%FlQUnS!pti|zmi-EZgzN%!3ap!=7k8;j)R z8DXbFmjepZ<2Z#bF2x?Z&D5`W{=udj4Ft{DWe@hI`;rb>q2xzUxacT9qXU_OZnYQP zAZp(lyT4gMbQ=`9yFg)j#)+FqKEti*vxphfkA_}?PTD2t)yQ#U*H|p z6^{}$W+PSLReRyp6S{@B9G1kZDgoZ15^wt)6R%3a`vMrI$2xeJc>g%n#v4b`L;lOL znem#zpuzk6B;a{HuDODa$)V&iC|sjQ2^tq6Rp3>5;r)})ExbEnNxYjD0`FLfXXKiA zZ3^CggvTDw!NbIRWsHrNN6|z6yRn(^J_dsZuMgpQJvX+Q4qLc4hQftM%^SBORp14^ z@LnTy3vU}NiT8Lh@M0z2{uW+fhdnvtFiNJ!m$dWqm$chQ+jun;9nU{tGvh_*@lM1S z%DtZM_!k|vaBmESi;nU$nvp5!3cculAaaZD3s{ow{RN;)kaVXYIeAuSROlvSkW7#L z6}m$ey7d$t&p+VMz;v-d&@vLQW>NbVT{ z^eBagNmn(}raK7nfCa!QBF1*(3LvO->2>RHr9{6W06*jYSe(?S)c!oBw$1tpfgN;2 z4kg#1aKTY}Mj8?YT)+$NA_BMIN`;l$k{=i*e>9@9Zy;2#^W3qs$DTL#{IS{RZ8ZiV z7@ph0A#y_W5DY(K>IX0~^*{W{wpv;7s@Vhx7& zdtl8#?f0d%1MFzFPhfi}+sSNCWP3W>=drzj?FzP+vt7sbO>E!6b|c%5vAvybTBB1w zVx@+BzGVAH-oBUZgJ_+I?fp=a|M6_o`jPC>Y>#LAEVgH{UC8zYY+u6mO15uc`!=>8 zVEYlax3T>a+wZac8Qb5n{VUu1)2bc$9*UCki(&gDwnws^!uC|Q&t|)T?Gm<^vAu%r z>)2k)_PuOB#P&06?_hf;+aI&No9zy^`_MHU^6iU~@;#RA6WAWkb~4*%usxmaIczUr zdkNdi*{)~%CbsWpyOHgu*xt_en{0o`_SbCx$aYVMQmTfc8G1d6F~9B{Q=Z}fbA!E`!=>;WBWa}!)$-YwvX;_p#J_SDc+H6 z$FMzw?U8J!vOSgU*=!fEUC#D0wy$9OI<{|T`(C!2*nWoXSJ>Xk_7`mLX8U)x``}nQ zckYnB$JOA8OrNhl{6rH3+a5b3JyaSscKVD={CZBb^6NPhVj~lp(`$zYR{YerhAIbY ze+|^`3Do{*wB%D?^omWZ-4?j4qwnI=@ZTPl34I?)^{vFeP*B$^Hc)q1pmu!ZbG>k& z#&1AI+6UM){ANw`x#!Ulc57fobH%H>jtGeuC~i;s`5lT;J03rJ_DP`j zTlxW`nmPE!9VX*gFg-JH z>DLC*SJ1={18tp)#_E!bpF!PFzb8fEFF_>Z9ZDnQ?_49!GGj=3Yp-xVQ##j6=l-0~bpXjGSYga^(R=d>*!6iL}AMp+K8$)f^en`KE_O=Lxp92c@ zTZRVHYxmOd=8ACrj+A~Fw-id|KJvw1u<$ERjq;}~-@)M0Ia>VSbnS|0YD)aRbhFqX ze*%_&ce-{(q_z2WxtYcvS!ak0SI}=e%i7E3W||e)94|Nfs1U*P#OCDUr^P@#APWDj z+mPY&m}mH5BY_<1w+j+_E$t>u!_%=44%9u&TjZ~obQMP6&ghG&mBg0 zLFwa#@-Iv*^s5*z>qofXmtqW!i}fSi+l83i`lNvVi(vO}*@A`#%R%K4cn}iC=7AeA zHg^uCl+3YN4~b@Gvh0raaAcqtq*4n92{f7F_HzJD678#Fj$H+8Kl4;Ht zh5uLVrN-sNAL@6t%#|RTasNZ+I%X7>;8S_Rf z=0@`Uom4B&p)zKYjJZU{yn_6$7rkN*q*+RNA!KZ zbY3T&7txkyr1N^|Jf5Vdr1MDWTqT`PqAjb0bH8Kp84c8+4xM8T86*a(T$p0U-wy?6 zm2_)QJrFhMqKvUf@y2q@{{Pz zBc$`$(z%7Ul*3tGSclKSh4lbhVTF>Dt|gRb0^6Ij@OV6aDNr2Q@GFFY+8##6Nw~gd z$G&jH{RQKgIB{)FXF;R!T+#jy*N8cVWt8zZ(LDbMVeLohwFUG8gvLDd+t_JSYQt%@ zI}@Jo6q8Z@^q@@rP!wZlc0No|@xy%7r13qnq}x58A}w?-|MZ|d;GakhI}R%Sph&s{ zi4K3pCAwM2Owu)Xr7Hu8>6idVqC4$Go9?w)g6;^LF6BpRwhLV?#((TtKm(wIZUS{~ zD0w&vg^qGF`boMhFS;~p*g-cEiliHy1v-2QfZ{HzH|gSD>oRt$Kw>&(!jb55PO#~I zpaeqxBy7T5r?H#!gD2g6ryzUW5$Q5^JFXIRGtoZ^9pz?>M3!{B$BS+OHSC}}2a2RS z^K8)J2NsC#)~ijr`mS`3fW&mHgd@={A86AZA?ape6Vugv?@9O4$q~M@J>dFDxFzTw z1&&fPW+6$s-Qxv!6@fe8mO+tlWitUcPr^Mz;l*y((G~6;fS8V};Ye`nVr{rl)JVvG z5jHX0-QRh_wVxE>o9O}f40UZNc`XVBj#4u&LXv<>@q+s&fji)CgCgOsp8>ck3HMpZ zgv)uo%e?#zAg1FJa3r{v<88Rv)Civc#U_T^@h?xf!vJ@d2i%Wx zk{8??1nz*_0!6|#O$Xc+5^g^WuB9v7aRkSXA6_Zpb`7xME}=$3{;k-=aNo3h!i|WF z@Od3CPm*w-APEJIS~RvINx;Q>!R;Y%2i)gSB;0$MfUB2qCnGUAE#u$lGIHZEN~U8E zhC4)oyMr1D`M;>M;G(?Y&N(rHZn1Vbpv!cl6*7f2Ftab9pob%Bet;Py@f z+#M2b3KElWtGmJ#0K{~Rg(FSNg#Px(JxjeC^6ziM4ckq9+T~=h>;!MPuWJQd96C-J zIZDmgU&6(B!6j3>j*&YBiX6HA1h+}T1+OsSd~bFcxs?Dh9Vfw&;HKldZMd!$=W&A) z2>AzL6Hm*T-+IE`HqaaHaq3$95+(`-j#4uQAxVr}v=>|swd;VJ3Pr+AI16x3NVw~$ z@5Irvuq)hs05Kis!;#S=(?B0#U>p2NcC2YSbtSaR|*I8Wi+K zf<{HesSQd;CIulV4hWb83E^r~#0gv45yz%ck(po!gE-)fIH4%iHAqltP*L(d&px}V zPSw2$*zfy&>;Kp4tOfg?I;Zy8^Vw&pD#P3bs8Z%``5`HDZ(t8CnOSb9Xk*=O0I--N zY0d>863nG1W3GgZ2bjANR}6F46@a<740E$5y3DOkWbPd>;x>$-A(?yRaG$yM>;%t0 zqDq;Ywkaud-yNNtxnm7;_d+@rb0p0f0V2U%S~BLIA>#q&rr?TUZqfx{PT#Zf>0K^! zojy)5%OAmr+i)ftlDUP4`OIC&PGUI^ph}rrT$_}+G%(lw;v^B}@d={3S0EmXJ9)>( z6i^B7Qj&4Ef}97qn~f`myBE&~cOM(o?I3!w%jt>S?N9Es;rnPv?!G$I=WZlBiRHYG zD&_9$?~`(O!cm|;*?mne>V>yTU+@0$r<*xFG}4VD1OQTxp5RT<)3#!<+_2+=f@6A(~II(V>0W8gtG$$8CLUU`9F;~of1I%56D~7p#=YhFxhPh|&beWrx$lPKu z;x@bk4ar?$=UNa6=2j!}#Q#JJ8eBT7QzlE(&i|I8otLh0_$itngKZ z%M`w)@Jof?D%_^yu4W>RX@lRMV8Lkt4A9G$)J4aJupT;{E5qw^O+5yXRtF zs9#r9S#51jM~=u%StRYpZx&F#CAwtunb9S`G>tY{7JYAL@xC607K$N!|F~|)qwkba z2jPpy-#K?+0draELAcW7s%oJp+`jg1e>0r@^OHC2626vv&NE0)={6pOT?~A!#Ua~3O+IN;M^=R4q#e2%8`Zx$9@Aysm<(ZjzCBH{*?h&o%iXTlz zohm!&E%GZev60?2zx>*?vz9eG4$=+mq!(ZbHk~`^U@SMKciFeaAJra;uPJ>c`{~Zn zLUL1X*9JDzoi1nN1eQTv`y}G;8>e7b;=8l3ew+)wcJDmE->FCMJir{>XP*b?CFcQh zBC{_^nRqc)uFp>EzN|+o?g%n4&^iiGp(rZ z%&%xyTZvm?cVH}jG8o&Nj9mwo^?LV9=Jg+e!>Z=MgZ;Un9+?Ai;2}1E-*dh)vtUlq zFk%^+nH`PcD{J}X_^$nxnYl&fJu(ZH^~k(vSaf-h%qUDP1*MB2jiH$txRPBoY}hqL z<$W?wV|`Y0Q{OSg+5cS92uu@u;LDe&YlA9$bc)}w-U#|wmutS{vj)X+_^4h=@rBWf zq5N3&55-4dQ~){d=eu7+lSLUsfL)b|-FZ9c_l{Xa%3fw&$xWRWXbcpvlc_$K8U{I!H^l-I;dq~DtO5I`I;iRWoKU(2@w zR=W1W4?xM;mH%Z`iuS-KwVR#dTtfb+y^<|WJmrZdMS;hP0eT8N2t}j7f`$~h70h}H zTz)382Nn1dh3qTP<=4~SwG^%D?`xc_F#3BRzo4eQPlNuJh+C@u>WD7ZdJXD5{Y?i7 z)n89ygC73~GIG9HR_G({5CcDb7AZw$Qtzz#4f+H9^-dFPo>718#1?Ae`vX#cKMEZ+ z@vVR?ABF3_{`$_Nqj_o^E*?lOGsF$W1L1ry*+3+PuZllX8Bx_!f$>6mUpCZsinwT& zy6CAXPNiC7G8Y^`;(f!t1Vzzcr1Upn&&T)G+Vn2lR(yC~#Tj|AbJES3kq&4jO5}#+ z9x&qQoWUap4jxi8aHJvGkcg0xJ*WQwC?FZJJu>mEU1paevACA#45h9q&U)2EGGbpB zd-2R|28v3oOvxIE8ROB+Gr2z9$Zyc((wR7yEFErQM)$vBV8P)YjTb*tKx%J85m}AB zU58&VD;{NWE+oa}YHvRqdmD%f&)%|OO=@o+5gY6+M(B(EOUe+%yni1?oNeDuF`j%fZh$_Au+6b`TV;_I}~6 zCO%c+V+x;ExLD!GfNakZm2jF~e_6{v16KMuNB2J1G^cB}>eXeBl#}amo-Jo`XAoVo zsb9e0qxhKJKdCf#=s+Z504l92KAMV*TEYKKVk}wO&m;%qP=X!@Fz#=3+QABBM01t- zR0oQv)k6YW9}IywcTtu`QWd&;)5ouRdpHB7|h-HM?{P) ztWGncMM@FIp=^6p`|5PdLT7b>3XVb>XGT|cQ4?>aBK%ksSrh+3;d_8?d{lYjtb_=4 zTcA|gxipp3cAjNFe!g(vsTK%#QLpZFm6UMgc-?hjI632x-d zoo*DA`*mpVMTRb&A@?k_kvz(y|7Wsq)6YW$u$#XLXx*ChUqBmh?IzXGUxa#({`Nlo z9}pktuOI}iHvOMK^@;Sm!_MTLu!%lfLFJwNH3{_6(VC0V*2MQz*jnLX3VSJJ(55x9 z%=-=iwEa=CiGr~2aU24PS0a+*=~1R#jO`f`w83Z!^TKTB9haFOJjL0)<*v4zWQyKd2_~so}4XsGb4xT*X96K^{si>I>51C*r4*(up_K z#7{ZXz(W8j;a|ioYT`Q-9*^t3zwT1rc%HQ(dHm@;*f6$_#|^UMHcUCca+bzPRqm8{Zh!j5%R^5gVt&%lsrgL*-7R7cyb*&RarJ zpUm{4$gtFZ4mNzl_A{c)x+43g@cOg39@#e+N5MJQsp!L6Oon(I+BUbX*0yuYt9>eO!gMe(yMC$eG4^&TZ?Q?)XXg ztCF7{n6#M=y(DAQ$msZ`+(Pg~T#5o?%8QvZ1?D`#xg_vCR|mWpIkI`mf3q_$2SxZS z=GB;3nnYoP=x~AFS(;fz44s!pN;@#FtUzu282p7mHZoWzcpn=5km_X_{XF;)Z6X&+UgX z%2;r$^@qn8z5D}rsOrz*%}~`&(StkCngmVaJ3?8#lYy>jxvP2+R>$WEtcic4uo_Tf z%YQ8Iy(5jwdt0W+yD0hBrs-w0j@6VV6 z1>}9UCGPH%$srPZb8zJyl0X?$opw-MnK;82}I;j_!yv(_tJ3z`yOrV zyO6rijn3(C>)%Fpz`7KTyg+Q8mR4!4My^{eB=a=j0*w?Pq#h|q=TTJV8lbe^9XalIxR;Rs%H;qlPo_t=;> zYP+-{H(3rrcxrp3J^SyGi3K0eP0GYgHjPs^!TO)G9?b;psOK0F#YZ~OfK_M5!DE9u zV`}C4$V_bVQ$b^JhwAJo-i%9Ym05ocL~|gFvh~jIqz*dk%559yEDMm4>LMxE#7_mZ zB2=aN%W!|OBcMqxb3kjkB1DKY4OAg;K{W-gYND#TKB78VgLJi;rB$b;IK?N`*H3Jg zNj&KYV`-66ITu&{HC2*^K=v3m{-Kg37#W;PdFq2{l~He0HI87-B(O7zkSvxbFKTFj zJ`hbjg)up#)a~WTJ49h-sX^ASao!t#Hp!nam8f^Nfq&h`tjhJT^6%#U)6!IP(haqI zfcC1X(c(9CPPU+M$Ke8~M>T~7sCwrjbVyCbW$dVqe+)=XrO0ktP5f()C90qQ$iL_} z{Xi+*piq?4s9)VFV#2uS`_;Q75qc;vg0Di+^Q$Ie5~G5C^#M)*K#9L1!aMijSivs* zY8ViDYC5Z(QPVE`sshcze)WmEBxB*bOsrg8$=Jiq0@ttlkw9qc7#N6Z>rL^PI_FM7 z;>JR_iK{K~tEWgEv~@oQCHmDkKx*rGDc8g+0J#t1`ctA8A>uI}V*bV#*9vo>vc5o^fu{uqc_{V#MBfE`7!0yl^O6GRZV|1(rI3fw4TOxv|*chfjTQ zFf?}t4|n*Q>j15@sDUv9MH3h=Ye;i{Kq#K(Rv*XPgMrbEWL{uQaoU2u+KNEFC+m3E ziq#nXUBQgb^*QKouBE>XusAB~6|`6V_2aF$lrAXT_?YMGPdx4vbWHudCtCy6@kM~t zpCjd(_)0)GK5p9W@ylpU6a^v~8gIgAtZ@fxJ5rQ{)VAApGXgC#oD-WZB^9^QNGO!dkmh{@fLV5aBlO2(`EEN#tbW3)92cc``w;muIs`^s$cJa8+igSO6= zHR|d(_de)7m+P8!S6Q>>c*QmUl1-fgu`lc7DtJa3WQNI`vjROLM47a0J*e}>6|V8M z{_-FZB1ahKvHeAe=_!%Yx6v@a0+}z524v(_oSvD7R8M!VMnQQZNlqQ3N8|hy7cto< zo}aV3lT~PU7?bXbO?N!9=Ct>_+f2F|*m-K<_C~p_J<8}U%gWz(^5&AIow#9P_I21Y z19XYwM#?Zx!ZOAHvxPBG9h9zCh!dTj`VjhtS`)9@1C8?LpuH;ZDsiGZr?sFku2$UK zq=htQqs*&h{Q3f`4j1E>tb>!DN>Hx!>}S)nMm)i|{%R&Tt~r4od<@)6ey&h@vV3~p z#;x%o?5-NfX&_ghX$N z;EkH!dr~d!0Ab}*3%zj)2V1RY=EcrcgI$VNYOwXrgBkVpvJ5|uYw?CbpCMs{<}7D5 zUr8;fcDq{Li=H)Js+E**3i-|NPByqcG>W3$o^g8#r}^l z_HXBFauU(o?B}b8khP5iVPI~%(+1?m=kKH?N;!??>*`Gz%9ecKVmOOC{`6wbW*Ol# zK;&lNAMcMk81s{8uTDY#=cN=u(U4O_(V_FjT6E3yz+F%Fobm&ajE;XynXLYwwfgU? z{U7c3zXG?$ZzK9eN01Wa8oCC$MBz$68vh!F+w}SovciqG$mmKp%hv1~^6K6fR($Lp<_*uj}+haDRq~c(T4|7o&55+@u62Z z_~2}`NDQPoXCfLa1|0CPG4v#cSk5%u0s4gx=VYIW**gpqT)>Q!7Qz#Rbm@%V`slvW zQ-9pw_^|9zWqMj zj#kZVlJ5W;D)*)Vk{?JQ*-00Y-^OUwo!vTY$3IP5kRWV5i== z@(`^aI5~Z;WJaW}L&Hp;i?^P8&U-MJrhRS@KVe*VD)5u=Y(e6VVCU5nr7Yc^iJ$)d zCjC51nwtJH68ghSWVHlaH@0@l^!ytvSr+cQs8Zpg(-5#lv@*;yc#Iw+c7My8@rH6+Rm(Kd$AE74}p3atOYyWEsOmupa-sEkuz_bxvcI*wQ z#&S|IFgx?oTxXXp90^j-Ky(^qj>gFkE3}^YVSW8ik@VE1=kI~7$@WNa8KIz(l*puY z0Fkn__@53mtBr?a3ocnWoDU$dSWb5{a+%=zA@Cwnk%v5-5aS48$iF`c`KKH5F9QN+ zM+=vHp?uT9Uay^ll#f8KMUlEHpK8X{$fS8fH9tf^s((MoyZ_A~)u$M$w{uh~uQOC1 z?o)mLuQt^$C82skOA-2fhVh<3syq5rf5togp=`nXM&1K@+wz_Ue~wJz_z@|?{8uPH z%cH#PJu-t}CyVrx=mr`M?_?(CCK56^8-S*6D$|k#LIG=Vho&-P@H5T>I9`0>KAnuH zw4<-hps^V@Iu~K5$=FO;I^56ee=n>5Jrer=tJQzSUZ($ke*b?!F!ArHCw<`>b=2=b zT+BnrmwjlPp3R1yzmlFekTNJe9c_AU1xi;QBWQvFdGxpF*|DdgX9ez1d0da5wO2{r zxY1eN8gz_v=}>XEwb1XMfc`2A{WL{C$Va~qZ-xez!FOl`oIcspDa~)5U2RzCXHEHj zf{-w14h-!d%MOvJuS<-4&VZnuCyyIit~2n{9ehgZZoXOm40CnWP|HLifcIJpZ?WR-?&IBno8uoa$bWtSB~}yP zaw=hUyk1~Ue81Do^&=JLD7;$XH`=~P%Yzi&C=l!6S}svoq1PYL@?#30*6Xio`E`Yh z_4s;4>i8pCeoSF+K>K{`rQOA1yj70zo6M5 zv|Chsv)@}@`Bz2duL@5KQ8!L|$9`5~?>Ngos&#xUR&#Zop?Aeia=`tR-W4}wg&14k8wOwY1Gc=%sz$%pyL>zDNGFx zOLpuLnQ-5pDJgQ8md5ooOs1@AR0dv?1%$_c5gkvIW5*tZAEY%h`Db7*cgm_F6XW=m zS8-`HFE-W|$9)K^4&R3r6vqp^0+nqcV%T!lTn3nEY)a-jUV(rMqObrdpjj^Dh!aCa z<&)(O$cO`xXvo12)eskRZFs!im0L|-95eX$~SZ)pM#d7fow8Un`|M3 zZmOh=*NY-Wa(<2o!7mQs+urd0w>pXk4cbsVAQGBehayB(Dl`%SFYxXRUR=!rZd$`u z_;cQCMN7#!0(L}`+>a8$P1$URu#lncv$Q>NjKh6|Qis@RD84;2ir#r2qjIEl4YnNf zQ9GR&Dkf*n0L<@P6}juuR6gOif|lWYz}_oTKOfvQ<>$y97zk;`LZeE29cnkA7Q+4z z3_^%(gwBTx+SE5u7dd{4E98N!+QO=?JYSQF{75=@1Xu3 zi`HqX0}kOifHHJ)RS|xP@6i6Kch4B=;VM*u}kbJ zsBylk;iUoN^bFHA;?y&^by?5UA`>5?L^Yhw%ds% zY3LN(=M3XjIO%nSOhdVrCTXa(zV|)Scjr4u523CsFy}-&90tCeu_#Ncwey8v9Y(kvRF3NSwZHrP=E8vUn!tds z2Bp-}u!Au zY(;a@u%E!{_$F;PL*cQw&i-<>ya79_ET5>?#{!1-gZQ-Y_)VM}24=Gyw9IT4K7ylS z<|!ZS`5^9M<%mNuLhLxS;-8!s;{-Jd(U^Tk=bL7r6++j;K>IfrA0Nl&#fP$@FdFND zxvgR`(cuROEQ;AIwwF>5N?~I1HG~^aZ?f1(Q@92OH4fZvL~t;_c?& z+SJeiJ~-i#iSGn<16w4QmMz|eB5aYu(37+17SDUq2%EOxEnKXMrS1S_uK(nfe>-*RlJRfGS3YkszeuxN848b9OK7Un{Y^eG;QDsfM zSYe+K9D=evKQvE&CmbD<1?41~>e-=Ink02WUr8=IIOY?b^hYO)W1jk+D{Ve;^8wY6X4>SLs+(CA|b?L*@k_0iwb z$F_ePeN?l((Z@jiq&_kPg?qlJJ0r5$BI-y5oV5pUsEHp7A0q6n@T3szfwE6u_e&O~ zq~rN*<5qL4?Yly3{va0z6%bFDN% zRs?_MS0*BNag~^FmWY&L(!EgiqQbCfo|o89Srg!&Z^9%bJ%x(jJe)^KF zjXm>B5q8#3e&4x~EJKel3cRyKXK`ds-|{hjC&k3;n8XZ^?+GT0D)F9=CYzh2IGLz) z#!`^wU)8=t`~Bc(qN|C|2jrNrS<2P%>3aPQKs_%ve$#Xa)DIZ}lYIzP-YI;H1JHZ& zp#YT9rV3J=PlQr$C`hACnB=jMq2L=558tT-8u2M78&}v{`7&`6XB-8@$b^-Yo1Hz- ziA14DX^cWb5}5R;*Cb%^BGFZU7*n$&(I9q=!GVlgrZy8uVQQ3&3=Sq=<2s+()7QU< zJuUnT?CBWfXNH)vkhM?sBaiakjml_)kIzq(5pgE?yq z8z@HTFQIQ{B!d(X$DHxM8{O&Z^(>&?-G%Q7Bm+S!1MW%h$qEq8b$7lNKKFG-0!ewk zm!V_3(<<2K8GoYB{n#h1wRiaz6M){_CI)i_MkuF`JBCI|zlQJ{wBENsfM>mr|7IkR z%hUz|n}PBLrO>wM2j!a4on_HmsHO2ssbV+v<~N8UWuLPGar0I`ZZasP^MS=W=Tl-s zTq@MKgjE#;DFh`fwmX}CB}q^)#abBeBp7-CU98)nIQX25dfFNFDnrH#q6#yPKZ)GQ z^$0vSKldci;d(@SL^bxl1MM}wPUo$-)K5?}Wf%Li-uM=gJSVZ}w|1&87pWM3h?b)fMf*th74iMVXN-w4U~5d$k=$6$gBWPJl6EI#L}UF%_^)&J0A`K0*X(^sxfr*IDAl@Y0(Yq>#EGQ%^`;y14jgimiZ;?Aac9FzLoM z+apuuT4-}AQg#LVu{W6X=wmMYC-v_?(F0&D_~;m{#kuiaaA`8yo0>OC!8(pc7N!ub zuW%%|?8M5GbC;NtC-jM;12X_eVOB1N@->YUC33In{k1VW#~t3NICiU?KH2@f^MW zhnANBn*5-<|9$}+%=gAocp+!k+&48*0Se_T68e=%ni=-!%b1@z*NIihN;QK8gF-Qu zYiI_!e9u6E_;{bp+-14x9gMT1DoQ^`9(kE(lj7!+AOmEx*TXP442iJ}M*(KPM+c-X z->18?xhonn`E!B7%hnIsnrPm~QqC9!{4>3yZpLKJefyf6`*7pGP^a-9ZfBd-S(aYg z)1F~NJJ4SBI-R%TQa@#oW)&$t7mC(--09T$t)vfueHl*W5pEG!9e-QPs}*hpME<+` z`Z}ONeZBr~vLDdbhgr$=wLCX{V2AdJDtkr{cnR|-U;!$dhau2Y*+Pzov78G|g3A74 zj_zPhq_82CO#uo|W!L>g`hpQ@q^L2VGS0t!m6`Q2FC6?VBpSWd)&=#JXX)*x4MuNg z)9lQP6&&6Qy-imxjo!}k_4XI)?F|wMeGTRLBfzNwtK%cJe3QZ$pgsTg-siC^e>1~v zGJo6tbAtXd`ADGn+uRNvIt=e$Jg|d!-n{mBT92>!z(`A#!yjez8BT5*HV&n<+IJhfJCNmT1JQFTDAqb#*ndip$C_0RRK zwzMrPycbydeCAuDPuh#>vkh;BK36MyMxS}UKF^>&e}F z3V8s_(r4er+34MS?MEdFRva};c-BJYaAs1xBc&)Wa>G({h9)w!3Rj004;(a-)dQQM z8Z*;kY-?fq?2N7>Wy_B`XxyW3Z+jd?PDILb)Sg#;aI~Ox;+$~%qOA}P=2{mni zZg`4wJ~2slQvxcQn7r!XA9+!-HLSqQIgxjO3Rx=6FX!|ELx3FgDG+i!yn-{o^LNE( z`SOTXT+#+x8{D&WDh2WN*jxP$@53y)J#%16@mDm$s2*aebFN1do=AaBnMKuyFg%)U z=Y9^9v7C$7Awf8BZ~PXzWr(;=4JkLj^L9)r`k`p-@WzJ1OAeZNc9@3s77SBP_EK<) ziF9a{^&b>~zsf2n#J%-?jBVIUkL-IvM*JRR0kBVf-(HC@tK)wy$hGWqBQUz@NAqt` z2jP5x_ImnfG;hVFY(de`JmEYVX{+aue&q7k*qhPxxx(!-w{|HpAX3S zfID&KzDB@MSKtCC&M#(8$1h3WF&CJL-yH@F8o|{;{+0x<4ohtOItfC|G-=IQ!wg)& z{yDePUIR#Rjuh9{#YNHEKPmXw09ieskMYtddbY^~w;~WzD<|ybE=`moY$H!bT8pzR z#Yg1f-E-KfN;mV!Yk^BNN=xgw3BriwT&H93#u>~DnY=LltaBa|!P=A@Bb21}F+^~Z z5NkbmqZr(W0M2*yI7Px${7C8LTq1z&$yv!%r{Y=2JC>8CUEQu-6>3)}CUiCL2Qr8jdv#cNKNJw1Mh1-r^HUCm%)aIvp+g?(-aS9@C|j$kvEZ+aVK_cq-0Hj=$< z@_XAC(zO_y^$ZxRNXWY3U%ybg;(eIL4>#ifR4z$zLUL-c%jGfG4sL$1YNMxxni9(^{UPaHd|L ztK|g>mn!V3aD&1;g+D5c@DL>W`(4Y&Nf|Gw(DEr--mc}Zacs|ymke)#c=-@6cmq4m zFJs8e!X=5E7>sdHkTa!1Sq$eq$ZT)aMdxss&**={0FI-Q3Ghdhw{m#J7>nT@R|aMj z5A2U2c4#r{`?W$nO4p}28aoIPW6B0be27iMfC9ee=X{Os|4+JJk8>*xU^3BP38~a zf5|`Ski~pi-bQE2MY&7nQ=>8wqo{ZiAJwK1Sj9IQr;~zjLG`Z^CWHPmaG_bHmtG;2R2KBKDei+E12#vAd0&%nSrD4djje zi)B*=V;yb9&mXygmWwL|Zffa2Fq~gLfXmA;LDY9rTRUBBElX{!8@``QR@K(}eC^s= zKm6ht_z7%nKAv$*K5Q%zTfr>OoP(XE#ay#-_oNnep=}C^CWpJEAw#?oO}reg$G0F1 z`Z8|my;v$nL$VjByytQuLy7C3kt4OM56FjQSC3eB^;eujq!G1)jcS}-&0BG4qM&GK zTq)wX^0&tk=dR?hM?omI7vjTsJ`(VCfz|OTT7D3a^*MkNZx+e>wRL|sxslAdraw{3fZj=y?jdqI$SL z-+YCaw|HP@`8nFnRU~P2%`O7-;lVtw+ zIP=wn`6qHyV`vOT5G|YN{PP`Rl1$Q?e?AP(=M5T}k|Hx{LlG7YWu`n3J#g3?f$!-x zLBFxZ@i&gY#S#+-%G9Pu<|urB{Hq4UF%V|)r^K>teG81nO=6YA)yCtYSOlRU>1ZU#w(QWNY z?9ZEdc-d#J`Frj2XpNKoX0XR~IDSE zZ@zvt%ietb1Mutm_bRfe{>}3_pP*AWzv%lu1+mdN8Y0x)j1|-nE{ziu4f*$R^y;e~ zhJPQ%U-yGg9&5M|hwlgnDx3gFKOd=Oo?>ME9SU<59t5T7LvT?ML93!JJ=>ksDCP`vp?O8x2%RVL}#n{p*%C#Tn6H%$d$S@q!{BbC_*~DmB zs4C5rsYE^+q&rtSRHOTB4D03Dn5Ili$5GXimdZys{=p(sWKE5+KWk^lyOj%%p(n8%Sjmeb`Oba@!w24QvCUMbKF_y`o$V97#5L&+~+SVPGw?ANlP$$*#2 zZ6*W05b3a+0q0j-pKg-w`M5cd0nfuN&eOaKtA7lTiyLF}%YUeyEzf<{JDnsfnAA5L zf^$uiTh0@#p=bWPsAE2Y_B@S?pC?Ids&l?mMjJ?dmraGyxvB5NZ<6kC>U(@3_4W7p z(24W85FIJwRz~eoXAVTdq3QD$X6V`=usXg+nkgTza9@Gd@tvr5=iAo%aK>-4>^X^* z`X(;l`blc%JSpyH#=B?Ke0pIVl!ApT&O_vVf}{1pq7qzyWzn+l{ElLBEt~aX*(+#f z&xlcQ!X=iyoW=j4Wj_fG!m^hjYw|4n4HRJ6g{#oz*?1n@vg|%efm(J?6xFgPfzpO7 z`*1Y#lB6Hk*p>~Wz-`8|Z(hOQ=8U>;*S#}j}aaQpvjHDWnkD!%~$5mSQtO&pJ z#69+Yupc+{7BGFXQmdF{-=Do@?0W{Ozk$@Z`t?U<)r>k*ms(e zUe?pt_ZkR>_C12z%ZnBAST95Q6hP0u{~zRM{XU^k{x|Zo_QVuUNPY$T zbHe!<7Xq2z`T5!VA2&e7pU%%_5L1|nk)UGt^0T~#2>H|b*%8SI`5rRz^D`uf1+wH* zC|f1gaB1(rpw;jcCSSS1yzB-r<>qC_B+tuwp-JsZFTZi~v!;@k@J&9c_=TXbH-K|K zJ~e72C;8c#s!q+%vQgZf{45Ray!`C552;q1FULy}|6k^3r-E-cNVFr1R(`e)A;rzl zX0I^$Sqa)}ewHOaH#+N-{bYk+r1UsuWee|d^Ru79C-bhRdzk#|5QUup>D0$)c|A@% zvR$^8f70?QK;~zSoNv$Nn2=2qF#{8Fv<&VCAk)c!h2Slk?|cBJH3RSX9vS07;J?2u z8jdmppZss5Vc_zP)b;zw_)CUa*ULju)LeXCgDLniXyd8)m-mgRt z*U-k3_r&-9guL5{a*e!?X2NIr!I74{U#>CozK!k8sjCe9q`cSAg+Xs}dH+UgAm19{!j`YTSQ zbFpwb>X=9uUmB z8X6TMR5nuB>)}pjr}rboYB*N*5&+~YxH-+4zl93dEzFqNaE_KY%QUm6F`_z{gIPnq zL5o-h7Gb|;19B)sKE>6$ZSZia;!HpK|lOzLqAYA0Vls?BVNa>U+xWiRHSkmcwdM212{4S~VL~?}|RV4XRv_;Yd zS5zci*Wgs3Q<7t%`=gmif`k2rx7bI*uI&ciZ|~abw2*l{Y$}V!f1B_Gv4f|PbZqq> zS%IAUfaO8IgF$w-l8P`px1wKMI#vaf6?zg4gk!|GhQmbDi5R&#c9?UFUjI8p0H*(+ zDakcv+@X>5Ow3rJC1{|EG#!Vr46yQp;my@wqt37FL{$36ZFoTz} z(45PqNF|z5gc@pVB}ZZ^aWO^-*j77SaJq|a-A)>q&CBWhR^kE@YUyA*#SR#a#k=ZI zG?BNUp&8{{XyTdC<8Oinm=U?~Vy}KA$3I|$Et*^rhV0LDeTVm$_7)@#dQNI|8fYFKGE?K-TvM z{2%9chf^T#_$LVxm9nT>l=Ap8j(@duQA!+2!DOC~OpIPdk@({uin|>D(8eGCR`UMc z9sfk-I{twoSN>cVea({p84Gp%qp(fBF%!4S_$MeD9RElS1YOAk(}1rld@uyBL^(A6 z&43;Ke{8*T=m*r7yDG$yQ&xrcM|R*;irl?bp?|R$UKNs6PL2_{lb&0c;ygz&#!@>< zLZ`2meUw9HEN24ImdA~Wz-8&9muoLD7VhfzLQ$+EQcAaL$WJrT%=6Rj%Rrg8rny3H zGb=x1W)nqt}E>O348oW9wKs%{4m9Ps3Z>K zKqNh%x5RRW0XV0qUlcNu>hRWH3|+IMm`UFdV1CB3RcQ|2A-j!b*YF z@iAJ?R(O`ey#Wy)-RA+uZ!)8-XKi@E+8j@k^g_~u49nCCDavewYe+g@G9f*Cl;%7n zwg77~g688KAN@k^I3mI93dQWy)Nru;0GgXV#+5-clrv2I_;`o&`x`U>@66FlU{+UY z_Jaj_Pp69ZUR)sB`*<<5w-l@GFt&`8;!!j-B!USKHuVQC&(KZ__S2I>MYqVRc=k$$ z(UavG#Nq{mNZCC!wed?SI`51R%}?|%?`L^IgaI!?NPZHOdHSdS&OO+&fD>mM3-}dx zs0I9;H^Tz@3X+DNu_IY3O&2rL!KsFxT!tRZ3gJenS4wWhwJNAQ&6!wDVTwI)o-6jS&DaB4AZxXCFZXm3 z-P50f8h(?JJ(kl7_?>Uoqi?Ycs0gzcW;%DP7PHM*HWo!=1UNCC+z75j6VC`bRFP0y z!=r8uYFEy8h+aPsri@-!A(sj2^%P65eemvHD)C6MUHSCpGTw|!cL)-r*Tj{q=_Ch= zyx}JU9}-v{AEo8d3cCP$`vraG!UpP3exF}hS~|{}4A}mhdN3)*;L(Y;%8?_Na|Cf` zs*FpD*~lhx@xBBSfs`}D(?qQGYeo(C!rz=LzDZO=izT>6yhl=sUx31>A&(1+S;;<7 z@*&!Y9+&_=yNLIP^iZOo`!jK#!(SVUu$QRZ=;3Sz0FAFS$Mm`QB&io+-{zphj3eMeDR#%o}RrJ$^KBh{9eWn2z!;<7vQuj!Eu62mOl{ z*NNy^kFo}hvzO;)jO;%mV_9xyk^61l4Em$^79N|s2txLB zD)Dou8U5x#yH4r4M73s94!&BCMA4}AyoS7MC;ITb>%9fMJ)qUwgWjd%ruf%LVcO_* z2<^=sHzjU%we-4mCZ$#9EWsTbH;Z^PE*&mNT>t9p>$Mm4n!Av#@Z?;bfm;OP$vG{r zR(Kzv=U;z5Kg;ly9LmpziJb@XvrRve88<)UgICb$MqZ==xQa|?6O)&6 zW#!m9b|3cDyzF$|63aR6Wmx7TYK4VXUN%)stD(GXG-?y_vi&v2@cDq2MDN-cCKJb4 z(R(WTq$yoXcQLC>X}lGes#K22^RjQ|u@&|qelYOx%?36XSRMaauRo)3j>0q z(>e{z1{evUT||pH)zc8T%vz6`0U*L>SC>{#ksFT0mU5jV4d&w?h=3>AX3IXcJ5aPiQ5i^b!wD zJ}=>%sV2ykv{IA$e7uE6l6r~gbxuBJpPunZcG^0F9L93iVD-VdN>yeX&t+6pMH1tw zXL{WgwQ;1%);giAGkqYEFnRqdptkL&i)BB3Uo`e}G>lN~X9aJC{ftv#8vB7+gAB>* zUuDNnP)@L)+)V}!R(O%X>iC&j{;Af~H`DSvC|mY(Dg6fYS%x$NsINnU6gXh;EpC`tU8KmBUW@a;{irG#qXE6Zh>_a~@%>NBnCuvHya|F2Z7)lq0QfEoquR%R#gg?F_>@>$UXZl)~7kO;( zNRJ00e?O0Wv(CPUPd1*dl~fh85WYKb;*BEOdx4sgz6C^p#Mjspih~0*-464Ee23dK zO*1q-3E)hV$0o2wWaJuq9qjr;^c`9(h#H!1Kv_kJ$31MCwhk8}{*W9A=f4bzmnlsj zqv*@YL0|w)pQ92wH*!idG@VYG(tud;0~p~2tVUpL8CukIoiV4HUS@kl$R$zrTA|2@f}Efh%5EZ-iS@y*Vwv|uqM7; zVZFfW_&$!gzOTZA1>(EdTIS;ryzf+nXDJ-6@HK@|g?B6bm%x|M87c(ou0Sj0GPQoLoP?Df_zzW-S`TGAPE?UZ4>=Iz%?C8e}OVsO{+t=xa@jy z%{zz}1f1s+5D@}Wo0z`2(1kZ^neM*?aOyrXh_L&~mEPfAw-T`W`#qkc0ZMz^h-VAH zLQCy&4GAzTKlU$i{ku^kuFoDPm>vn7m);5VxDx~#My1C(6qU!!V2`6rj~8l>MShR% zOpiC%J$5!dc4v?6JoyTblY>2u@q64aDAlH>$J;f%+sdNhaqdjvaR+KV9)D-ESWa{H zxaaBskB0<%Z0Yw{8SL?1>>P3a;~yi4lwo3nw}Y9tK+1#Sv@^*sMvAgbelY~$!;2@# zPv_z;cinK?lg2En(O$iOAa8}GWC#j(9|gmT8@;ZR=rs-j6uFc3*VO872XhuTexW~1 ztG)gvXnz;`{rv)#&Dn9nF^v}Sp620to)N3t#SA_7* zxA1Lv!pMXDE53fj$LM9_+uy?1GK3F{BOZNI6(9Rod}+k@D5K%dmnmtS^!+MGnQIQd_+qGgkzz>gWcQtI`X+G3 zt_(zy)gaZ1mP=4nzRw8ueXi-dK>O~*zEeYdk2HO6K&InGv9C}7&FcW1Q$6WR-0TzV zyQkmxQP8M08m+?fiNNt8o?)ZR7l4$xX`#NizaV^1wfnx$^v!F|C&9kgfK-d`l_)CT zQ-gh9z`jEf6k89$2-)Xl7nkTAHu%Ervo zFi?O9nWr%!48O-~zBD%dy~0e&>aT~@-x=CpOTWLFxHTb;(tgP^*D0BJX~qpL)DhQ4YXu(0{6Sdr5VX9s~N6QB(yil(fYWZ4)LloYsaJ<4w zg%2uxP2t}aE*DrGe^tw0D*RsIPKBx87`mTD*~%_4-gNIPE3^_8ceStUujEAWgvziz zujxNxPcHOfl3bjbArI}s9Obw#7j!yd9jD8!QLgH=gae|~HO0Ao1}KT;^wu1{8$6M# zIx%{vtm@2v77Y+#b2-b#oPpayqNon|9q(&kRp&@F^Hz1XK0_1r8{`z%0DY+TyXnb)Dkb3F|szXl=2a$pB6n_#_8~LkSr~i%nYoGOzr8GbzT*+&Z@r%P?0E}sMZB0HDBQdYD^4Io;sx@C zdgo0_3O0ViIs^MCJY8UQ{CF*Y{*|fUtZ)t>&(AKFQ6`o%?;lN4_$B$MwUh&+z}vPT zdK!0fVMacy$;|-AZ+Qv@l*$pk@{{=SVX?ibWM?mW2 zZG(;)i4-;}-*T7vrpf?9+_=^8VI#+;5Sqq?8N3y8EEE*39Iy7{ zZXf(~?j#+M<6j^bZewPuoLIKjzxph0A-11W_Ebai8u(N)c?r?6)>}kuIa4KEQ(ouc zwUoP%R|}}vlh@iOcS~L+;+IBVx3N!4UhoA^UdoO2MdT9l z>ingV*RgE5Zry*y29&~xa8uO0?Vcq09 zqqjaK{&=*yEzcpeW$%`}Mp^QD<^dzGk!Y{-Y9pS8_utWi5M)gr#J5vuT)U9|_!CKi zyt;jEt}Ua%Bz;fY{{$ClGjaBNJyP?HiV<{a>R1*{zpOK%Ij)hUJ}3FARUm` znV%VXoe1cbEqS@`UM@+tnJ)`d`jmAxh?18A;)4n}7|eIsAT=nEt9U^J=4SFXK)yC` z8Q<8zQm(TAx~HuDw|1{F0v-SxarVK6AnmXauizVXaBWUerPEH-T<07OnBRGQ@sW7% z4$ktWM`JxR@EOb$WE7+Dc?P_%*fbdR6_kTFclK>4jaUmgc*=R{@08+p=c8f_|3LCK zAeH5xx#3`AP6C+q671ebHDYj-%cU#1s=|s}+FYCg_JZfi`;4-t;to|-SKf@CekNa% zLGTE`1-`Q6bWQ8WjdGTJYTzb;)$x^DeoNuQfR$DT7<~RB3#3@1b*X%qn#Z%vXC^sg zF5m+KbEq`@(ZJh?!ra&A<;Tni1Nfn&nQVbu*8x(YY@NXh4Cqpk!sH7V<+Dm#^kTYP zyfTv?)T_cZ90S2O^Y{aQxVDav*M8v-{NWlA$#IcFULeXeT2DdzFDUA|L1cE%l!-kv z^2`5*J=sHmk%SvylB7F*)H+%sj10Ri^Nu?%C1o!Eqk5J@MsI*T!GeyBZstfe6vGF^tE83+QvCuo zgrmv=-mD^gKysa4bd^P(UH$L|^z#h>-rX}-I2uD$N|nM)(s0qN;}1_Aq*) z>>_0o&=8*@ur#(aps^yXZbeHB9#?4`RE^TIP`eAI;lYW3(r&to$7oyK?v79>*=$sQjrIc`f6|E4ca&ZWPj51h7lbjhm3EgM!Mq^8lXHEU##21 z6Cs}k525c^w-|rV#BZl1nC4Wy=|=|gxmT83Yk8-Zuat64e2~JnTA!xy96)&=$-Ha& z!rFyz{~HL=BtbAD$QDq8lMgYk9FgHS>8_&Nqv zyKvPzLB*emuk#+J!W(klx2A@ix3Ty-7IDj2OAGVkEAlPGR|u#I%pZqk5I4XsWtm~x z3$PN7W#rSCDl-==re;9kHMmUzt*gySl+k`2z;Re%L6dL!)72Ys;M#WpY(|4Xvs-bg z8GpK}(`Kngb)}i(*dBjY#664qxw{u{w>>}&8Z3$Nb`ENHp~S}HZ3~LHL6sdW=>KHA z&7{qV*23|2@DO^99d9RKBMk9&KZIRp0hfLe)3y%Yt$4c-=H$iO$|($G_0AmJ%Xm8z z@P8@ZUc-1hM&s=-I@SNSyCM}OTJocbY)2GjzT8-x zEw~S&PabDmqiPo}`uv}avloft8;Y|7?q!FT(>4}opJkjKLCXrq*?A+F$KLAZv97Wa zcLR}D2GC(_1$|OY5_+MYW%zxZr)2nym*2J!0sDg}!!B-E4&dn%ftAB2<1eZ<0C-`T zx8vGI051$n^T`s2QPtcI$J)F_!{Iod3rt0oyBCj(Dyiv);&B#gccJXYa1srj!6*yO+TOy<9WWLNR{2fUKkjmHm<;dm88 z-^hRYdnSH6Ex|P7?>(yw9INmj3MVOa1lGj=t?*gBK1JdCfQ-j|`MhWA@(ORq-F&Q; zd*bHM5%V7`=@esIgRk%fFM%b5i7;z?K^++`Um#S-HJ@x;k{2#y?73GfUhrS&D@#Dm zb{Y#z0*gM5*_vOEfeb_RSj-=sgWsYWaj2M!K8MzJlDO!cDtzO8wp4m!>ppv#2BW@` z)f96qaogRxqf~rpL(4!PpowQ$&rGJ$>YR73F&0H8y%`l=zTrRoEsH=r*8vsh(raNS zTnFkz8xO1lZM5uU$vD&k|K0Rtv$=UHZ^ors@`-hzT$vQ{Q?O!Aq0QZ@9P;P@{tjW+jM$lIqSyjJprNWqxB;fw=lJ4wo2k3C)~F zRKJ6fnYVHXo=J%EbS*TV{N)DImS8GVlkqW^`TXW;JjwtBnTVhZGlON zi~E`7hv#s47vXn3bj??26e8T?OR`6x$iQEGFBgrb#5G<+Ay-`O!-vQv^JiAT`PbDZnTY0%r92LxMb zCe6xooJg6xz+?PUT3=u(A{W?kj!~Cq)&Qe7Jkdb><+C3qQuYw6teu^UB@1``4J=ea zYV^NO@V_}&VsibD>l9gYH$&)d-rODGlpec}xRb=`SH$HvIzt2rcXES^6kr{T6d82F zD3)a7_#6oX^VXXo!-GJTGXkvBH4j~GU^9hVm$6(EZ?EOH3VU17T5tcazZSqcV3L2{ zU$gImq!a!1*9rgE{dFqMvO#}cM_b%|fBlqUC*ZF&|84o}y?DI> z{q?WnW8$w(CDLqk=CgC%H?cqZZu#p&xxT;lD25ELD}}$l0n+HNzgHXht-=ol*2MQ& zYOe3l>nCZM@W1|An%U6!T6?m*Cn&JG9~@UFmO!$JetID;|6d+gH$(AB{FHCB!noRl zHn{tKdNRXJz)ugmL;Un3%mSQ?ml!{-=oj|WK_Fr`{PZj|^Zc~+oyJeQ3AX>xPsagc z1Ah9z_(uG6AU#F>v~Xa^jI;o@=d z(?h^I{q)-^1K(1(KwwRLo0iurY`w&^Bjo#c{+s^>$J1T=r!y83O!Uux;qw1w|2&^& zm^h9`jDOCe?d`sQ-peo(@Xs-~iht$+kMqhx7|OnZymtkp=K5#VZDIdxip4iK@68)w{PRHZDe=$w6gm8Jq#$Y3 zKMOkh{`vb*$nXeI<=hI^>7O4iG;o2!7X{YDH)#0-g{g~7J3{)Wd@p9P?7ztoQ)?Hl z6GBU1mdXWV&Qdukh)tG*21Vts8i>zE`Dv!8obKoiKjSC5 z#)}Z5SYqThPEij`iMf}DJNPh=Ojy(KL+{uhKV`x?+}x^*!-es#C?}h*nk{Ynq(l4L zAzOIvaCZ}j=Wflc_2=7YL5-et*e8{<)~7P3<0ejAZ{ANPt&=%vy{GnAS%)!GG;D1< zr-zE$j7^`%qa4{<5Qxtoy;)>0rZ%9NMuw;p|y1c7Wiig}4=C+C^Dwpc$a1-&iEu?_omOPSh9m*w`t=rEY}^XXJ|a(T?Ard!ssd2r>#b&)r?!ig z?*{U^;Hiz7I7h%$>q^|KOD2~ZlaugL8l!VCg360_jDVXIJMTajfwPCr^ArWBpz10?t$L+cxG zHk^TW1M3B9YWbOWso*~%a^^K9kx(G0)!&H%xNXD*$~z!&keEBy194J5QoeaUVAX7*QuBO0;_-N@) z9QvT7+c*Pyr=-O3-2rz!hjeUFKO!9t=4~z=Tn~%RjaWq72qHKsKEn{fpX)^&bwM~r#C(EZaVQ3{quc&P(0Rw3Ady(N7W{nzemi9lCkMStUni`IU#?J| ze@FQhEiY2|sKDy@;t+gO%krQ%?(3=Lv^fU9f%vKxuIqZPH9qdnDlQD0{)mGNdvQ%A z`9iK)zTXkW06A0arqn16<<(lQB1Czel*4Pc_JSjNBodr$*o)z727YVxtN7`99nLgJ zHI^UUYU7-VE4HPTS^Y+=uwWb=veBeZMyAvYe z?sF8^X{WbGP{Y^I>ALyXK!U?Yz;)jQX>{GsUo~*4!dC^>#5ZgCGli{QGwleADo?Je z_KgwyK7mq?l>e4(>HJq7|Fwtz+JifFlljyC-{M8IVr)8dwHDlkE=;Qo(;tq9;qsz1 z3?%Ws*CTcc|E7FSsN6ABJ~mW7FjQ_HDsLMa#J?d_{y0=#7AnsUm7fWfr-sTCLgkx6 z<)TozZ>W4usN6ABJ~mW7FjQ_HDsLMS;y+aWI8HdH<^RBj$BZyOxqKUDrWR9+S;&kmKJ36-aY$`eB6n?mKHP`PiYd`_s` zF;qS_R6a0NZXPOc8x-O{RQ@{5R6aIT zJ}^{n9x87e7~(%v{y0=#7AnsUm7np;Z5Y3%hRPE{<(op~BCm|Efe%9f{h|0kPD(dJ zZ-9$9BfBb|i&j?!0%|Vi2UY2B^}rh?s&LG_MSLL|E6zBO<9^t~OZ<#SQX zt5|R2doF-)M^TvH;TFCzN$|1W#&=l&-wO%&(ky%@CBesf8{eJ*d{-pko4(TL_lrQS z;g|I`zPV`Q%dchN4(hj)g)bJUHTYO>;~NyfH~(*8`K?~z)7LEtKGxg#4i4ZOl7MfZ zh3|(zt)Y+gHolc;s5SUlZ{xcqfN#}+FuxBi_xbIe1Rv{de8&gy z-Ijna+rsxppw`gGdK=%TXyfzSE^r6=U9rrk@1;Pk!N+{H_ zZG4>r_$m_c{Zix8*D47<*4y~vz~J-SH346xg>PY?*6_=E8{fkLe6`nv`OUKMU7rLW z>ur2_0ep`p;Hz5d^Ltnle5|+e{R#{|zr7Oh^|SE39jG<@vfjq`TmavW{$YN%RQvRe zNrI2{HonUO_+CiBH_^g(QWAWuxAE;6z;{Igz6=ZB7lB&CFY9f5bJ50^U(3K9^p81j z`25BKwFV#SZG3|Q_~sXey`u`>ur1o2k;F^z~?OS>H8s2Yv^OWjc+B|`24mF z+(CZFS@<3c)Ea!OxAEN)z_;q^Fu!dqe7%$4W4(><_yE4!67bEe^7;KEP;2O8y^Zfv zwDI|E7r2A`MlF0V1!@gG*4y~X1Nc7sYnb14i+%d8N`jB|HondQd=&}!MqBt=CBesf z8($n4e15wo;7hmgEezBeepzqhdpLlv_Np+yGZy*$UY`UX>ur2_0ep`p;LEk}9hL+i z>ur3$0)x+QuLOK+7W(wP9jG<@vfjq`TmavWE5rN_xA2Wgf{*n!zRLpmUP!=~X5l+2 z2|m`_`1TCoyCMPK^aVb@Uj%9mzpS_M%|#nuek}uc&_6m^_+o)tgOBw#zCi(e^REcY zZ}ohizHUkIvEIgaZ~)(s1bhQ6d_M$g4SlS)@vTG~pWn8DJIHT}h3~OIt-;578{aJf ze5)=G^ZU>|pWog|@Uh;;cYFZfZ3+0YEqs3jY7Kp?xAA?7Ha@@Y0(X$#6?1+1UJBG2 ze5|+el?U*Bc3GI;LJQwjN$|1W#@9K3uOb28FLQkQS|!29dK+IH7<_)aCg7{I@GT6~ z8h%-C<9j%OueM*9-z*E?^-1ut-o}>~!1rhZzN*)Keh*86kM%abUxC5rw^stbeipvB z1GR=<*4y}=3*g&vX_((Fvwix;B*Dje8{cICd@m&6n`q%XDG5H-+xYej;JYFLUxtP6 zi$Ja6m-RNjxoG3duVvs4`p2Bte12nrT7!@EHoidteDnK;y`u`>ur1o2k;F^ zz~{W`)AvK5*3id#8{bN_@%e2VxP$zTv+z9@s5SUlZ{xcqfN#|$VSd|K_ur3WqK(gQyTBdfH)`Q~DNt+hvEIg49>DimpD@4cX8H78 zl>{H_ZG4>r_$m_cjkfT$N`jB|HoiD8`22QFz?W{}TNtP{{IcH0_izAT?Zsh!XZ*|O z_xdFGSa0LY3*dV+0bj0#@318JSa0L|6&QSednMpoGt;N|QQe5|+e9UQK?YyDf+h??>f2JYOuB z=8Q!h&Y0rupw0m_ise;qUwP&Dx=hJZycuyF-&=|!WH{3zEBMX{a#Ni%i=yZIR(*UO ze0)nObYB*Y;9HB+HxQ?DO(MRpq)O;3Huzj!HG*%F;@d9~-#tFQOoPw0rAF{|QG9Pu z^g({l^znU2q5HPp2)^&nH~fxB#8)R(!f&a;=lWtJ_#RPwMtXP@ zV?iVME?0ctK$#(aulDh6rK+)4rDIDY`1VqK_a)+s`1qbO_}sCy5q$IVjr`6^#J5)MpPS1yg6~$vw?`tru|B>73_ds4Yy{s4if!MFB2 z!|yeT_`Z@V;kVe}b941Z@J&*D`z7ML$H$jx@VRq|M(}k}d~ZORA%4&F@qI{D`*WQ} z@O__W_#KgmuTH9j-%^9mor^Vs?-9j!R3g5|eSD`GeC}Ma5q#$wkfa@Q&v!MB&ikRBEGRcz5@(CcdfAzd?zTrSx{z3ejR*#OQ~vqEwmAQYkL}guSvxBl~f78 z#Ri|dR@(@^Ns4d3M11%7_%aPXcP+UQd|edZ8&GD5-!pxDA5zu+T6ZJ(zVBi99g&Ey zPO608QiIQ3i*E$qBZ}{+M0}6?_)atU+`WQE@SUgl-iI}jo^D;@tu;0@1H)t9tNMg7t{#8%N5@@P-ckVt9^W1scPhZ zy0_E_zP%LReTn!YKE9_6K6fvz5q$H`GV(hs5#M5|68ZHp_}sm|M(_<*d_O^%A%2JX z_?j7f?p|ag_zqEgPbA_y!pHY2O~>CWZ3N$&-3`ANCE|Nms)XMG2A{i^+X%i}72h6- z_{RG94lwxKz2-*nouK$;L75@>b@1^mrK(e2MDZP!i0^S9-)RP)dsd_oeCH{?_o2)XzZdxUzNM;>|5cl{nMUyac81~i&P06m zQYHLOG5FlGHjUtWUh$ohi0_|1z8(gjdlsk>e3vV}Z=lQ&zgPSCwo=u||MaXr&ok3@W9eS8NP zeC}DpM(~}W_+~+wA^COi@hzpQk^kvg$VTw3?P~bF=KrwwCg4#P$sceyMxvq<6*MB~ zs1bt)CMueUtb+uY(TPR@ML`7x42lpX5j=ok5@8&psCcce#$DF++7%U9KvyCVf;XZl zt_Sg?$Eb-H;Ck@=e%1Y6bA%}F{=e^ezW7Mb+edYEb#+yB^_2{7qa;at%QZY}uVx$Y zZZPonOon%}120Fzv-Xm<0q+C@Zv{Ftp}i+L@ZMxs!~QdSUE6^7`3btcS0ux0ktAtv zwT5Ty#cc!L9}T>NlHuL&z&lpMv-S$N0q+z8Zyh=_p}nU&@IGNz!~QdSkK2IvpF-W< z>yqJZlO$>Hd=1aqYuyICM-059li@w?z$?=5ti9lEz&qE#`v{$x(B2Cic;B(BoxSR9 zz}v;ZyEPe}-+{M4!?X6%w*hZifu`Td0xukGt(=vO6S31Wi(@zw+*rO_JQHoTw&2Hi zWj1?9{=5;x=;;UMd0a){UVpuFpIiR-3&naZxU(b9t-o8o&k~$N-PY=VesE^h)($ug z0O$Xx^H$D_4bH4B*%lqa*ox0XvB5kmysZRB2Hq_{*e=tRsV|$| zKaaES?6N~gaZ!rLL9k*IuRe}E5zH8fbIk0)fw<{K`tY4_taA<)b4(u|-~uDPxYSP1 zZvH#Q1In`pS-xxY2VCDGrPAX!tZn=P2ER}G{nzj#r>Dp7srl`qU(tUFKXW@mDEd8) z&2PaS8pA@-A2CFOu6u-V@;tvDqr5|?*7qK=g!Ww*+OjTGwIWl7KF;d$c1Iy zKu!Q!&RkeSdycXqHVF6D;);<-EWo!gv%onOxVm&e{9qh0?|Q7JJ2-$>C}*i%!65`URT8P?JcW2cg#@7AJ1xVKeB$By?`Ki zUf#Y*wPF+mK+w7eWF^);i)%JloC;9QPw8`(0L523Gx6F@)L?)EMR<`2?8@o_k?1$L zd05?hjE0>ViVe@nit~|f^$^++if(LvkIx}FXgq-~BN6rmJm>!0vzGCMr#vmHiM|-O zB?!@hK?=I7tI@d1YlQe!$O?$0e{H`qd{lkZ5#8WJa)$K5X~=8!L4TcDogl>u9)K&Wz#2ZYWecXrz8x^(X0H-)^^HRMuWoptVz{QSlsfBIOs# zFGYFR`nE1V*pz=(mwyF$aMg?{KR82CzEB>PQr^U`%omoxd4G<-aP;Tp9mo{J2S&f+ zN_e(s@MYqO(7^y(U0>cunrySRzovoXt!hLjKagC8M>-f+W#WDW)$p!Y`4HakJsDKzLv`T6 z=nB<@q-8`L+25V0LA;E(B7H;m>!^qoz60Fjyp3Da4;ni*U4=Td#HIzRUhSaHMWxM4 z)I~&#%lcc?L!=>UYeH@9q|YJ9`djIfr!`c#X2xD2K9W2O z|8K+R%tveLr~fS+-3ZvMx?(|b;ZNlg!m$f-!-XF}#-f6^SV2}8T~5T02W)`N4)^&W zJR5hNY@0PJ3qM%HwS9}Ct$=rExOOn|pB)0*g`?| z&hc0GLT)eCj1ip`DdY`XKMASawu8TB7_;ETWNbciag??jaL1Ov=6GZP)#EkJy*+#p z07i~j6ddHon$Am9W}jogsiB9ne`sllGJ`9?o^LXQGA->FGZr(Zz;U11`S- zS^U+vA%oSj!L*$HHB;PKv*Tm%Ij;(!;x|eKl_-Hu9x%2CY=G*+w0?8XulzM1yCIMX zI7YqvY<4C=Rh(&ihpE&y?+l}B(i^~ai|^$ zg&+84T9v`#J5E-3ScJdPA=c<3-jtL?uz@!4PL0BDHSU>R}IeU5GriJpgz=Loh{`9RJMHX z7b@iArZq1L^WyeC+pMY>i_u=1T7QIMR=HbIu6gyh{wX26lYs`td!QHQP4G_{o)h%% zadsenCcZJedK`w~^(pubzjx>Fcko-4OM_Q7cOl2^(fos;tg*d{d1*!Kw^%O0Cv7i2 zF$wEdy@+qep+bEUj&A0B0_+JBVD=Ze7^1vHlUG+pYW3TiF21VH$wr3!dW^gXx@@HC zBc1L$;d*GpSg-vM;E5YtyQWZ{e^jj^zhjqX`S-v}h=}LinuL#+Z1AgU;E1KLmL}n8_$!$6_5Y z7aN4jWI-^!PDdt=6G}&N?cKu+|X2CLn{civ~6lYLJ(H5+!+I00MW|K_ zQ~G9Aqsr(9pghTo1ddLU7B_7gJ*MyfV?~T$4SB?-l^IcJD?m z%00o6!g~MplZiv0HTmoEaS`UGaI{`U1g39BRmY5P{WE!^D{k(S)_c2ZG%|p4?yfpe zM@d($MHj8Gx`z1X0pEazozHw|T2Po8#C-^8sX@|3!X{!vp=A`I!ZY)QbD=LBb_9_! zL(xT@>!e9;HrJWKI`QjJkDJ@Y)2YXeDl)X=ShNL?zh(u&;q6((daVu1e${;f$zKXj z#l}N)r=sJ&)tF z`^`KAVyYvu$9qX~5n^GlA4xEwcoPJX?av6+E|Tt{wy0wXtlMl;cO1-$!6o7#!G7*$ zAOAT-1On&^(pgerQ3|Qx`^W5#Xag>%?nwY&(l1tP756DbjMTWJzW*Fhud zF4JJyWzvtf7%^R@@rs?86T*8!KD85I65o+(5;2Fg9mg0{0E?iZ`4gsTwy$`j`7KBK z!XN3Gf6e}44LKUh7q@9YCX7Wbod<{>2~2Yvv--!`e=%QuWk(So`J2hH^9TVA7w#2k znnSgyoy(Y*?{*X+Z&l)xf1%jOOf($S63Gj`9i-@NL(P%SE;Sju1_F1Bnjnnf>jEg8 za!jWl4GA3lDB%xMAHPRRqzpYuqL}YZyaCIEF_M5Er6xy^9mSD^Os|Ret*ql zXg=>D&E@sm{yC@PllPGNYx?1rej3uiiqXluAZH$6<-d@>4sV?Y#EJ@rVvD2(gH5JX zwn=>#Ah&%+Rwz7>y@W2M71|Y)+gvRY%vS*$X^UEhR#k1?=AU1b<44<{nn~&MtiVJ! zLcM6h-NX2*dN-NMbd;t}sQ-yM;KXaCGG8r{>;XX9EfCtFQ+dlbuyS>7%r}dG&=&Y%x{sORXZm3qb2O?(@ z0h&%RQYV++>@f3W`&Ii>o1;^x8`ydA>nIbhI{+nX2YkC5WXs;j62jKuAIm!&*BXNClBE1(Yvr801S= zg0=fateOITv(q47Xw~f7L(3P~r@H^*GXV*r<*uC}TAtY#v#Y)L1C-hUa~SamBB;MJ zo0oI01!>jLJet3*=0Bp}ueK>`sI{5pF(0^!ME6jur${bRE5aoxA=UedL&EpfbeD|M zgH4^u{)T+nMOXmyxlIr*i`e-Ou{NZ%A{=;jI4Vx>fy0ZVt7JY`3S;maKjyNKFBpBa z&N0g=@kp4F$b;cL(BC)X>JuwYP&Lx%>Kw+qdgsxd(2KKI5n?2|)zvq)J;w=S3HpuZ z%UYp1RL!KEQq@T_P&c$p%=K8mucv7t!zUH;0Ff-k8DIf^hv|hzw-Ho0HbiEIA?Cqg zpmEDTEFtJ&D7MPI=H~SIomnmOaWL=?ZfPzTs3*{-aBMQBcX}44XNkF-MADpWV%83g zs103gW{ER}48Eg)X*hOep3G!rrsz8YQ6jK8v3rqJEhGN?+5ixld`Lq9BIXe<5lfjp z`up6NQ^{&zMGBU%hpz01>7IV!1OT#WwY5qX>s1Qh6OzSD=rCnrmMoIk(1+~_$hXWW z^VD5naB$xlC?_uj@a4)}WXL95Ac@&x5T62oI1&IOh^GveJbs`M1r`6)mD#^+`(~g& z3kDV0S#2g=P^un@9DEBIq5wxW{|IRe@sk7$GmS3{WYk?RIXJI73iAcd>oQm$=5?6} zWnT9S^_iY&a8fr7)uTa`6*8$KsUgV(Nkj4`q~3s3Q2R|yMP@?%hRTzX=I=9K_pzDv zm9SEb*8)hlA-aOIk&O+^Bb8X3)KL?KoX*UyMP>xn%ud(90WC8+!$;`gCY04?bOLL} ze16vB;?PL#7?^?!gxl36z=i&rb)YeZB%LP&O+Sf@65v+~OWzC>hB7cP2rLi;?F^EH z+FjL#I$fjGJ$sY3MVzWqP(^hEFg7}ISaea>m~=3(JnPc}l%_nEQz@+@sf<^|P`YzD zDQ&2bnx8+M$}H*mS#8)yy89O7Yajmt{Q@_?vg^nm>bdT^aV63?2*C{1Uw~_ljMOg3 zsbfPx6zUKDap2BlXsmrOY#rmp5pf5Ares*o7i>qw7V_*$soMA5739h(4W46nhrc)_)n%ES#z=YP$#KQ=dJSt~BZXPis zfheihfD2#t896xr1wQV>={yHRkoL$of{T7|J5sm_qpGzVsc)nMM%oyE^+P|vlHY*% z_LJw6ysnx)fy<4h|;4h5+9LdE=i5b71e)8525 zNQm5x?IuJd`YBzYZF7+eyZCu@V#8wUj(^x{8Ct>}>-MzTT!3Hk(_I`=;7k@&B z&Dhyz7xh=?Agj8Kh3GPmUyMw){egAQ@=LWZ8*84!La_=iXQ)pJJvJj4svQhja2_`L zG=d2*MZ7{4)(4$Uu6MG`MNTV8{gg`K7djW9teR! z7BU1XZeuFQmP&%ln9B1QQx~Q&rsi}&f+bFm6y$uzO){3$7!E9HhGj{StYSu`B<*kr zam$W^M9;<`+C_uh46nx8CJEPjmn-n}%v zVj^+of@-QSaN%&j1B|CFr>;3LWk53~TQ(DWBxD;-D9fR#of+D~!hj%KVD$3O7Qq%W zNZX*3GQ@-$xts3sOzCP%XE-KQ0n#-Yup%IXAld?(KpZ`KB9NY!wf;%V%YWZpczMDl z!pqdf1;iZf$tLFL)FfjcteMT`*_;jnkOR~$T?tG3O2E4pZv%idyj#LF@@_A7K6tl| zwSjl%F$8eSnzE-9lHlUqfXA-73H7J6tIk7$Ya%ciC~5|UMdk2rN>()%mf_NI(l}qm z#AGgwf`+<#_yD42Q&ln^9eRH3=Y^( z91zplX=NmIu6kU0(@@b&O&;Bqz2YeHAcowX5|=PLueg#@C)Z5RU2}8Uhu|V&AC!)7 zf#u}3v$`?z0cg@hJ8M_q6rZbAEc9E*vcJ9sQ^%hG6cyhY7(&G#7>=%P?u&oo50DEI zaQ=7~wu721%wJHa1Em$1fT_Q|1$8fSf=g!hf0U(KsX_yzn&+As(GGX+&G!8iY?1A^PPUrtVEzkJxqv0pBe%6(T}Wb79h^S{!5 zDM_?nPSGGo0c4{6G6j^>a_LxYzi{o0&X{&<2V0i;_5=KMn!&bTCIc7RFK>adwEdzj zmr(539FO(F5?-stwr6P0v(uBT7j0_5EJ3QRpXdU*tF!LWboR@1q}vM8ZNGq5wU!L0 zwZ*q%zkKNvUVU(^meo6Czr5awu#Eiz5g8DF ~d+*wCX1b6;M3+2Xi7Ro5Eh4M0x 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�u_Y?4*7(DoD{M!KMPNp2|?N<}EX$U?|yO4Ua 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⪼w8Xc1gk^w0I}5K&E6ET~ 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�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

!gV6G5Zp>4Zo-amb7~Jx%RO1v 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

7Rg^fW{PH=;%> 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

uJjO%h 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