diff --git a/lix/legacy/build-remote.cc b/lix/legacy/build-remote.cc index 416b4fb38..d0fb8f61a 100644 --- a/lix/legacy/build-remote.cc +++ b/lix/legacy/build-remote.cc @@ -362,7 +362,7 @@ static int main_build_remote(AsyncIoRoot & aio, std::string programName, Strings if (argv.size() != 1) throw UsageError("called without required arguments"); - verbosity = (Verbosity) std::stoll(argv.front()); + setVerbosity((Verbosity) std::stoll(argv.front())); auto conn = aio.kj.lowLevelProvider->wrapUnixSocketFd(1); capnp::TwoPartyServer srv(kj::heap()); diff --git a/lix/legacy/builtin-builder.cc b/lix/legacy/builtin-builder.cc index 8132439c0..0d03cceab 100644 --- a/lix/legacy/builtin-builder.cc +++ b/lix/legacy/builtin-builder.cc @@ -35,7 +35,7 @@ static int main_builtin_builder(AsyncIoRoot & aio, std::string programName, Stri }; if (auto val = string2Int(getArg("verbosity"))) { - verbosity = verbosityFromIntClamped(*val); + setVerbosity(verbosityFromIntClamped(*val)); } else { throw Error("expected a verbosity argument"); } diff --git a/lix/legacy/nix-store.cc b/lix/legacy/nix-store.cc index d6155489b..263627ca9 100644 --- a/lix/legacy/nix-store.cc +++ b/lix/legacy/nix-store.cc @@ -948,7 +948,7 @@ opServe(std::shared_ptr store, AsyncIoRoot & aio, Strings opFlags, String auto getBuildSettings = [&]() { // FIXME: changing options here doesn't work if we're // building through the daemon. - verbosity = lvlError; + setVerbosity(lvlError); settings.keepLog.override(false); settings.useSubstitutes.override(false); settings.maxSilentTime.override(readNum(in)); diff --git a/lix/libmain/common-args.cc b/lix/libmain/common-args.cc index 6fdaa4fb5..36c9469a3 100644 --- a/lix/libmain/common-args.cc +++ b/lix/libmain/common-args.cc @@ -16,21 +16,21 @@ MixCommonArgs::MixCommonArgs(const std::string & programName) .shortName = 'v', .description = "Increase the logging verbosity level.", .category = loggingCategory, - .handler = {[]() { verbosity = verbosityFromIntClamped(int(verbosity) + 1); }}, + .handler = {[]() { setVerbosity(verbosityFromIntClamped(int(getVerbosity()) + 1)); }}, }); addFlag({ .longName = "quiet", .description = "Decrease the logging verbosity level.", .category = loggingCategory, - .handler = {[]() { verbosity = verbosityFromIntClamped(int(verbosity) - 1); }}, + .handler = {[]() { setVerbosity(verbosityFromIntClamped(int(getVerbosity()) - 1)); }}, }); addFlag({ .longName = "debug", .description = "Set the logging verbosity level to 'debug'.", .category = loggingCategory, - .handler = {[]() { verbosity = lvlDebug; }}, + .handler = {[]() { setVerbosity(lvlDebug); }}, }); addFlag({ diff --git a/lix/libmain/progress-bar.cc b/lix/libmain/progress-bar.cc index 39af11c20..490b1105f 100644 --- a/lix/libmain/progress-bar.cc +++ b/lix/libmain/progress-bar.cc @@ -106,7 +106,7 @@ bool ProgressBar::isVerbose() Logger::BufferState ProgressBar::log(Verbosity lvl, std::string_view s) { - if (lvl > verbosity) { + if (lvl > getVerbosity()) { return BufferState::HasSpace; } auto state(state_.lock()); @@ -142,8 +142,9 @@ Logger::BufferState ProgressBar::startActivityImpl( { auto state(state_.lock()); - if (lvl <= verbosity && !s.empty() && type != actBuildWaiting) + if (lvl <= getVerbosity() && !s.empty() && type != actBuildWaiting) { (void) log(*state, lvl, s + "..."); + } state->activities.emplace_back(ActInfo { .s = s, diff --git a/lix/libstore/build/hook-instance.cc b/lix/libstore/build/hook-instance.cc index 742cf5518..07c8bc093 100644 --- a/lix/libstore/build/hook-instance.cc +++ b/lix/libstore/build/hook-instance.cc @@ -75,7 +75,7 @@ try { auto buildHook = canonPath(buildHookArgs.front()); buildHookArgs.emplace(std::next(buildHookArgs.begin()), baseNameOf(buildHook)); - buildHookArgs.push_back(std::to_string(verbosity)); + buildHookArgs.push_back(std::to_string(getVerbosity())); /* Create the communication pipes. */ auto [selfRPC, hookRPC] = SocketPair::stream(); diff --git a/lix/libstore/build/local-derivation-goal.cc b/lix/libstore/build/local-derivation-goal.cc index 436122c51..d982015db 100644 --- a/lix/libstore/build/local-derivation-goal.cc +++ b/lix/libstore/build/local-derivation-goal.cc @@ -897,7 +897,7 @@ try { if (drv->isBuiltin()) { args.push_back("builtin-builder"); - args.push_back(std::to_string(verbosity)); + args.push_back(std::to_string(getVerbosity())); std::map changedSettings; globalConfig.getChangedSettings(changedSettings); @@ -984,7 +984,7 @@ try { auto groups = buildUser->getSupplementaryGIDs(); creds.setSupplementaryGroups({groups.data(), groups.size()}); } - request.setDebug(verbosity >= lvlDebug); + request.setDebug(getVerbosity() >= lvlDebug); fillBuilderConfig(request); diff --git a/lix/libstore/daemon.cc b/lix/libstore/daemon.cc index 019940c19..7c03d1ad8 100644 --- a/lix/libstore/daemon.cc +++ b/lix/libstore/daemon.cc @@ -95,7 +95,7 @@ struct TunnelLogger : public Logger BufferState log(Verbosity lvl, std::string_view s) override { - if (lvl > verbosity) { + if (lvl > getVerbosity()) { return BufferState::HasSpace; } @@ -106,7 +106,7 @@ struct TunnelLogger : public Logger BufferState logEI(const ErrorInfo & ei) override { - if (ei.level > verbosity) { + if (ei.level > getVerbosity()) { return BufferState::HasSpace; } @@ -195,7 +195,7 @@ struct ClientSettings settings.keepFailed.override(keepFailed); settings.keepGoing.override(keepGoing); settings.tryFallback.override(tryFallback); - nix::verbosity = verbosity; + setVerbosity(verbosity); settings.maxBuildJobs.override(maxBuildJobs); settings.maxSilentTime.override(maxSilentTime); settings.verboseBuild = verboseBuild; diff --git a/lix/libstore/filetransfer.cc b/lix/libstore/filetransfer.cc index 7c5333098..c5fbef8ab 100644 --- a/lix/libstore/filetransfer.cc +++ b/lix/libstore/filetransfer.cc @@ -177,7 +177,7 @@ struct TransferItem } } - if (verbosity >= lvlVomit) { + if (getVerbosity() >= lvlVomit) { curl_easy_setopt(req.get(), CURLOPT_VERBOSE, 1); curl_easy_setopt(req.get(), CURLOPT_DEBUGFUNCTION, TransferItem::debugCallback); } diff --git a/lix/libstore/remote-store.cc b/lix/libstore/remote-store.cc index 3c333b460..300a00e0f 100644 --- a/lix/libstore/remote-store.cc +++ b/lix/libstore/remote-store.cc @@ -127,11 +127,12 @@ kj::Promise> RemoteStore::setOptions(Connection & conn) try { StringSink command; + // clang-format off command << WorkerProto::Op::SetOptions << settings.keepFailed << settings.keepGoing << settings.tryFallback - << verbosity + << getVerbosity() << settings.maxBuildJobs << settings.maxSilentTime << true @@ -140,6 +141,7 @@ try { << 0 /* obsolete print build trace */ << settings.buildCores << settings.useSubstitutes; + // clang-format on std::map overrides; settings.getSettings(overrides, true); // libstore settings diff --git a/lix/libstore/s3-binary-cache-store.cc b/lix/libstore/s3-binary-cache-store.cc index 721257992..a0acfc0e3 100644 --- a/lix/libstore/s3-binary-cache-store.cc +++ b/lix/libstore/s3-binary-cache-store.cc @@ -97,7 +97,10 @@ class AwsLogger : public Aws::Utils::Logging::FormattedLogSystem void ProcessFormattedStatement(Aws::String && statement) override { // FIXME: workaround for truly excessive log spam in debug level: https://github.com/aws/aws-sdk-cpp/pull/3003 - if ((statement.find("(SSLDataIn)") != std::string::npos || statement.find("(SSLDataOut)") != std::string::npos) && verbosity <= lvlDebug) { + if ((statement.find("(SSLDataIn)") != std::string::npos + || statement.find("(SSLDataOut)") != std::string::npos) + && getVerbosity() <= lvlDebug) + { return; } debug("AWS: %s", chomp(statement)); @@ -116,9 +119,8 @@ static void initAWS() shared.cc), so don't let aws-sdk-cpp override it. */ options.cryptoOptions.initAndCleanupOpenSSL = false; - if (verbosity >= lvlDebug) { - options.loggingOptions.logLevel = - verbosity == lvlDebug + if (getVerbosity() >= lvlDebug) { + options.loggingOptions.logLevel = getVerbosity() == lvlDebug ? Aws::Utils::Logging::LogLevel::Debug : Aws::Utils::Logging::LogLevel::Trace; options.loggingOptions.logger_create_fn = [options]() { diff --git a/lix/libutil/args.cc b/lix/libutil/args.cc index 08d0f66b5..05b26861d 100644 --- a/lix/libutil/args.cc +++ b/lix/libutil/args.cc @@ -100,7 +100,7 @@ void RootArgs::parseCmdline(const Strings & _cmdline) throw UsageError("Invalid word number to get completion for: %zu\n. Your autocompletions might be misconfigured", n); *std::next(cmdline.begin(), n - 1) += completionMarker; completions = std::make_shared(); - verbosity = lvlError; + setVerbosity(lvlError); } for (auto pos = cmdline.begin(); pos != cmdline.end(); ) { diff --git a/lix/libutil/logging.cc b/lix/libutil/logging.cc index 70523c230..b0b656908 100644 --- a/lix/libutil/logging.cc +++ b/lix/libutil/logging.cc @@ -76,7 +76,7 @@ public: BufferState log(Verbosity lvl, std::string_view s) override { - if (lvl > verbosity) { + if (lvl > getVerbosity()) { return BufferState::HasSpace; } @@ -116,7 +116,7 @@ public: ActivityId parent ) override { - if (lvl <= verbosity && !s.empty()) { + if (lvl <= getVerbosity() && !s.empty()) { return log(lvl, s + "..."); } return BufferState::HasSpace; @@ -136,7 +136,12 @@ public: } }; -Verbosity verbosity = lvlInfo; +Verbosity detail::verbosity = lvlInfo; + +void setVerbosity(Verbosity v) +{ + detail::verbosity = v; +} Verbosity verbosityFromIntClamped(int val) { diff --git a/lix/libutil/logging.hh b/lix/libutil/logging.hh index 0b93936a7..8ea3ec63f 100644 --- a/lix/libutil/logging.hh +++ b/lix/libutil/logging.hh @@ -319,10 +319,19 @@ Logger * makeSimpleLogger(bool printBuildLogs = true); Logger * makeJSONLogger(Logger & prevLogger); +namespace detail { +extern Verbosity verbosity; +} + +inline Verbosity getVerbosity() +{ + return detail::verbosity; +} + /** * suppress msgs > this */ -extern Verbosity verbosity; +void setVerbosity(Verbosity v); extern LoggerSettings loggerSettings; @@ -388,7 +397,7 @@ extern LoggerSettings loggerSettings; */ #define logErrorInfo(level, errorInfo...) \ do { \ - if ((level) <= ::nix::verbosity) { \ + if ((level) <= ::nix::detail::verbosity) { \ (void) ::nix::logger->logEI((level), errorInfo); \ } \ } while (0) @@ -401,14 +410,13 @@ extern LoggerSettings loggerSettings; * level. Note that this has to be implemented as a macro to ensure that the * arguments are evaluated lazily. The format string *must* be a literal. */ -#define printMsgUsing(loggerParam, level, fs, args...) \ - do { \ - auto _lix_logger_print_lvl = level; \ - const char * _lix_format = [](const char(&_lix_fs)[N]) { return _lix_fs; }(fs); \ - if (_lix_logger_print_lvl <= ::nix::verbosity) { \ - (void \ - ) loggerParam->log(_lix_logger_print_lvl, ::nix::HintFmt(_lix_format, ##args).str()); \ - } \ +#define printMsgUsing(loggerParam, level, fs, args...) \ + do { \ + auto _lix_logger_print_lvl = level; \ + const char * _lix_format = [](const char (&_lix_fs)[N]) { return _lix_fs; }(fs); \ + if (_lix_logger_print_lvl <= ::nix::detail::verbosity) { \ + (void) loggerParam->log(_lix_logger_print_lvl, ::nix::HintFmt(_lix_format, ##args).str()); \ + } \ } while (0) #define printMsg(level, fs, args...) printMsgUsing(::nix::logger, level, fs, ##args) diff --git a/lix/nix/daemon.cc b/lix/nix/daemon.cc index c8a613fae..eda7637a3 100644 --- a/lix/nix/daemon.cc +++ b/lix/nix/daemon.cc @@ -393,7 +393,7 @@ try { "--for", peer.pid ? fmt("%1%", *peer.pid) : "unknown", "--log-level", - fmt("%1%", int(verbosity)), + fmt("%1%", int(getVerbosity())), "--protocol", std::string(socket.id()), }, @@ -687,7 +687,7 @@ main_nix_daemon(AsyncIoRoot & aio, std::string programName, Strings argv, std::s }).parseCmdline(argv); if (isInstance) { - verbosity = Verbosity(std::min(subdaemonLogLevel, lvlVomit)); + setVerbosity(Verbosity(std::min(subdaemonLogLevel, lvlVomit))); daemonInstance(daemon::getProtocol(protocol), aio, isTrustedOpt, peerPidArg); } else { runDaemon(aio, stdio, isTrustedOpt); diff --git a/lix/nix/develop.cc b/lix/nix/develop.cc index 698b285f3..baca10e21 100644 --- a/lix/nix/develop.cc +++ b/lix/nix/develop.cc @@ -599,8 +599,9 @@ struct CmdDevelop : Common, MixEnvironment auto script = makeRcScript(*state, store, buildEnvironment, (Path) tmpDir); - if (verbosity >= lvlDebug) + if (getVerbosity() >= lvlDebug) { script += "set -x\n"; + } script += fmt("command rm -f '%s'\n", rcFilePath); diff --git a/lix/nix/main.cc b/lix/nix/main.cc index 1cdfcf2e2..75a6b12dc 100644 --- a/lix/nix/main.cc +++ b/lix/nix/main.cc @@ -505,9 +505,9 @@ int mainWrapped(AsyncIoRoot & aio, int argc, char ** argv) // FIXME: stop messing about with log verbosity depending on if it is interactive use if (isatty(STDERR_FILENO)) { - verbosity = lvlNotice; + setVerbosity(lvlNotice); } else { - verbosity = lvlInfo; + setVerbosity(lvlInfo); } registerCommands(); diff --git a/perl/lib/Nix/Store.xs b/perl/lib/Nix/Store.xs index 4831b5b98..77b34c2ea 100644 --- a/perl/lib/Nix/Store.xs +++ b/perl/lib/Nix/Store.xs @@ -78,7 +78,7 @@ void init() void setVerbosity(int level) CODE: - verbosity = (Verbosity) level; + setVerbosity((Verbosity) level); int isValidPath(char * path) diff --git a/tests/unit/libstore/filetransfer.cc b/tests/unit/libstore/filetransfer.cc index 8b9d809d7..ed2455575 100644 --- a/tests/unit/libstore/filetransfer.cc +++ b/tests/unit/libstore/filetransfer.cc @@ -445,7 +445,7 @@ TEST(FileTransfer, DISABLED_interrupt) } }; - verbosity = lvlDebug; + setVerbosity(lvlDebug); logger = new InterruptingLogger; AsyncIoRoot aio; diff --git a/tests/unit/libutil/logging.cc b/tests/unit/libutil/logging.cc index f99f49527..788ab5993 100644 --- a/tests/unit/libutil/logging.cc +++ b/tests/unit/libutil/logging.cc @@ -102,7 +102,7 @@ namespace nix { } TEST(logEI, loggingErrorOnTalkativeLevel) { - verbosity = lvlTalkative; + setVerbosity(lvlTalkative); testing::internal::CaptureStderr(); @@ -115,7 +115,7 @@ namespace nix { } TEST(logEI, loggingErrorOnChattyLevel) { - verbosity = lvlChatty; + setVerbosity(lvlChatty); testing::internal::CaptureStderr(); @@ -128,7 +128,7 @@ namespace nix { } TEST(logEI, loggingErrorOnDebugLevel) { - verbosity = lvlDebug; + setVerbosity(lvlDebug); testing::internal::CaptureStderr(); @@ -141,7 +141,7 @@ namespace nix { } TEST(logEI, loggingErrorOnVomitLevel) { - verbosity = lvlVomit; + setVerbosity(lvlVomit); testing::internal::CaptureStderr();