about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/nix-store.xml9
-rw-r--r--src/libmain/shared.cc7
-rw-r--r--src/libmain/shared.hh4
-rw-r--r--src/nix-store/nix-store.cc34
4 files changed, 44 insertions, 10 deletions
diff --git a/doc/manual/nix-store.xml b/doc/manual/nix-store.xml
index 658a07211d75..357a23cf6bff 100644
--- a/doc/manual/nix-store.xml
+++ b/doc/manual/nix-store.xml
@@ -182,7 +182,14 @@ printed.)</para>
 
     <listitem><para>Print on standard error a description of what
     packages would be built or downloaded, without actually performing
-    the operation</para></listitem>
+    the operation.</para></listitem>
+
+  </varlistentry>
+
+  <varlistentry><term><option>--ignore-unknown</option></term>
+
+    <listitem><para>If a non-derivation path does not have a
+    substitute, then silently ignore it.</para></listitem>
 
   </varlistentry>
 
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 9e5964acf8bb..2cf5b08df32d 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 b054b0717f26..ff89e86389c2 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 ca49e231c0d5..e973beda9f0f 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;
+        }
 }