aboutsummaryrefslogtreecommitdiff
path: root/src/nix/run.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix/run.cc')
-rw-r--r--src/nix/run.cc23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/nix/run.cc b/src/nix/run.cc
index d04e106e0..65ced3475 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -12,6 +12,8 @@
#include <sys/mount.h>
#endif
+#include <queue>
+
using namespace nix;
std::string chrootHelperName = "__run_in_chroot";
@@ -121,10 +123,27 @@ struct CmdRun : InstallablesCommand
unsetenv(var.c_str());
}
+ std::unordered_set<Path> done;
+ std::queue<Path> todo;
+ for (auto & path : outPaths) todo.push(path);
+
auto unixPath = tokenizeString<Strings>(getEnv("PATH"), ":");
- for (auto & path : outPaths)
- if (accessor->stat(path + "/bin").type != FSAccessor::tMissing)
+
+ while (!todo.empty()) {
+ Path path = todo.front();
+ todo.pop();
+ if (!done.insert(path).second) continue;
+
+ if (true)
unixPath.push_front(path + "/bin");
+
+ auto propPath = path + "/nix-support/propagated-user-env-packages";
+ if (accessor->stat(propPath).type == FSAccessor::tRegular) {
+ for (auto & p : tokenizeString<Paths>(readFile(propPath)))
+ todo.push(p);
+ }
+ }
+
setenv("PATH", concatStringsSep(":", unixPath).c_str(), 1);
std::string cmd = *command.begin();