Make StorePathsCommand a subclass of InstallablesCommand

This allows commands like 'nix path-info', 'nix copy', 'nix verify'
etc. to work on arbitrary installables. E.g. to copy geeqie to a
binary cache:

  $ nix copy -r --to file:///tmp/binary-cache nixpkgs.geeqie

Or to get the closure size of thunderbird:

  $ nix path-info -S nixpkgs.thunderbird
This commit is contained in:
Eelco Dolstra 2017-04-25 13:20:26 +02:00
parent c769841bc4
commit 7ee81f3887
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
2 changed files with 33 additions and 24 deletions

View file

@ -1,5 +1,6 @@
#include "command.hh"
#include "store-api.hh"
#include "derivations.hh"
namespace nix {
@ -98,23 +99,32 @@ void StoreCommand::run()
StorePathsCommand::StorePathsCommand()
{
expectArgs("paths", &storePaths);
mkFlag('r', "recursive", "apply operation to closure of the specified paths", &recursive);
mkFlag(0, "all", "apply operation to the entire store", &all);
}
void StorePathsCommand::run(ref<Store> store)
{
Paths storePaths;
if (all) {
if (storePaths.size())
if (installables.size())
throw UsageError("--all does not expect arguments");
for (auto & p : store->queryAllValidPaths())
storePaths.push_back(p);
}
else {
for (auto & storePath : storePaths)
storePath = store->followLinksToStorePath(storePath);
for (auto & i : installables) {
for (auto & path : i->toBuildable()) {
if (isDerivation(path)) {
Derivation drv = store->derivationFromPath(path);
for (auto & output : drv.outputs)
storePaths.push_back(output.second.path);
} else
storePaths.push_back(path);
}
}
if (recursive) {
PathSet closure;