about summary refs log tree commit diff
path: root/src/nix-store/nix-store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix-store/nix-store.cc')
-rw-r--r--src/nix-store/nix-store.cc30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index e3f27820fffd..68ad9026747f 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -839,10 +839,38 @@ static void opServe(Strings opFlags, Strings opArgs)
 {
     if (!opArgs.empty() || !opFlags.empty())
         throw UsageError("no arguments or flags expected");
+
     FdSource in(STDIN_FILENO);
     FdSink out(STDOUT_FILENO);
 
-    store->serve(in, out);
+    string cmd = readString(in);
+    if (cmd == "query") {
+        for (cmd = readString(in); !cmd.empty(); cmd = readString(in)) {
+            PathSet paths = readStrings<PathSet>(in);
+            if (cmd == "have") {
+                writeStrings(store->queryValidPaths(paths), out);
+            } else if (cmd == "info") {
+                // !!! Maybe we want a queryPathInfos?
+                foreach (PathSet::iterator, i, paths) {
+                    if (!store->isValidPath(*i))
+                        continue;
+                    ValidPathInfo info = store->queryPathInfo(*i);
+                    writeString(info.path, out);
+                    writeString(info.deriver, out);
+                    writeStrings(info.references, out);
+                    // !!! Maybe we want compression?
+                    writeLongLong(info.narSize, out); // downloadSize
+                    writeLongLong(info.narSize, out);
+                }
+                writeString("", out);
+            } else
+                throw Error(format("Unknown serve query `%1%'") % cmd);
+            out.flush();
+        }
+    } else if (cmd == "substitute")
+        dumpPath(readString(in), out);
+    else
+        throw Error(format("Unknown serve command `%1%'") % cmd);
 }