about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fstate.cc8
-rw-r--r--src/fstate.hh3
-rw-r--r--src/nix.cc18
3 files changed, 28 insertions, 1 deletions
diff --git a/src/fstate.cc b/src/fstate.cc
index 97532c162c1f..a597b6df6b77 100644
--- a/src/fstate.cc
+++ b/src/fstate.cc
@@ -179,6 +179,12 @@ Hash writeTerm(ATerm t, const string & suffix, string * p)
 }
 
 
+void registerSuccessor(const Hash & fsHash, const Hash & scHash)
+{
+    setDB(nixDB, dbSuccessors, fsHash, scHash);
+}
+
+
 FState storeSuccessor(FState fs, FState sc, StringSet & paths)
 {
     if (fs == sc) return sc;
@@ -186,7 +192,7 @@ FState storeSuccessor(FState fs, FState sc, StringSet & paths)
     string path;
     Hash fsHash = hashTerm(fs);
     Hash scHash = writeTerm(sc, "-s-" + (string) fsHash, &path);
-    setDB(nixDB, dbSuccessors, fsHash, scHash);
+    registerSuccessor(fsHash, scHash);
     paths.insert(path);
 
 #if 0
diff --git a/src/fstate.hh b/src/fstate.hh
index 8a873a5acd22..9a8955aeb95b 100644
--- a/src/fstate.hh
+++ b/src/fstate.hh
@@ -93,5 +93,8 @@ ATerm termFromHash(const Hash & hash, string * p = 0);
 /* Write an aterm to the Nix store directory, and return its hash. */
 Hash writeTerm(ATerm t, const string & suffix, string * p = 0);
 
+/* Register a successor. */
+void registerSuccessor(const Hash & fsHash, const Hash & scHash);
+
 
 #endif /* !__EVAL_H */
diff --git a/src/nix.cc b/src/nix.cc
index 53057328dd57..19c73165cdc8 100644
--- a/src/nix.cc
+++ b/src/nix.cc
@@ -26,6 +26,7 @@ static ArgType argType = atpUnknown;
      --add / -A: copy a path to the Nix store
      --query / -q: query information
 
+     --successor: register a successor expression
      --substitute: register a substitute expression
 
      --dump: dump a path as a Nix archive
@@ -183,6 +184,21 @@ static void opQuery(Strings opFlags, Strings opArgs)
 }
 
 
+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");
+    
+    for (Strings::iterator i = opArgs.begin();
+         i != opArgs.end(); )
+    {
+        Hash fsHash = parseHash(*i++);
+        Hash scHash = parseHash(*i++);
+        registerSuccessor(fsHash, scHash);
+    }
+}
+
+
 static void opSubstitute(Strings opFlags, Strings opArgs)
 {
     if (!opFlags.empty()) throw UsageError("unknown flag");
@@ -288,6 +304,8 @@ void run(Strings args)
             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")