diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2011-08-06T17·48+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2011-08-06T17·48+0000 |
commit | c7101dac0bd2631e50846194fc841ef5ef77461f (patch) | |
tree | 597a2058c70f6000ade9f2f48ef9e998f70ce762 /src | |
parent | 1578b2261d28003c8c1459041302e1f3c1921c43 (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')
-rw-r--r-- | src/libexpr/eval.hh | 5 | ||||
-rw-r--r-- | src/libexpr/parser.y | 26 |
2 files changed, 25 insertions, 6 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 1583665bad19..413234f2bf19 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 cd63666dc5f0..e54f6fe0a7b5 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 ""; |