diff --git a/src/libexpr/common-opts.cc b/src/libexpr/common-opts.cc index 9b3421f6c4..14a75f7b6f 100644 --- a/src/libexpr/common-opts.cc +++ b/src/libexpr/common-opts.cc @@ -35,11 +35,11 @@ bool parseOptionArg(const string & arg, Strings::iterator & i, bool parseSearchPathArg(const string & arg, Strings::iterator & i, - const Strings::iterator & argsEnd, EvalState & state) + const Strings::iterator & argsEnd, Strings & searchPath) { if (arg != "-I") return false; if (i == argsEnd) throw UsageError(format("`%1%' requires an argument") % arg);; - state.addToSearchPath(*i++, true); + searchPath.push_back(*i++); return true; } diff --git a/src/libexpr/common-opts.hh b/src/libexpr/common-opts.hh index e2e3fe7717..759358950f 100644 --- a/src/libexpr/common-opts.hh +++ b/src/libexpr/common-opts.hh @@ -8,9 +8,9 @@ namespace nix { bool parseOptionArg(const string & arg, Strings::iterator & i, const Strings::iterator & argsEnd, EvalState & state, Bindings & autoArgs); - + bool parseSearchPathArg(const string & arg, Strings::iterator & i, - const Strings::iterator & argsEnd, EvalState & state); + const Strings::iterator & argsEnd, Strings & searchPath); Path lookupFileArg(EvalState & state, string s); diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 81abe5b618..b6b69c2bdb 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -153,7 +153,7 @@ static Symbol getName(const AttrName & name, EvalState & state, Env & env) } -EvalState::EvalState() +EvalState::EvalState(const Strings & _searchPath) : sWith(symbols.create("")) , sOutPath(symbols.create("outPath")) , sDrvPath(symbols.create("drvPath")) @@ -219,11 +219,10 @@ EvalState::EvalState() #endif /* Initialise the Nix expression search path. */ - searchPathInsertionPoint = searchPath.end(); Strings paths = tokenizeString(getEnv("NIX_PATH", ""), ":"); - foreach (Strings::iterator, i, paths) addToSearchPath(*i); + for (auto & i : _searchPath) addToSearchPath(i); + for (auto & i : paths) addToSearchPath(i); addToSearchPath("nix=" + settings.nixDataDir + "/nix/corepkgs"); - searchPathInsertionPoint = searchPath.begin(); createBaseEnv(); } diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index ad4c6a4b5f..200ec75e0f 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -113,11 +113,10 @@ private: typedef list > SearchPath; SearchPath searchPath; - SearchPath::iterator searchPathInsertionPoint; public: - EvalState(); + EvalState(const Strings & _searchPath); ~EvalState(); void addToSearchPath(const string & s, bool warn = false); diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 06d6d643f6..698e8ce3ff 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -629,7 +629,7 @@ void EvalState::addToSearchPath(const string & s, bool warn) path = absPath(path); if (pathExists(path)) { debug(format("adding path `%1%' to the search path") % path); - searchPath.insert(searchPathInsertionPoint, std::pair(prefix, path)); + searchPath.push_back(std::pair(prefix, path)); } else if (warn) printMsg(lvlError, format("warning: Nix search path entry `%1%' does not exist, ignoring") % path); } diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index 3db84ff5c7..2d38f2aea7 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -58,6 +58,7 @@ struct Globals bool removeAll; string forceName; bool prebuiltOnly; + Globals(const Strings & searchPath) : state(searchPath) { } }; @@ -1351,7 +1352,17 @@ void run(Strings args) Strings opFlags, opArgs, remaining; Operation op = 0; - Globals globals; + /* FIXME: hack. */ + Strings searchPath; + Strings args2; + for (Strings::iterator i = args.begin(); i != args.end(); ) { + string arg = *i++; + if (!parseSearchPathArg(arg, i, args.end(), searchPath)) + args2.push_back(arg); + } + args = args2; + + Globals globals(searchPath); globals.instSource.type = srcUnknown; globals.instSource.nixExprPath = getDefNixExprPath(); @@ -1372,8 +1383,6 @@ void run(Strings args) else if (parseOptionArg(arg, i, args.end(), globals.state, globals.instSource.autoArgs)) ; - else if (parseSearchPathArg(arg, i, args.end(), globals.state)) - ; else if (arg == "--force-name") // undocumented flag for nix-install-package globals.forceName = needArg(i, args, arg); else if (arg == "--uninstall" || arg == "-e") diff --git a/src/nix-instantiate/nix-instantiate.cc b/src/nix-instantiate/nix-instantiate.cc index 7cdabcb924..cdd74523ca 100644 --- a/src/nix-instantiate/nix-instantiate.cc +++ b/src/nix-instantiate/nix-instantiate.cc @@ -91,7 +91,17 @@ void processExpr(EvalState & state, const Strings & attrPaths, void run(Strings args) { - EvalState state; + /* FIXME: hack. */ + Strings searchPath; + Strings args2; + for (Strings::iterator i = args.begin(); i != args.end(); ) { + string arg = *i++; + if (!parseSearchPathArg(arg, i, args.end(), searchPath)) + args2.push_back(arg); + } + args = args2; + + EvalState state(searchPath); Strings files; bool readStdin = false; bool fromArgs = false; @@ -127,8 +137,6 @@ void run(Strings args) } else if (parseOptionArg(arg, i, args.end(), state, autoArgs)) ; - else if (parseSearchPathArg(arg, i, args.end(), state)) - ; else if (arg == "--add-root") { if (i == args.end()) throw UsageError("`--add-root' requires an argument"); diff --git a/tests/lang/eval-okay-search-path.nix b/tests/lang/eval-okay-search-path.nix index c9ea768a41..501d5f3f48 100644 --- a/tests/lang/eval-okay-search-path.nix +++ b/tests/lang/eval-okay-search-path.nix @@ -3,7 +3,7 @@ with builtins; assert pathExists ; -assert length nixPath == 3; +assert length nixPath == 6; assert length (filter (x: x.prefix == "nix") nixPath) == 1; assert length (filter (x: baseNameOf x.path == "dir4") nixPath) == 1;