diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-11-19T23·27+0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-11-19T23·27+0100 |
commit | 9de6bc5d05027363f968c20e53e8c3d5aa34f8b4 (patch) | |
tree | bb299b4c0dd936adb842dd58ab1b230b02db94ed | |
parent | bf3725da2a1e4e91fc34b5faeb55bb3c02f68674 (diff) |
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.
-rw-r--r-- | doc/manual/nix-store.xml | 9 | ||||
-rw-r--r-- | src/libmain/shared.cc | 7 | ||||
-rw-r--r-- | src/libmain/shared.hh | 4 | ||||
-rw-r--r-- | src/nix-store/nix-store.cc | 34 |
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; + } } |