From c7101dac0bd2631e50846194fc841ef5ef77461f Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 6 Aug 2011 17:48:57 +0000 Subject: [PATCH] * 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 { }); then you can say $ nix-build -I nixpkgs=/home/eelco/src/stdenv-updates --- src/libexpr/eval.hh | 5 +++-- src/libexpr/parser.y | 26 ++++++++++++++++++++++---- tests/lang/eval-okay-search-path.exp | 2 +- tests/lang/eval-okay-search-path.flags | 2 +- tests/lang/eval-okay-search-path.nix | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 1583665bad..413234f2bf 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -213,8 +213,9 @@ private: std::map parseTrees; - Paths searchPath; - Paths::iterator searchPathInsertionPoint; + typedef list > SearchPath; + SearchPath searchPath; + SearchPath::iterator searchPathInsertionPoint; public: diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index cd63666dc5..e54f6fe0a7 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(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 ""; diff --git a/tests/lang/eval-okay-search-path.exp b/tests/lang/eval-okay-search-path.exp index d1cc1b4e52..d0bc8c5e86 100644 --- a/tests/lang/eval-okay-search-path.exp +++ b/tests/lang/eval-okay-search-path.exp @@ -1 +1 @@ -"abc" +"abcc" diff --git a/tests/lang/eval-okay-search-path.flags b/tests/lang/eval-okay-search-path.flags index d7feb29e12..a28e682100 100644 --- a/tests/lang/eval-okay-search-path.flags +++ b/tests/lang/eval-okay-search-path.flags @@ -1 +1 @@ --I lang/dir1 -I lang/dir2 \ No newline at end of file +-I lang/dir1 -I lang/dir2 -I dir5=lang/dir3 \ No newline at end of file diff --git a/tests/lang/eval-okay-search-path.nix b/tests/lang/eval-okay-search-path.nix index cc1df08f01..02920149b5 100644 --- a/tests/lang/eval-okay-search-path.nix +++ b/tests/lang/eval-okay-search-path.nix @@ -1,3 +1,3 @@ -import + import + import +import + import + import + import