about summary refs log tree commit diff
path: root/src/nix-store/nix-store.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-08-13T01·50+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-08-13T01·50+0200
commit47e185847e729d49e6aa376e8299fd66ef834a0a (patch)
tree6abfc9e9d5744e78b123c73182c30253c9a39681 /src/nix-store/nix-store.cc
parent5bed74d1b0acd8d8083fb82a31d907ad2348a91b (diff)
Refactor option handling
Diffstat (limited to 'src/nix-store/nix-store.cc')
-rw-r--r--src/nix-store/nix-store.cc185
1 files changed, 92 insertions, 93 deletions
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 932789f2c0..6a297b4292 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -29,12 +29,6 @@ using std::cout;
 typedef void (* Operation) (Strings opFlags, Strings opArgs);
 
 
-void printHelp()
-{
-    showManPage("nix-store");
-}
-
-
 static Path gcRoot;
 static int rootNr = 0;
 static bool indirectRoot = false;
@@ -782,7 +776,7 @@ static void opVerify(Strings opFlags, Strings opArgs)
 
     if (ensureLocalStore().verifyStore(checkContents, repair)) {
         printMsg(lvlError, "warning: not all errors were fixed");
-        exitCode = 1;
+        throw Exit(1);
     }
 }
 
@@ -793,6 +787,8 @@ static void opVerifyPath(Strings opFlags, Strings opArgs)
     if (!opFlags.empty())
         throw UsageError("no flags expected");
 
+    int status = 0;
+
     foreach (Strings::iterator, i, opArgs) {
         Path path = followLinksToStorePath(*i);
         printMsg(lvlTalkative, format("checking path `%1%'...") % path);
@@ -802,9 +798,11 @@ static void opVerifyPath(Strings opFlags, Strings opArgs)
             printMsg(lvlError,
                 format("path `%1%' was modified! expected hash `%2%', got `%3%'")
                 % path % printHash(info.hash) % printHash(current.first));
-            exitCode = 1;
+            status = 1;
         }
     }
+
+    throw Exit(status);
 }
 
 
@@ -1017,95 +1015,96 @@ static void opServe(Strings opFlags, Strings opArgs)
 /* Scan the arguments; find the operation, set global flags, put all
    other flags in a list, and put all other arguments in another
    list. */
-void run(Strings args)
+int main(int argc, char * * argv)
 {
-    Strings opFlags, opArgs;
-    Operation op = 0;
-
-    for (Strings::iterator i = args.begin(); i != args.end(); ) {
-        string arg = *i++;
-
-        Operation oldOp = op;
-
-        if (arg == "--realise" || arg == "--realize" || arg == "-r")
-            op = opRealise;
-        else if (arg == "--add" || arg == "-A")
-            op = opAdd;
-        else if (arg == "--add-fixed")
-            op = opAddFixed;
-        else if (arg == "--print-fixed-path")
-            op = opPrintFixedPath;
-        else if (arg == "--delete")
-            op = opDelete;
-        else if (arg == "--query" || arg == "-q")
-            op = opQuery;
-        else if (arg == "--print-env")
-            op = opPrintEnv;
-        else if (arg == "--read-log" || arg == "-l")
-            op = opReadLog;
-        else if (arg == "--dump-db")
-            op = opDumpDB;
-        else if (arg == "--load-db")
-            op = opLoadDB;
-        else if (arg == "--register-validity")
-            op = opRegisterValidity;
-        else if (arg == "--check-validity")
-            op = opCheckValidity;
-        else if (arg == "--gc")
-            op = opGC;
-        else if (arg == "--dump")
-            op = opDump;
-        else if (arg == "--restore")
-            op = opRestore;
-        else if (arg == "--export")
-            op = opExport;
-        else if (arg == "--import")
-            op = opImport;
-        else if (arg == "--init")
-            op = opInit;
-        else if (arg == "--verify")
-            op = opVerify;
-        else if (arg == "--verify-path")
-            op = opVerifyPath;
-        else if (arg == "--repair-path")
-            op = opRepairPath;
-        else if (arg == "--optimise" || arg == "--optimize")
-            op = opOptimise;
-        else if (arg == "--query-failed-paths")
-            op = opQueryFailedPaths;
-        else if (arg == "--clear-failed-paths")
-            op = opClearFailedPaths;
-        else if (arg == "--add-root") {
-            if (i == args.end())
-                throw UsageError("`--add-root requires an argument");
-            gcRoot = absPath(*i++);
-        }
-        else if (arg == "--indirect")
-            indirectRoot = true;
-        else if (arg == "--no-output")
-            noOutput = true;
-        else if (arg == "--serve")
-            op = opServe;
-        else if (arg[0] == '-') {
-            opFlags.push_back(arg);
-            if (arg == "--max-freed" || arg == "--max-links" || arg == "--max-atime") { /* !!! hack */
-                if (i != args.end()) opFlags.push_back(*i++);
+    return handleExceptions(argv[0], [&]() {
+        initNix();
+
+        Strings opFlags, opArgs;
+        Operation op = 0;
+
+        parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
+            Operation oldOp = op;
+
+            if (*arg == "--help")
+                showManPage("nix-store");
+            else if (*arg == "--version")
+                printVersion("nix-store");
+            else if (*arg == "--realise" || *arg == "--realize" || *arg == "-r")
+                op = opRealise;
+            else if (*arg == "--add" || *arg == "-A")
+                op = opAdd;
+            else if (*arg == "--add-fixed")
+                op = opAddFixed;
+            else if (*arg == "--print-fixed-path")
+                op = opPrintFixedPath;
+            else if (*arg == "--delete")
+                op = opDelete;
+            else if (*arg == "--query" || *arg == "-q")
+                op = opQuery;
+            else if (*arg == "--print-env")
+                op = opPrintEnv;
+            else if (*arg == "--read-log" || *arg == "-l")
+                op = opReadLog;
+            else if (*arg == "--dump-db")
+                op = opDumpDB;
+            else if (*arg == "--load-db")
+                op = opLoadDB;
+            else if (*arg == "--register-validity")
+                op = opRegisterValidity;
+            else if (*arg == "--check-validity")
+                op = opCheckValidity;
+            else if (*arg == "--gc")
+                op = opGC;
+            else if (*arg == "--dump")
+                op = opDump;
+            else if (*arg == "--restore")
+                op = opRestore;
+            else if (*arg == "--export")
+                op = opExport;
+            else if (*arg == "--import")
+                op = opImport;
+            else if (*arg == "--init")
+                op = opInit;
+            else if (*arg == "--verify")
+                op = opVerify;
+            else if (*arg == "--verify-path")
+                op = opVerifyPath;
+            else if (*arg == "--repair-path")
+                op = opRepairPath;
+            else if (*arg == "--optimise" || *arg == "--optimize")
+                op = opOptimise;
+            else if (*arg == "--query-failed-paths")
+                op = opQueryFailedPaths;
+            else if (*arg == "--clear-failed-paths")
+                op = opClearFailedPaths;
+            else if (*arg == "--add-root")
+                gcRoot = absPath(getArg(*arg, arg, end));
+            else if (*arg == "--indirect")
+                indirectRoot = true;
+            else if (*arg == "--no-output")
+                noOutput = true;
+            else if (*arg == "--serve")
+                op = opServe;
+            else if (*arg != "" && arg->at(0) == '-') {
+                opFlags.push_back(*arg);
+                if (*arg == "--max-freed" || *arg == "--max-links" || *arg == "--max-atime") /* !!! hack */
+                    opFlags.push_back(getArg(*arg, arg, end));
             }
-        }
-        else
-            opArgs.push_back(arg);
-
-        if (oldOp && oldOp != op)
-            throw UsageError("only one operation may be specified");
-    }
+            else
+                opArgs.push_back(*arg);
 
-    if (!op) throw UsageError("no operation specified");
+            if (oldOp && oldOp != op)
+                throw UsageError("only one operation may be specified");
 
-    if (op != opDump && op != opRestore) /* !!! hack */
-        store = openStore(op != opGC);
+            return true;
+        });
 
-    op(opFlags, opArgs);
-}
+        if (!op) throw UsageError("no operation specified");
 
+        if (op != opDump && op != opRestore) /* !!! hack */
+            store = openStore(op != opGC);
 
-string programId = "nix-store";
+        op(opFlags, opArgs);
+    });
+}