aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2011-08-06 17:48:57 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2011-08-06 17:48:57 +0000
commitc7101dac0bd2631e50846194fc841ef5ef77461f (patch)
tree597a2058c70f6000ade9f2f48ef9e998f70ce762 /src/libexpr
parent1578b2261d28003c8c1459041302e1f3c1921c43 (diff)
* Allow redirections in search path entries. E.g. if you have a
directory /home/eelco/src/stdenv-updates that you want to use as the directory for import such as with (import <nixpkgs> { }); then you can say $ nix-build -I nixpkgs=/home/eelco/src/stdenv-updates
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.hh5
-rw-r--r--src/libexpr/parser.y26
2 files changed, 25 insertions, 6 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 1583665ba..413234f2b 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -213,8 +213,9 @@ private:
std::map<Path, Expr *> parseTrees;
- Paths searchPath;
- Paths::iterator searchPathInsertionPoint;
+ typedef list<std::pair<string, Path> > SearchPath;
+ SearchPath searchPath;
+ SearchPath::iterator searchPathInsertionPoint;
public:
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index cd63666dc..e54f6fe0a 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -530,18 +530,36 @@ Expr * EvalState::parseExprFromString(const string & s, const Path & basePath)
void EvalState::addToSearchPath(const string & s)
{
- Path path = absPath(s);
+ size_t pos = s.find('=');
+ string prefix;
+ Path path;
+ if (pos == string::npos) {
+ path = s;
+ } else {
+ prefix = string(s, 0, pos);
+ path = string(s, pos + 1);
+ }
+
+ path = absPath(path);
if (pathExists(path)) {
debug(format("adding path `%1%' to the search path") % path);
- searchPath.insert(searchPathInsertionPoint, path);
+ searchPath.insert(searchPathInsertionPoint, std::pair<string, Path>(prefix, path));
}
}
Path EvalState::findFile(const string & path)
{
- foreach (Paths::iterator, i, searchPath) {
- Path res = *i + "/" + path;
+ foreach (SearchPath::iterator, i, searchPath) {
+ Path res;
+ if (i->first.empty())
+ res = i->second + "/" + path;
+ else {
+ if (path.compare(0, i->first.size(), i->first) != 0 ||
+ (path.size() > i->first.size() && path[i->first.size()] != '/'))
+ continue;
+ res = i->second + "/" + string(path, i->first.size());
+ }
if (pathExists(res)) return canonPath(res);
}
return "";