diff --git a/doc/manual/nix-store.xml b/doc/manual/nix-store.xml
index 658a07211..357a23cf6 100644
--- a/doc/manual/nix-store.xml
+++ b/doc/manual/nix-store.xml
@@ -182,7 +182,14 @@ printed.)
Print on standard error a description of what
packages would be built or downloaded, without actually performing
- the operation
+ the operation.
+
+
+
+
+
+ If a non-derivation path does not have a
+ substitute, then silently ignore it.
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 9e5964acf..2cf5b08df 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 b054b0717..ff89e8638 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 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 ca49e231c..e973beda9 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));
- printMissing(*store, PathSet(opArgs.begin(), opArgs.end()));
+ 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(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;
+ }
}