about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libutil/logging.hh3
-rw-r--r--src/nix/progress-bar.cc25
-rw-r--r--src/nix/verify.cc29
3 files changed, 43 insertions, 14 deletions
diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh
index e0b8c0855eae..1e0c735676b6 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 cc2928472d13..1616c420551a 100644
--- a/src/nix/progress-bar.cc
+++ b/src/nix/progress-bar.cc
@@ -57,6 +57,8 @@ private:
         std::map<ActivityType, ActivitiesByType> activitiesByType;
 
         uint64_t filesLinked = 0, bytesLinked = 0;
+
+        uint64_t corruptedPaths = 0, untrustedPaths = 0;
     };
 
     Sync<State> 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 0d9739314b53..7156341396d3 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<size_t> done{0};
         std::atomic<size_t> untrusted{0};
         std::atomic<size_t> corrupted{0};
         std::atomic<size_t> failed{0};
+        std::atomic<size_t> 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<std::atomic<size_t>> 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) |