From bf2788e4c1d92a8d625f016b2a3b4d34990f33e3 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 2 Jul 2020 09:04:31 -0600 Subject: [PATCH] move showTrace to new loggerSettings --- src/libexpr/eval.cc | 2 +- src/libmain/loggers.cc | 6 +++--- src/libmain/progress-bar.cc | 10 +--------- src/libmain/shared.cc | 3 +-- src/libstore/daemon.cc | 10 +--------- src/libstore/globals.hh | 4 ---- src/libstore/remote-store.cc | 3 ++- src/libutil/logging.cc | 34 ++++++++++++---------------------- src/libutil/logging.hh | 16 ++++++++++++---- src/libutil/tests/logging.cc | 4 ++-- 10 files changed, 35 insertions(+), 57 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index e89948b94..c1a9af9b2 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1232,7 +1232,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po /* Evaluate the body. This is conditional on showTrace, because catching exceptions makes this function not tail-recursive. */ - if (settings.showTrace) + if (loggerSettings.showTrace.get()) try { lambda.body->eval(*this, env2, v); } catch (Error & e) { diff --git a/src/libmain/loggers.cc b/src/libmain/loggers.cc index fd6ce912f..fa18f991d 100644 --- a/src/libmain/loggers.cc +++ b/src/libmain/loggers.cc @@ -22,11 +22,11 @@ LogFormat parseLogFormat(const std::string & logFormatStr) { Logger * makeDefaultLogger() { switch (defaultLogFormat) { case LogFormat::raw: - return makeSimpleLogger(false, false); + return makeSimpleLogger(false); case LogFormat::rawWithLogs: - return makeSimpleLogger(true, false); + return makeSimpleLogger(true); case LogFormat::internalJson: - return makeJSONLogger(*makeSimpleLogger(true, false)); + return makeJSONLogger(*makeSimpleLogger(true)); case LogFormat::bar: return makeProgressBar(); case LogFormat::barWithLogs: diff --git a/src/libmain/progress-bar.cc b/src/libmain/progress-bar.cc index 265b16908..3f7d99a1d 100644 --- a/src/libmain/progress-bar.cc +++ b/src/libmain/progress-bar.cc @@ -81,14 +81,12 @@ private: bool printBuildLogs; bool isTTY; - bool showTrace; public: ProgressBar(bool printBuildLogs, bool isTTY) : printBuildLogs(printBuildLogs) , isTTY(isTTY) - , showTrace(false) { state_.lock()->active = isTTY; updateThread = std::thread([&]() { @@ -133,16 +131,10 @@ public: auto state(state_.lock()); std::stringstream oss; - showErrorInfo(oss, ei, showTrace); + showErrorInfo(oss, ei, loggerSettings.showTrace.get()); log(*state, ei.level, oss.str()); } - bool getShowTrace() const override { - return showTrace; - } - void setShowTrace(bool showTrace) override { - this->showTrace = showTrace; - } void log(State & state, Verbosity lvl, const std::string & s) { diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 5cbdd19e5..52718c231 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -323,9 +323,8 @@ int handleExceptions(const string & programName, std::function fun) printError("Try '%1% --help' for more information.", programName); return 1; } catch (BaseError & e) { - logger->setShowTrace(settings.showTrace); logError(e.info()); - if (e.hasTrace() && !settings.showTrace) + if (e.hasTrace() && !loggerSettings.showTrace.get()) printError("(use '--show-trace' to show detailed location information)"); return e.status; } catch (std::bad_alloc & e) { diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index 186ccc5b4..40d126192 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -41,10 +41,9 @@ struct TunnelLogger : public Logger Sync state_; unsigned int clientVersion; - bool showTrace; TunnelLogger(FdSink & to, unsigned int clientVersion) - : to(to), clientVersion(clientVersion), showTrace(false) { } + : to(to), clientVersion(clientVersion) { } void enqueueMsg(const std::string & s) { @@ -86,13 +85,6 @@ struct TunnelLogger : public Logger enqueueMsg(*buf.s); } - bool getShowTrace() const override { - return showTrace; - } - void setShowTrace(bool showTrace) override { - this->showTrace = showTrace; - } - /* 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/libstore/globals.hh b/src/libstore/globals.hh index 2fbcafff8..58cf08763 100644 --- a/src/libstore/globals.hh +++ b/src/libstore/globals.hh @@ -196,10 +196,6 @@ public: /* Whether to lock the Nix client and worker to the same CPU. */ bool lockCPU; - /* Whether to show a stack trace if Nix evaluation fails. */ - Setting showTrace{this, false, "show-trace", - "Whether to show a stack trace on evaluation errors."}; - Setting sandboxMode{this, #if __linux__ smEnabled diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index b7cc7a5fc..670a6d873 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -8,6 +8,7 @@ #include "derivations.hh" #include "pool.hh" #include "finally.hh" +#include "logging.hh" #include #include @@ -197,7 +198,7 @@ void RemoteStore::setOptions(Connection & conn) overrides.erase(settings.maxSilentTime.name); overrides.erase(settings.buildCores.name); overrides.erase(settings.useSubstitutes.name); - overrides.erase(settings.showTrace.name); + overrides.erase(loggerSettings.showTrace.name); conn.to << overrides.size(); for (auto & i : overrides) conn.to << i.first << i.second.value; diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 7a58527b8..90c6afe81 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -1,5 +1,6 @@ #include "logging.hh" #include "util.hh" +#include "config.hh" #include #include @@ -7,6 +8,10 @@ namespace nix { +LoggerSettings loggerSettings; + +static GlobalConfig::Register r1(&loggerSettings); + static thread_local ActivityId curActivity = 0; ActivityId getCurActivity() @@ -18,7 +23,7 @@ void setCurActivity(const ActivityId activityId) curActivity = activityId; } -Logger * logger = makeSimpleLogger(true, false); +Logger * logger = makeSimpleLogger(true); void Logger::warn(const std::string & msg) { @@ -36,10 +41,9 @@ public: bool systemd, tty; bool printBuildLogs; - bool showTrace; - SimpleLogger(bool printBuildLogs, bool showTrace) - : printBuildLogs(printBuildLogs), showTrace(showTrace) + SimpleLogger(bool printBuildLogs) + : printBuildLogs(printBuildLogs) { systemd = getEnv("IN_SYSTEMD") == "1"; tty = isatty(STDERR_FILENO); @@ -49,13 +53,6 @@ public: return printBuildLogs; } - bool getShowTrace() const override { - return showTrace; - } - void setShowTrace(bool showTrace) override { - this->showTrace = showTrace; - } - void log(Verbosity lvl, const FormatOrString & fs) override { if (lvl > verbosity) return; @@ -80,7 +77,7 @@ public: void logEI(const ErrorInfo & ei) override { std::stringstream oss; - showErrorInfo(oss, ei, showTrace); + showErrorInfo(oss, ei, loggerSettings.showTrace.get()); log(ei.level, oss.str()); } @@ -129,9 +126,9 @@ void writeToStderr(const string & s) } } -Logger * makeSimpleLogger(bool printBuildLogs, bool showTrace) +Logger * makeSimpleLogger(bool printBuildLogs) { - return new SimpleLogger(printBuildLogs, showTrace); + return new SimpleLogger(printBuildLogs); } std::atomic nextId{(uint64_t) getpid() << 32}; @@ -152,13 +149,6 @@ struct JSONLogger : Logger { return true; } - bool getShowTrace() const override { - return prevLogger.getShowTrace(); - } - void setShowTrace(bool showTrace) override { - prevLogger.setShowTrace(showTrace); - } - void addFields(nlohmann::json & json, const Fields & fields) { if (fields.empty()) return; @@ -189,7 +179,7 @@ struct JSONLogger : Logger { void logEI(const ErrorInfo & ei) override { std::ostringstream oss; - showErrorInfo(oss, ei, getShowTrace()); + showErrorInfo(oss, ei, loggerSettings.showTrace.get()); nlohmann::json json; json["action"] = "msg"; diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 273300b50..09619aac6 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -2,6 +2,7 @@ #include "types.hh" #include "error.hh" +#include "config.hh" namespace nix { @@ -34,6 +35,16 @@ typedef enum { typedef uint64_t ActivityId; +struct LoggerSettings : Config +{ + Setting showTrace{this, + false, + "show-trace", + "Whether to show a stack trace on evaluation errors."}; +}; + +extern LoggerSettings loggerSettings; + class Logger { friend struct Activity; @@ -75,9 +86,6 @@ public: logEI(ei); } - virtual bool getShowTrace() const = 0; - virtual void setShowTrace(bool showTrace) = 0; - virtual void warn(const std::string & msg); virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type, @@ -149,7 +157,7 @@ struct PushActivity extern Logger * logger; -Logger * makeSimpleLogger(bool printBuildLogs = true, bool showTrace = false); +Logger * makeSimpleLogger(bool printBuildLogs = true); Logger * makeJSONLogger(Logger & prevLogger); diff --git a/src/libutil/tests/logging.cc b/src/libutil/tests/logging.cc index f51e40fa8..ef22e9966 100644 --- a/src/libutil/tests/logging.cc +++ b/src/libutil/tests/logging.cc @@ -266,7 +266,7 @@ namespace nix { testing::internal::CaptureStderr(); - logger->setShowTrace(true); + loggerSettings.showTrace.assign(true); logError(e.info()); @@ -292,7 +292,7 @@ namespace nix { testing::internal::CaptureStderr(); - logger->setShowTrace(false); + loggerSettings.showTrace.assign(false); logError(e.info());