about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-05-26T14·50+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-05-26T14·52+0200
commit39d72640c2459dc2fa689bfe8b756ee193f7b98a (patch)
tree2d889185bf06c0446d9b3774054f1264fbf443ff
parenta8edf185a9e1677088c8c30acc9d281c8350bca7 (diff)
Ensure that -I flags get included in nixPath
Also fixes #261.
-rw-r--r--src/libexpr/common-opts.cc4
-rw-r--r--src/libexpr/common-opts.hh4
-rw-r--r--src/libexpr/eval.cc7
-rw-r--r--src/libexpr/eval.hh3
-rw-r--r--src/libexpr/parser.y2
-rw-r--r--src/nix-env/nix-env.cc15
-rw-r--r--src/nix-instantiate/nix-instantiate.cc14
-rw-r--r--tests/lang/eval-okay-search-path.nix2
8 files changed, 33 insertions, 18 deletions
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("<with>"))
     , 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<Strings>(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<std::pair<string, Path> > 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<string, Path>(prefix, path));
+        searchPath.push_back(std::pair<string, Path>(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 <nix/buildenv.nix>;
 
-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;