aboutsummaryrefslogtreecommitdiff
path: root/src/nix
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-04-25 13:20:26 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-04-25 13:20:26 +0200
commit7ee81f3887353cae2feecb98b482badf57a1fd5b (patch)
treec06ad44f0d0901c92e68b0284281691ee753c5fc /src/nix
parentc769841bc4ecb9dd3d8456931fec78e102c3832f (diff)
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
Diffstat (limited to 'src/nix')
-rw-r--r--src/nix/command.cc18
-rw-r--r--src/nix/command.hh39
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> 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> _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> store, Paths storePaths) = 0;
-
- void run(ref<Store> 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> store, Paths storePaths) = 0;
+
+ void run(ref<Store> store) override;
+};
+
typedef std::map<std::string, ref<Command>> Commands;
/* An argument parser that supports multiple subcommands,