From 7ee81f3887353cae2feecb98b482badf57a1fd5b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 25 Apr 2017 13:20:26 +0200 Subject: [PATCH] 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 --- src/nix/command.cc | 18 ++++++++++++++---- src/nix/command.hh | 39 +++++++++++++++++++-------------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/nix/command.cc b/src/nix/command.cc index 4034de96c..2809a9b4f 100644 --- a/src/nix/command.cc +++ b/src/nix/command.cc @@ -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) { + 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; diff --git a/src/nix/command.hh b/src/nix/command.hh index ee9485e5d..dc7b2637d 100644 --- a/src/nix/command.hh +++ b/src/nix/command.hh @@ -44,26 +44,6 @@ private: std::shared_ptr _store; }; -/* A command that operates on zero or more store paths. */ -struct StorePathsCommand : public StoreCommand -{ -private: - - Paths storePaths; - bool recursive = false; - bool all = false; - -public: - - StorePathsCommand(); - - using StoreCommand::run; - - virtual void run(ref store, Paths storePaths) = 0; - - void run(ref store) override; -}; - struct Installable { virtual std::string what() = 0; @@ -115,6 +95,25 @@ private: Value * vSourceExpr = 0; }; +/* A command that operates on zero or more store paths. */ +struct StorePathsCommand : public InstallablesCommand +{ +private: + + bool recursive = false; + bool all = false; + +public: + + StorePathsCommand(); + + using StoreCommand::run; + + virtual void run(ref store, Paths storePaths) = 0; + + void run(ref store) override; +}; + typedef std::map> Commands; /* An argument parser that supports multiple subcommands,