diff --git a/src/nix.cc b/src/nix.cc index d44647928..74c0687d5 100644 --- a/src/nix.cc +++ b/src/nix.cc @@ -70,6 +70,9 @@ public: }; +typedef vector Strings; + + /* Wrapper classes that ensures that the database is closed upon object destruction. */ class Db2 : public Db @@ -427,7 +430,9 @@ string getPkg(string hash) } -void runPkg(string hash, const vector & args) +void runPkg(string hash, + Strings::iterator firstArg, + Strings::iterator lastArg) { string src; string path; @@ -453,8 +458,7 @@ void runPkg(string hash, const vector & args) const char * args2[env.size() + 2]; int i = 0; args2[i++] = runner.c_str(); - for (vector::const_iterator it = args.begin(); - it != args.end(); it++, i++) + for (Strings::const_iterator it = firstArg; it != lastArg; it++, i++) args2[i] = it->c_str(); args2[i] = 0; @@ -493,11 +497,11 @@ void delPkg(string hash) } -void exportPkgs(string outDir, vector hashes) +void exportPkgs(string outDir, + Strings::iterator firstHash, + Strings::iterator lastHash) { - for (vector::iterator it = hashes.begin(); - it != hashes.end(); it++) - { + for (Strings::iterator it = firstHash; it != lastHash; it++) { string hash = *it; string pkgDir = getPkg(hash); string tmpFile = outDir + "/export_tmp"; @@ -616,10 +620,9 @@ void listInstalledPkgs() } -void printInfo(vector hashes) +void printInfo(Strings::iterator first, Strings::iterator last) { - for (vector::iterator it = hashes.begin(); - it != hashes.end(); it++) + for (Strings::iterator it = first; it != last; it++) { try { cout << *it << " " << queryPkgId(*it) << endl; @@ -630,10 +633,10 @@ void printInfo(vector hashes) } -void computeClosure(const vector & rootHashes, +void computeClosure(Strings::iterator first, Strings::iterator last, set & result) { - list workList(rootHashes.begin(), rootHashes.end()); + list workList(first, last); set doneSet; while (!workList.empty()) { @@ -656,10 +659,10 @@ void computeClosure(const vector & rootHashes, } -void printClosure(const vector & rootHashes) +void printClosure(Strings::iterator first, Strings::iterator last) { set allHashes; - computeClosure(rootHashes, allHashes); + computeClosure(first, last, allHashes); for (set::iterator it = allHashes.begin(); it != allHashes.end(); it++) cout << *it << endl; @@ -672,10 +675,10 @@ string dotQuote(const string & s) } -void printGraph(vector rootHashes) +void printGraph(Strings::iterator first, Strings::iterator last) { set allHashes; - computeClosure(rootHashes, allHashes); + computeClosure(first, last, allHashes); cout << "digraph G {\n"; @@ -699,58 +702,8 @@ void printGraph(vector rootHashes) } -void run(vector args) +void run(Strings args) { - UsageError argcError("wrong number of arguments"); - string cmd; - - if (args.size() < 1) throw UsageError("no command specified"); - - cmd = args[0]; - args.erase(args.begin()); // O(n) - - if (cmd == "init") { - if (args.size() != 0) throw argcError; - initDB(); - } else if (cmd == "verify") { - if (args.size() != 0) throw argcError; - verifyDB(); - } else if (cmd == "getpkg") { - if (args.size() != 1) throw argcError; - string path = getPkg(args[0]); - cout << path << endl; - } else if (cmd == "delpkg") { - if (args.size() != 1) throw argcError; - delPkg(args[0]); - } else if (cmd == "run") { - if (args.size() < 1) throw argcError; - runPkg(args[0], vector(args.begin() + 1, args.end())); - } else if (cmd == "ensure") { - if (args.size() != 1) throw argcError; - ensurePkg(args[0]); - } else if (cmd == "export") { - if (args.size() < 1) throw argcError; - exportPkgs(args[0], vector(args.begin() + 1, args.end())); - } else if (cmd == "regprebuilt") { - if (args.size() != 2) throw argcError; - regPrebuilt(args[0], args[1]); - } else if (cmd == "regfile") { - if (args.size() != 1) throw argcError; - registerFile(args[0]); - } else if (cmd == "reginst") { - if (args.size() != 2) throw argcError; - registerInstalledPkg(args[0], args[1]); - } else if (cmd == "listinst") { - if (args.size() != 0) throw argcError; - listInstalledPkgs(); - } else if (cmd == "info") { - printInfo(args); - } else if (cmd == "closure") { - printClosure(args); - } else if (cmd == "graph") { - printGraph(args); - } else - throw UsageError("unknown command: " + string(cmd)); } @@ -810,7 +763,7 @@ Subcommands: } -void main2(int argc, char * * argv) +void run(Strings::iterator argCur, Strings::iterator argEnd) { umask(0022); @@ -821,8 +774,8 @@ void main2(int argc, char * * argv) pkgHome = getenv(PKGHOME_ENVVAR); /* Parse the global flags. */ - while (argc) { - string arg(*argv); + for ( ; argCur != argEnd; argCur++) { + string arg(*argCur); if (arg == "-h" || arg == "--help") { printUsage(); return; @@ -831,13 +784,57 @@ void main2(int argc, char * * argv) } else if (arg[0] == '-') { throw UsageError("invalid option `" + arg + "'"); } else break; - argv++, argc--; } - /* Put the remainder in a vector and pass it to run2(). */ - vector args; - while (argc--) args.push_back(*argv++); - run(args); + UsageError argcError("wrong number of arguments"); + + /* Parse the command. */ + if (argCur == argEnd) throw UsageError("no command specified"); + string cmd = *argCur++; + int argc = argEnd - argCur; + + if (cmd == "init") { + if (argc != 0) throw argcError; + initDB(); + } else if (cmd == "verify") { + if (argc != 0) throw argcError; + verifyDB(); + } else if (cmd == "getpkg") { + if (argc != 1) throw argcError; + string path = getPkg(*argCur); + cout << path << endl; + } else if (cmd == "delpkg") { + if (argc != 1) throw argcError; + delPkg(*argCur); + } else if (cmd == "run") { + if (argc < 1) throw argcError; + runPkg(*argCur, argCur + 1, argEnd); + } else if (cmd == "ensure") { + if (argc != 1) throw argcError; + ensurePkg(*argCur); + } else if (cmd == "export") { + if (argc < 1) throw argcError; + exportPkgs(*argCur, argCur + 1, argEnd); + } else if (cmd == "regprebuilt") { + if (argc != 2) throw argcError; + regPrebuilt(*argCur, argCur[1]); + } else if (cmd == "regfile") { + if (argc != 1) throw argcError; + registerFile(*argCur); + } else if (cmd == "reginst") { + if (argc != 2) throw argcError; + registerInstalledPkg(*argCur, argCur[1]); + } else if (cmd == "listinst") { + if (argc != 0) throw argcError; + listInstalledPkgs(); + } else if (cmd == "info") { + printInfo(argCur, argEnd); + } else if (cmd == "closure") { + printClosure(argCur, argEnd); + } else if (cmd == "graph") { + printGraph(argCur, argEnd); + } else + throw UsageError("unknown command: " + string(cmd)); } @@ -846,17 +843,19 @@ int main(int argc, char * * argv) ATerm bottomOfStack; ATinit(argc, argv, &bottomOfStack); - prog = *argv++, argc--; + /* Put the arguments in a vector. */ + Strings args; + while (argc--) args.push_back(*argv++); + Strings::iterator argCur = args.begin(), argEnd = args.end(); + + prog = *argCur++; try { try { - - main2(argc, argv); - + run(argCur, argEnd); } catch (DbException e) { throw Error(e.what()); } - } catch (UsageError & e) { cerr << "error: " << e.what() << endl << "Try `nix -h' for more information.\n";