about summary refs log tree commit diff
path: root/src/nix
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-04-25T14·19+0200
committerEelco Dolstra <edolstra@gmail.com>2017-04-25T14·19+0200
commitc30330df6f67c81986dfb124631bc756c8e58c0d (patch)
treeae398eedf65b06cba340292893afce6a041e7299 /src/nix
parentd48c973ece20875391bebde3c167d6e0cc1e666e (diff)
StorePathCommands: Build installables
So for instance "nix copy --to ... nixpkgs.hello" will build
nixpkgs.hello first. It's debatable whether this is a good idea. It
seems desirable for commands like "nix copy" but maybe not for
commands like "nix path-info".
Diffstat (limited to 'src/nix')
-rw-r--r--src/nix/command.cc12
-rw-r--r--src/nix/installables.cc11
-rw-r--r--src/nix/run.cc10
3 files changed, 13 insertions, 20 deletions
diff --git a/src/nix/command.cc b/src/nix/command.cc
index 2809a9b4f2..a45f2888bf 100644
--- a/src/nix/command.cc
+++ b/src/nix/command.cc
@@ -115,16 +115,8 @@ void StorePathsCommand::run(ref<Store> store)
     }
 
     else {
-        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);
-            }
-        }
+        for (auto & p : buildInstallables(store, false))
+            storePaths.push_back(p);
 
         if (recursive) {
             PathSet closure;
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index ff345c45d8..57580049f2 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -228,7 +228,16 @@ PathSet InstallablesCommand::buildInstallables(ref<Store> store, bool dryRun)
     if (!dryRun)
         store->buildPaths(buildables);
 
-    return buildables;
+    PathSet outPaths;
+    for (auto & path : buildables)
+        if (isDerivation(path)) {
+            Derivation drv = store->derivationFromPath(path);
+            for (auto & output : drv.outputs)
+                outPaths.insert(output.second.path);
+        } else
+            outPaths.insert(path);
+
+    return outPaths;
 }
 
 ref<EvalState> InstallablesCommand::getEvalState()
diff --git a/src/nix/run.cc b/src/nix/run.cc
index a0ce56134b..bcfa74eb5f 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -30,7 +30,7 @@ struct CmdRun : InstallablesCommand
 
     void run(ref<Store> store) override
     {
-        auto paths = buildInstallables(store, false);
+        auto outPaths = buildInstallables(store, false);
 
         auto store2 = store.dynamic_pointer_cast<LocalStore>();
 
@@ -89,14 +89,6 @@ struct CmdRun : InstallablesCommand
 #endif
         }
 
-        PathSet outPaths;
-        for (auto & path : paths)
-            if (isDerivation(path)) {
-                Derivation drv = store->derivationFromPath(path);
-                for (auto & output : drv.outputs)
-                    outPaths.insert(output.second.path);
-            } else
-                outPaths.insert(path);
 
         auto unixPath = tokenizeString<Strings>(getEnv("PATH"), ":");
         for (auto & path : outPaths)