parent
							
								
									435ccc7980
								
							
						
					
					
						commit
						74f75c8558
					
				
					 4 changed files with 33 additions and 8 deletions
				
			
		|  | @ -375,6 +375,16 @@ void EvalState::checkURI(const std::string & uri) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| Path EvalState::toRealPath(const Path & path, const PathSet & context) | ||||
| { | ||||
|     // FIXME: check whether 'path' is in 'context'.
 | ||||
|     return | ||||
|         !context.empty() && store->isInStore(path) | ||||
|         ? store->toRealPath(path) | ||||
|         : path; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| void EvalState::addConstant(const string & name, Value & v) | ||||
| { | ||||
|     Value * v2 = allocValue(); | ||||
|  |  | |||
|  | @ -112,6 +112,15 @@ public: | |||
| 
 | ||||
|     void checkURI(const std::string & uri); | ||||
| 
 | ||||
|     /* When using a diverted store and 'path' is in the Nix store, map
 | ||||
|        'path' to the diverted location (e.g. /nix/store/foo is mapped | ||||
|        to /home/alice/my-nix/nix/store/foo). However, this is only | ||||
|        done if the context is not empty, since otherwise we're | ||||
|        probably trying to read from the actual /nix/store. This is | ||||
|        intended to distinguish between import-from-derivation and | ||||
|        sources stored in the actual /nix/store. */ | ||||
|     Path toRealPath(const Path & path, const PathSet & context); | ||||
| 
 | ||||
|     /* Parse a Nix expression from the specified file. */ | ||||
|     Expr * parseExprFromFile(const Path & path); | ||||
|     Expr * parseExprFromFile(const Path & path, StaticEnv & staticEnv); | ||||
|  |  | |||
|  | @ -84,10 +84,10 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args | |||
|             % path % e.path % pos); | ||||
|     } | ||||
| 
 | ||||
|     path = state.checkSourcePath(path); | ||||
|     Path realPath = state.checkSourcePath(state.toRealPath(path, context)); | ||||
| 
 | ||||
|     if (state.store->isStorePath(path) && state.store->isValidPath(path) && isDerivation(path)) { | ||||
|         Derivation drv = readDerivation(path); | ||||
|         Derivation drv = readDerivation(realPath); | ||||
|         Value & w = *state.allocValue(); | ||||
|         state.mkAttrs(w, 3 + drv.outputs.size()); | ||||
|         Value * v2 = state.allocAttr(w, state.sDrvPath); | ||||
|  | @ -114,7 +114,7 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args | |||
|     } else { | ||||
|         state.forceAttrs(*args[0]); | ||||
|         if (args[0]->attrs->empty()) | ||||
|             state.evalFile(path, v); | ||||
|             state.evalFile(realPath, v); | ||||
|         else { | ||||
|             Env * env = &state.allocEnv(args[0]->attrs->size()); | ||||
|             env->up = &state.baseEnv; | ||||
|  | @ -127,8 +127,8 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args | |||
|                 env->values[displ++] = attr.value; | ||||
|             } | ||||
| 
 | ||||
|             printTalkative("evaluating file '%1%'", path); | ||||
|             Expr * e = state.parseExprFromFile(resolveExprPath(path), staticEnv); | ||||
|             printTalkative("evaluating file '%1%'", realPath); | ||||
|             Expr * e = state.parseExprFromFile(resolveExprPath(realPath), staticEnv); | ||||
| 
 | ||||
|             e->eval(state, *env, v); | ||||
|         } | ||||
|  | @ -863,7 +863,7 @@ static void prim_readFile(EvalState & state, const Pos & pos, Value * * args, Va | |||
|         throw EvalError(format("cannot read '%1%', since path '%2%' is not valid, at %3%") | ||||
|             % path % e.path % pos); | ||||
|     } | ||||
|     string s = readFile(state.checkSourcePath(path)); | ||||
|     string s = readFile(state.checkSourcePath(state.toRealPath(path, context))); | ||||
|     if (s.find((char) 0) != string::npos) | ||||
|         throw Error(format("the contents of the file '%1%' cannot be represented as a Nix string") % path); | ||||
|     mkString(v, s.c_str()); | ||||
|  |  | |||
|  | @ -597,6 +597,11 @@ public: | |||
|        "nix-cache-info" file. Lower value means higher priority. */ | ||||
|     virtual int getPriority() { return 0; } | ||||
| 
 | ||||
|     virtual Path toRealPath(const Path & storePath) | ||||
|     { | ||||
|         return storePath; | ||||
|     } | ||||
| 
 | ||||
| protected: | ||||
| 
 | ||||
|     Stats stats; | ||||
|  | @ -639,9 +644,10 @@ public: | |||
| 
 | ||||
|     virtual Path getRealStoreDir() { return storeDir; } | ||||
| 
 | ||||
|     Path toRealPath(const Path & storePath) | ||||
|     Path toRealPath(const Path & storePath) override | ||||
|     { | ||||
|         return getRealStoreDir() + "/" + baseNameOf(storePath); | ||||
|         assert(isInStore(storePath)); | ||||
|         return getRealStoreDir() + "/" + std::string(storePath, storeDir.size() + 1); | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<std::string> getBuildLog(const Path & path) override; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue