diff options
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 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 ""; |