From 4f34c403980e7f5ae3d5257b742af6fd6452c6cf Mon Sep 17 00:00:00 2001
From: Eelco Dolstra <eelco.dolstra@logicblox.com>
Date: Tue, 29 Mar 2016 14:49:18 +0200
Subject: [PATCH] Add "nix verify-store" command

Like "nix-store --verify --check-contents", but with the same
advantages as "nix verify-paths".
---
 src/nix/verify.cc | 66 +++++++++++++++++++++++++++++++++++++----------
 1 file changed, 53 insertions(+), 13 deletions(-)

diff --git a/src/nix/verify.cc b/src/nix/verify.cc
index ef3e9fcc2..1bd2a000a 100644
--- a/src/nix/verify.cc
+++ b/src/nix/verify.cc
@@ -10,28 +10,18 @@
 
 using namespace nix;
 
-struct CmdVerifyPaths : StorePathsCommand
+struct MixVerify : virtual Args
 {
     bool noContents = false;
     bool noSigs = false;
 
-    CmdVerifyPaths()
+    MixVerify()
     {
         mkFlag(0, "no-contents", "do not verify the contents of each store path", &noContents);
         mkFlag(0, "no-sigs", "do not verify whether each store path has a valid signature", &noSigs);
     }
 
-    std::string name() override
-    {
-        return "verify-paths";
-    }
-
-    std::string description() override
-    {
-        return "verify the integrity of store paths";
-    }
-
-    void run(ref<Store> store, Paths storePaths) override
+    void verifyPaths(ref<Store> store, const Paths & storePaths)
     {
         restoreAffinity(); // FIXME
 
@@ -121,4 +111,54 @@ struct CmdVerifyPaths : StorePathsCommand
     }
 };
 
+struct CmdVerifyPaths : StorePathsCommand, MixVerify
+{
+    CmdVerifyPaths()
+    {
+    }
+
+    std::string name() override
+    {
+        return "verify-paths";
+    }
+
+    std::string description() override
+    {
+        return "verify the integrity of store paths";
+    }
+
+    void run(ref<Store> store, Paths storePaths) override
+    {
+        verifyPaths(store, storePaths);
+    }
+};
+
 static RegisterCommand r1(make_ref<CmdVerifyPaths>());
+
+struct CmdVerifyStore : StoreCommand, MixVerify
+{
+    CmdVerifyStore()
+    {
+    }
+
+    std::string name() override
+    {
+        return "verify-store";
+    }
+
+    std::string description() override
+    {
+        return "verify the integrity of all paths in the Nix store";
+    }
+
+    void run(ref<Store> store) override
+    {
+        // FIXME: use store->verifyStore()?
+
+        PathSet validPaths = store->queryAllValidPaths();
+
+        verifyPaths(store, Paths(validPaths.begin(), validPaths.end()));
+    }
+};
+
+static RegisterCommand r2(make_ref<CmdVerifyStore>());
-- 
GitLab