aboutsummaryrefslogtreecommitdiff
path: root/src/nix-store/main.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-11-18 12:06:07 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-11-18 12:06:07 +0000
commitdfc9c64ead7f24d51ed1a232e4b3ecafa8384f2e (patch)
treeab0d5b381eb01bec46a66174b3b09b60ea439bb7 /src/nix-store/main.cc
parentb1117ef29d35822647bda32f8cd3887f4f6eaede (diff)
* "Fix expression" -> "Nix expression".
* More refactoring.
Diffstat (limited to 'src/nix-store/main.cc')
-rw-r--r--src/nix-store/main.cc303
1 files changed, 303 insertions, 0 deletions
diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc
new file mode 100644
index 000000000..0d87db9df
--- /dev/null
+++ b/src/nix-store/main.cc
@@ -0,0 +1,303 @@
+#include <iostream>
+#include <sstream>
+
+#include "globals.hh"
+#include "normalise.hh"
+#include "archive.hh"
+#include "shared.hh"
+#include "dotgraph.hh"
+#include "help.txt.hh"
+
+
+typedef void (* Operation) (Strings opFlags, Strings opArgs);
+
+
+static void printHelp()
+{
+ cout << string((char *) helpText, sizeof helpText);
+ exit(0);
+}
+
+
+
+static Path checkPath(const Path & arg)
+{
+ return arg; /* !!! check that arg is in the store */
+}
+
+
+/* Realise paths from the given store expressions. */
+static void opRealise(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); i++)
+ {
+ Path nfPath = normaliseStoreExpr(checkPath(*i));
+ realiseClosure(nfPath);
+ cout << format("%1%\n") % (string) nfPath;
+ }
+}
+
+
+/* Delete a path in the Nix store directory. */
+static void opDelete(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+
+ for (Strings::iterator it = opArgs.begin();
+ it != opArgs.end(); it++)
+ deleteFromStore(checkPath(*it));
+}
+
+
+/* Add paths to the Nix values directory and print the hashes of those
+ paths. */
+static void opAdd(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+
+ for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); i++)
+ cout << format("%1%\n") % addToStore(*i);
+}
+
+
+Path maybeNormalise(const Path & ne, bool normalise)
+{
+ return normalise ? normaliseStoreExpr(ne) : ne;
+}
+
+
+/* Perform various sorts of queries. */
+static void opQuery(Strings opFlags, Strings opArgs)
+{
+ enum { qList, qRequisites, qPredecessors, qGraph
+ } query = qList;
+ bool normalise = false;
+ bool includeExprs = true;
+ bool includeSuccessors = false;
+
+ for (Strings::iterator i = opFlags.begin();
+ i != opFlags.end(); i++)
+ if (*i == "--list" || *i == "-l") query = qList;
+ else if (*i == "--requisites" || *i == "-R") query = qRequisites;
+ else if (*i == "--predecessors") query = qPredecessors;
+ else if (*i == "--graph") query = qGraph;
+ else if (*i == "--normalise" || *i == "-n") normalise = true;
+ else if (*i == "--exclude-exprs") includeExprs = false;
+ else if (*i == "--include-successors") includeSuccessors = true;
+ else throw UsageError(format("unknown flag `%1%'") % *i);
+
+ switch (query) {
+
+ case qList: {
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); i++)
+ {
+ StringSet paths = storeExprRoots(
+ maybeNormalise(checkPath(*i), normalise));
+ for (StringSet::iterator j = paths.begin();
+ j != paths.end(); j++)
+ cout << format("%s\n") % *j;
+ }
+ break;
+ }
+
+ case qRequisites: {
+ StringSet paths;
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); i++)
+ {
+ StringSet paths2 = storeExprRequisites(
+ maybeNormalise(checkPath(*i), normalise),
+ includeExprs, includeSuccessors);
+ paths.insert(paths2.begin(), paths2.end());
+ }
+ for (StringSet::iterator i = paths.begin();
+ i != paths.end(); i++)
+ cout << format("%s\n") % *i;
+ break;
+ }
+
+ case qPredecessors: {
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); i++)
+ {
+ Paths preds = queryPredecessors(checkPath(*i));
+ for (Paths::iterator j = preds.begin();
+ j != preds.end(); j++)
+ cout << format("%s\n") % *j;
+ }
+ break;
+ }
+
+ case qGraph: {
+ PathSet roots;
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); i++)
+ roots.insert(maybeNormalise(checkPath(*i), normalise));
+ printDotGraph(roots);
+ break;
+ }
+
+ default:
+ abort();
+ }
+}
+
+
+static void opSuccessor(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+ if (opArgs.size() % 2) throw UsageError("expecting even number of arguments");
+
+ Transaction txn;
+ createStoreTransaction(txn);
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); )
+ {
+ Path path1 = checkPath(*i++);
+ Path path2 = checkPath(*i++);
+ registerSuccessor(txn, path1, path2);
+ }
+ txn.commit();
+}
+
+
+static void opSubstitute(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+ if (opArgs.size() % 2) throw UsageError("expecting even number of arguments");
+
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); )
+ {
+ Path src = checkPath(*i++);
+ Path sub = checkPath(*i++);
+ registerSubstitute(src, sub);
+ }
+}
+
+
+/* A sink that writes dump output to stdout. */
+struct StdoutSink : DumpSink
+{
+ virtual void operator ()
+ (const unsigned char * data, unsigned int len)
+ {
+ writeFull(STDOUT_FILENO, data, len);
+ }
+};
+
+
+/* Dump a path as a Nix archive. The archive is written to standard
+ output. */
+static void opDump(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+ if (opArgs.size() != 1) throw UsageError("only one argument allowed");
+
+ StdoutSink sink;
+ string path = *opArgs.begin();
+ dumpPath(path, sink);
+}
+
+
+/* A source that read restore intput to stdin. */
+struct StdinSource : RestoreSource
+{
+ virtual void operator () (unsigned char * data, unsigned int len)
+ {
+ readFull(STDIN_FILENO, data, len);
+ }
+};
+
+
+/* Restore a value from a Nix archive. The archive is written to
+ standard input. */
+static void opRestore(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+ if (opArgs.size() != 1) throw UsageError("only one argument allowed");
+
+ StdinSource source;
+ restorePath(*opArgs.begin(), source);
+}
+
+
+/* Initialise the Nix databases. */
+static void opInit(Strings opFlags, Strings opArgs)
+{
+ if (!opFlags.empty()) throw UsageError("unknown flag");
+ if (!opArgs.empty())
+ throw UsageError("--init does not have arguments");
+ initDB();
+}
+
+
+/* Verify the consistency of the Nix environment. */
+static void opVerify(Strings opFlags, Strings opArgs)
+{
+ verifyStore();
+}
+
+
+/* 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)
+{
+ Strings opFlags, opArgs;
+ Operation op = 0;
+
+ for (Strings::iterator it = args.begin(); it != args.end(); )
+ {
+ string arg = *it++;
+
+ Operation oldOp = op;
+
+ if (arg == "--realise" || arg == "-r")
+ op = opRealise;
+ else if (arg == "--delete" || arg == "-d")
+ op = opDelete;
+ else if (arg == "--add" || arg == "-A")
+ op = opAdd;
+ else if (arg == "--query" || arg == "-q")
+ op = opQuery;
+ else if (arg == "--successor")
+ op = opSuccessor;
+ else if (arg == "--substitute")
+ op = opSubstitute;
+ else if (arg == "--dump")
+ op = opDump;
+ else if (arg == "--restore")
+ op = opRestore;
+ else if (arg == "--init")
+ op = opInit;
+ else if (arg == "--verify")
+ op = opVerify;
+ else if (arg == "--verbose" || arg == "-v")
+ verbosity = (Verbosity) ((int) verbosity + 1);
+ else if (arg == "--keep-failed" || arg == "-K")
+ keepFailed = true;
+ else if (arg == "--help")
+ printHelp();
+ else if (arg[0] == '-')
+ opFlags.push_back(arg);
+ else
+ opArgs.push_back(arg);
+
+ if (oldOp && oldOp != op)
+ throw UsageError("only one operation may be specified");
+ }
+
+ if (!op) throw UsageError("no operation specified");
+
+ openDB();
+
+ op(opFlags, opArgs);
+}
+
+
+string programId = "nix-store";