From 8e6bf492971347e18c1b5800e9e8fa5191a0839b Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Mon, 29 Oct 2018 12:09:22 +0000 Subject: [PATCH] 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. --- src/nix/doctor.cc | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/nix/doctor.cc b/src/nix/doctor.cc index 1ce3efcb0..7b5444619 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) + bool checkProfileRoots(ref 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; } };