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) | void EvalState::addConstant(const string & name, Value & v) | ||||||
| { | { | ||||||
|     Value * v2 = allocValue(); |     Value * v2 = allocValue(); | ||||||
|  |  | ||||||
|  | @ -112,6 +112,15 @@ public: | ||||||
| 
 | 
 | ||||||
|     void checkURI(const std::string & uri); |     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. */ |     /* Parse a Nix expression from the specified file. */ | ||||||
|     Expr * parseExprFromFile(const Path & path); |     Expr * parseExprFromFile(const Path & path); | ||||||
|     Expr * parseExprFromFile(const Path & path, StaticEnv & staticEnv); |     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 % 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)) { |     if (state.store->isStorePath(path) && state.store->isValidPath(path) && isDerivation(path)) { | ||||||
|         Derivation drv = readDerivation(path); |         Derivation drv = readDerivation(realPath); | ||||||
|         Value & w = *state.allocValue(); |         Value & w = *state.allocValue(); | ||||||
|         state.mkAttrs(w, 3 + drv.outputs.size()); |         state.mkAttrs(w, 3 + drv.outputs.size()); | ||||||
|         Value * v2 = state.allocAttr(w, state.sDrvPath); |         Value * v2 = state.allocAttr(w, state.sDrvPath); | ||||||
|  | @ -114,7 +114,7 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args | ||||||
|     } else { |     } else { | ||||||
|         state.forceAttrs(*args[0]); |         state.forceAttrs(*args[0]); | ||||||
|         if (args[0]->attrs->empty()) |         if (args[0]->attrs->empty()) | ||||||
|             state.evalFile(path, v); |             state.evalFile(realPath, v); | ||||||
|         else { |         else { | ||||||
|             Env * env = &state.allocEnv(args[0]->attrs->size()); |             Env * env = &state.allocEnv(args[0]->attrs->size()); | ||||||
|             env->up = &state.baseEnv; |             env->up = &state.baseEnv; | ||||||
|  | @ -127,8 +127,8 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args | ||||||
|                 env->values[displ++] = attr.value; |                 env->values[displ++] = attr.value; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             printTalkative("evaluating file '%1%'", path); |             printTalkative("evaluating file '%1%'", realPath); | ||||||
|             Expr * e = state.parseExprFromFile(resolveExprPath(path), staticEnv); |             Expr * e = state.parseExprFromFile(resolveExprPath(realPath), staticEnv); | ||||||
| 
 | 
 | ||||||
|             e->eval(state, *env, v); |             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%") |         throw EvalError(format("cannot read '%1%', since path '%2%' is not valid, at %3%") | ||||||
|             % path % e.path % pos); |             % 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) |     if (s.find((char) 0) != string::npos) | ||||||
|         throw Error(format("the contents of the file '%1%' cannot be represented as a Nix string") % path); |         throw Error(format("the contents of the file '%1%' cannot be represented as a Nix string") % path); | ||||||
|     mkString(v, s.c_str()); |     mkString(v, s.c_str()); | ||||||
|  |  | ||||||
|  | @ -597,6 +597,11 @@ public: | ||||||
|        "nix-cache-info" file. Lower value means higher priority. */ |        "nix-cache-info" file. Lower value means higher priority. */ | ||||||
|     virtual int getPriority() { return 0; } |     virtual int getPriority() { return 0; } | ||||||
| 
 | 
 | ||||||
|  |     virtual Path toRealPath(const Path & storePath) | ||||||
|  |     { | ||||||
|  |         return storePath; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 
 | 
 | ||||||
|     Stats stats; |     Stats stats; | ||||||
|  | @ -639,9 +644,10 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual Path getRealStoreDir() { return storeDir; } |     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; |     std::shared_ptr<std::string> getBuildLog(const Path & path) override; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue