summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-11-20 00:27:25 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-11-20 00:27:25 +0100
commit9de6bc5d05027363f968c20e53e8c3d5aa34f8b4 (patch)
treebb299b4c0dd936adb842dd58ab1b230b02db94ed /src
parentbf3725da2a1e4e91fc34b5faeb55bb3c02f68674 (diff)
downloadguix-9de6bc5d05027363f968c20e53e8c3d5aa34f8b4.tar.gz
nix-store -r: Add ‘--ignore-unknown’ flag
This flag causes paths that do not have a known substitute to be
quietly ignored.  This is mostly useful for Charon, allowing it to
speed up deployment by letting a machine use substitutes for all
substitutable paths, instead of uploading them.  The latter is
frequently faster, e.g. if the target machine has a fast Internet
connection while the source machine is on a slow ADSL line.
Diffstat (limited to 'src')
-rw-r--r--src/libmain/shared.cc7
-rw-r--r--src/libmain/shared.hh4
-rw-r--r--src/nix-store/nix-store.cc34
3 files changed, 36 insertions, 9 deletions
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 9e5964acf8..2cf5b08df3 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -47,7 +47,14 @@ void printMissing(StoreAPI & store, const PathSet & paths)
     unsigned long long downloadSize, narSize;
     PathSet willBuild, willSubstitute, unknown;
     queryMissing(store, paths, willBuild, willSubstitute, unknown, downloadSize, narSize);
+    printMissing(willBuild, willSubstitute, unknown, downloadSize, narSize);
+}
+
 
+void printMissing(const PathSet & willBuild,
+    const PathSet & willSubstitute, const PathSet & unknown,
+    unsigned long long downloadSize, unsigned long long narSize)
+{
     if (!willBuild.empty()) {
         printMsg(lvlInfo, format("these derivations will be built:"));
         foreach (PathSet::iterator, i, willBuild)
diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh
index b054b0717f..ff89e86389 100644
--- a/src/libmain/shared.hh
+++ b/src/libmain/shared.hh
@@ -30,6 +30,10 @@ void printGCWarning();
 
 void printMissing(StoreAPI & store, const PathSet & paths);
 
+void printMissing(const PathSet & willBuild,
+    const PathSet & willSubstitute, const PathSet & unknown,
+    unsigned long long downloadSize, unsigned long long narSize);
+
 template<class N> N getIntArg(const string & opt,
     Strings::iterator & i, const Strings::iterator & end)
 {
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index ca49e231c0..e973beda9f 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -94,28 +94,44 @@ static void opRealise(Strings opFlags, Strings opArgs)
 {
     bool dryRun = false;
     bool repair = false;
+    bool ignoreUnknown = false;
 
     foreach (Strings::iterator, i, opFlags)
         if (*i == "--dry-run") dryRun = true;
         else if (*i == "--repair") repair = true;
+        else if (*i == "--ignore-unknown") ignoreUnknown = true;
         else throw UsageError(format("unknown flag `%1%'") % *i);
 
+    Paths paths;
     foreach (Strings::iterator, i, opArgs)
-        *i = followLinksToStorePath(*i);
+        paths.push_back(followLinksToStorePath(*i));
+
+    unsigned long long downloadSize, narSize;
+    PathSet willBuild, willSubstitute, unknown;
+    queryMissing(*store, PathSet(paths.begin(), paths.end()),
+        willBuild, willSubstitute, unknown, downloadSize, narSize);
+
+    if (ignoreUnknown) {
+        Paths paths2;
+        foreach (Paths::iterator, i, paths)
+            if (unknown.find(*i) == unknown.end()) paths2.push_back(*i);
+        paths = paths2;
+        unknown = PathSet();
+    }
 
-    printMissing(*store, PathSet(opArgs.begin(), opArgs.end()));
+    printMissing(willBuild, willSubstitute, unknown, downloadSize, narSize);
 
     if (dryRun) return;
 
     /* Build all paths at the same time to exploit parallelism. */
-    PathSet paths(opArgs.begin(), opArgs.end());
-    store->buildPaths(paths, repair);
+    store->buildPaths(PathSet(paths.begin(), paths.end()), repair);
 
-    foreach (Paths::iterator, i, opArgs) {
-        PathSet paths = realisePath(*i, false);
-        foreach (PathSet::iterator, j, paths)
-            cout << format("%1%\n") % *j;
-    }
+    if (!ignoreUnknown)
+        foreach (Paths::iterator, i, paths) {
+            PathSet paths = realisePath(*i, false);
+            foreach (PathSet::iterator, j, paths)
+                cout << format("%1%\n") % *j;
+        }
 }