If a .drv cannot be parsed, show its path
Otherwise you just get ‘expected string `Derive(['’ which isn't very helpful.
This commit is contained in:
		
							parent
							
								
									e0a947cde6
								
							
						
					
					
						commit
						dfa2f77d2e
					
				
					 7 changed files with 22 additions and 10 deletions
				
			
		|  | @ -67,7 +67,7 @@ static void prim_import(EvalState & state, const Pos & pos, Value * * args, Valu | |||
|     } | ||||
| 
 | ||||
|     if (isStorePath(path) && store->isValidPath(path) && isDerivation(path)) { | ||||
|         Derivation drv = parseDerivation(readFile(path)); | ||||
|         Derivation drv = readDerivation(path); | ||||
|         Value & w = *state.allocValue(); | ||||
|         state.mkAttrs(w, 1 + drv.outputs.size()); | ||||
|         mkString(*state.allocAttr(w, state.sDrvPath), path, singleton<PathSet>("=" + path)); | ||||
|  |  | |||
|  | @ -48,7 +48,7 @@ static Path parsePath(std::istream & str) | |||
| { | ||||
|     string s = parseString(str); | ||||
|     if (s.size() == 0 || s[0] != '/') | ||||
|         throw Error(format("bad path `%1%' in derivation") % s); | ||||
|         throw FormatError(format("bad path `%1%' in derivation") % s); | ||||
|     return s; | ||||
| } | ||||
| 
 | ||||
|  | @ -62,7 +62,7 @@ static StringSet parseStrings(std::istream & str, bool arePaths) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| Derivation parseDerivation(const string & s) | ||||
| static Derivation parseDerivation(const string & s) | ||||
| { | ||||
|     Derivation drv; | ||||
|     std::istringstream str(s); | ||||
|  | @ -112,6 +112,16 @@ Derivation parseDerivation(const string & s) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| Derivation readDerivation(const Path & drvPath) | ||||
| { | ||||
|     try { | ||||
|         return parseDerivation(readFile(drvPath)); | ||||
|     } catch (FormatError & e) { | ||||
|         throw Error(format("error parsing derivation `%1%': %2%") % drvPath % e.msg()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void printString(string & res, const string & s) | ||||
| { | ||||
|     res += '"'; | ||||
|  | @ -240,7 +250,7 @@ Hash hashDerivationModulo(StoreAPI & store, Derivation drv) | |||
|         Hash h = drvHashes[i->first]; | ||||
|         if (h.type == htUnknown) { | ||||
|             assert(store.isValidPath(i->first)); | ||||
|             Derivation drv2 = parseDerivation(readFile(i->first)); | ||||
|             Derivation drv2 = readDerivation(i->first); | ||||
|             h = hashDerivationModulo(store, drv2); | ||||
|             drvHashes[i->first] = h; | ||||
|         } | ||||
|  |  | |||
|  | @ -59,8 +59,8 @@ class StoreAPI; | |||
| Path writeDerivation(StoreAPI & store, | ||||
|     const Derivation & drv, const string & name, bool repair = false); | ||||
| 
 | ||||
| /* Parse a derivation. */ | ||||
| Derivation parseDerivation(const string & s); | ||||
| /* Read a derivation from a file. */ | ||||
| Derivation readDerivation(const Path & drvPath); | ||||
| 
 | ||||
| /* Print a derivation. */ | ||||
| string unparseDerivation(const Derivation & drv); | ||||
|  |  | |||
|  | @ -661,7 +661,7 @@ unsigned long long LocalStore::addValidPath(const ValidPathInfo & info, bool che | |||
|        efficiently query whether a path is an output of some | ||||
|        derivation. */ | ||||
|     if (isDerivation(info.path)) { | ||||
|         Derivation drv = parseDerivation(readFile(info.path)); | ||||
|         Derivation drv = readDerivation(info.path); | ||||
| 
 | ||||
|         /* Verify that the output paths in the derivation are correct
 | ||||
|            (i.e., follow the scheme for computing output paths from | ||||
|  | @ -1290,7 +1290,7 @@ void LocalStore::registerValidPaths(const ValidPathInfos & infos) | |||
|             if (isDerivation(i->path)) { | ||||
|                 // FIXME: inefficient; we already loaded the
 | ||||
|                 // derivation in addValidPath().
 | ||||
|                 Derivation drv = parseDerivation(readFile(i->path)); | ||||
|                 Derivation drv = readDerivation(i->path); | ||||
|                 checkDerivationOutputs(i->path, drv); | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ Derivation derivationFromPath(StoreAPI & store, const Path & drvPath) | |||
| { | ||||
|     assertStorePath(drvPath); | ||||
|     store.ensurePath(drvPath); | ||||
|     return parseDerivation(readFile(drvPath)); | ||||
|     return readDerivation(drvPath); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1041,7 +1041,7 @@ void expect(std::istream & str, const string & s) | |||
|     char s2[s.size()]; | ||||
|     str.read(s2, s.size()); | ||||
|     if (string(s2, s.size()) != s) | ||||
|         throw Error(format("expected string `%1%'") % s); | ||||
|         throw FormatError(format("expected string `%1%'") % s); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -326,6 +326,8 @@ bool hasSuffix(const string & s, const string & suffix); | |||
| /* Read string `s' from stream `str'. */ | ||||
| void expect(std::istream & str, const string & s); | ||||
| 
 | ||||
| MakeError(FormatError, Error) | ||||
| 
 | ||||
| 
 | ||||
| /* Read a C-style string from stream `str'. */ | ||||
| string parseString(std::istream & str); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue