From c2cab207320672fb6ed4af40a99fc9082ff55234 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 16 Aug 2017 19:23:46 +0200 Subject: [PATCH] nix verify: Restore the progress indicator --- src/libutil/logging.hh | 3 +++ src/nix/progress-bar.cc | 25 +++++++++++++++++++++++++ src/nix/verify.cc | 29 +++++++++++++++-------------- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index e0b8c0855..1e0c73567 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -22,11 +22,14 @@ typedef enum { actBuilds = 104, actBuild = 105, actOptimiseStore = 106, + actVerifyPaths = 107, } ActivityType; typedef enum { resFileLinked = 100, resBuildLogLine = 101, + resUntrustedPath = 102, + resCorruptedPath = 103, } ResultType; typedef uint64_t ActivityId; diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc index cc2928472..1616c4205 100644 --- a/src/nix/progress-bar.cc +++ b/src/nix/progress-bar.cc @@ -57,6 +57,8 @@ private: std::map activitiesByType; uint64_t filesLinked = 0, bytesLinked = 0; + + uint64_t corruptedPaths = 0, untrustedPaths = 0; }; Sync state_; @@ -179,6 +181,16 @@ public: update(*state); } } + + else if (type == resUntrustedPath) { + state->untrustedPaths++; + update(*state); + } + + else if (type == resCorruptedPath) { + state->corruptedPaths++; + update(*state); + } } void update() @@ -285,6 +297,19 @@ public: } } + // FIXME: don't show "done" paths in green. + showActivity(actVerifyPaths, "%s paths verified"); + + if (state.corruptedPaths) { + if (!res.empty()) res += ", "; + res += fmt(ANSI_RED "%d corrupted" ANSI_NORMAL, state.corruptedPaths); + } + + if (state.untrustedPaths) { + if (!res.empty()) res += ", "; + res += fmt(ANSI_RED "%d untrusted" ANSI_NORMAL, state.untrustedPaths); + } + return res; } }; diff --git a/src/nix/verify.cc b/src/nix/verify.cc index 0d9739314..715634139 100644 --- a/src/nix/verify.cc +++ b/src/nix/verify.cc @@ -61,16 +61,17 @@ struct CmdVerify : StorePathsCommand auto publicKeys = getDefaultPublicKeys(); + Activity act(*logger, actVerifyPaths); + std::atomic done{0}; std::atomic untrusted{0}; std::atomic corrupted{0}; std::atomic failed{0}; + std::atomic active{0}; - std::string doneLabel("paths checked"); - std::string untrustedLabel("untrusted"); - std::string corruptedLabel("corrupted"); - std::string failedLabel("failed"); - //logger->setExpected(doneLabel, storePaths.size()); + auto update = [&]() { + act.progress(done, storePaths.size(), active, failed); + }; ThreadPool pool; @@ -78,7 +79,10 @@ struct CmdVerify : StorePathsCommand try { checkInterrupt(); - //Activity act(*logger, lvlInfo, format("checking '%s'") % storePath); + Activity act2(*logger, actUnknown, fmt("checking '%s'", storePath)); + + MaintainCount> mcActive(active); + update(); auto info = store->queryPathInfo(storePath); @@ -90,8 +94,8 @@ struct CmdVerify : StorePathsCommand auto hash = sink.finish(); if (hash.first != info->narHash) { - //logger->incProgress(corruptedLabel); - corrupted = 1; + corrupted++; + act2.result(resCorruptedPath, info->path); printError( format("path '%s' was modified! expected hash '%s', got '%s'") % info->path % info->narHash.to_string() % hash.first.to_string()); @@ -142,21 +146,21 @@ struct CmdVerify : StorePathsCommand } if (!good) { - //logger->incProgress(untrustedLabel); untrusted++; + act2.result(resUntrustedPath, info->path); printError(format("path '%s' is untrusted") % info->path); } } - //logger->incProgress(doneLabel); done++; } catch (Error & e) { printError(format(ANSI_RED "error:" ANSI_NORMAL " %s") % e.what()); - //logger->incProgress(failedLabel); failed++; } + + update(); }; for (auto & storePath : storePaths) @@ -164,9 +168,6 @@ struct CmdVerify : StorePathsCommand pool.process(); - printInfo(format("%d paths checked, %d untrusted, %d corrupted, %d failed") - % done % untrusted % corrupted % failed); - throw Exit( (corrupted ? 1 : 0) | (untrusted ? 2 : 0) |