about summary refs log tree commit diff
path: root/src/nix/doctor.cc
diff options
context:
space:
mode:
authorDaiderd Jordan <daiderd@gmail.com>2018-10-29T12·09+0000
committerDaiderd Jordan <daiderd@gmail.com>2018-10-29T12·09+0000
commit8e6bf492971347e18c1b5800e9e8fa5191a0839b (patch)
tree6e927014e43e034c427babd2bac88c67b3f3799d /src/nix/doctor.cc
parent18b4c53f71dfc626f5f5ffa0282afd1b9faad6a4 (diff)
nix doctor: return nonzero exitcode if a check fails
This makes it easier to use this when testing the installer or when
running the checks with other automated tooling.
Diffstat (limited to 'src/nix/doctor.cc')
-rw-r--r--src/nix/doctor.cc26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/nix/doctor.cc b/src/nix/doctor.cc
index 1ce3efcb0415..7b5444619470 100644
--- a/src/nix/doctor.cc
+++ b/src/nix/doctor.cc
@@ -18,6 +18,8 @@ std::string formatProtocol(unsigned int proto)
 
 struct CmdDoctor : StoreCommand
 {
+    bool success = true;
+
     std::string name() override
     {
         return "doctor";
@@ -36,13 +38,16 @@ struct CmdDoctor : StoreCommand
         auto type = getStoreType();
 
         if (type < tOther) {
-            checkNixInPath();
-            checkProfileRoots(store);
+            success &= checkNixInPath();
+            success &= checkProfileRoots(store);
         }
-        checkStoreProtocol(store->getProtocol());
+        success &= checkStoreProtocol(store->getProtocol());
+
+        if (!success)
+            throw Exit(2);
     }
 
-    void checkNixInPath()
+    bool checkNixInPath()
     {
         PathSet dirs;
 
@@ -56,10 +61,13 @@ struct CmdDoctor : StoreCommand
             for (auto & dir : dirs)
                 std::cout << "  " << dir << std::endl;
             std::cout << std::endl;
+            return false;
         }
+
+        return true;
     }
 
-    void checkProfileRoots(ref<Store> store)
+    bool checkProfileRoots(ref<Store> store)
     {
         PathSet dirs;
 
@@ -86,10 +94,13 @@ struct CmdDoctor : StoreCommand
             for (auto & dir : dirs)
                 std::cout << "  " << dir << std::endl;
             std::cout << std::endl;
+            return false;
         }
+
+        return true;
     }
 
-    void checkStoreProtocol(unsigned int storeProto)
+    bool checkStoreProtocol(unsigned int storeProto)
     {
         unsigned int clientProto = GET_PROTOCOL_MAJOR(SERVE_PROTOCOL_VERSION) == GET_PROTOCOL_MAJOR(storeProto)
             ? SERVE_PROTOCOL_VERSION
@@ -103,7 +114,10 @@ struct CmdDoctor : StoreCommand
             std::cout << "Client protocol: " << formatProtocol(clientProto) << std::endl;
             std::cout << "Store protocol: " << formatProtocol(storeProto) << std::endl;
             std::cout << std::endl;
+            return false;
         }
+
+        return true;
     }
 };