diff options
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/lexer.l | 18 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 3 |
2 files changed, 16 insertions, 5 deletions
diff --git a/src/libexpr/lexer.l b/src/libexpr/lexer.l index f3660ab43723..5b1ff0350cd1 100644 --- a/src/libexpr/lexer.l +++ b/src/libexpr/lexer.l @@ -87,8 +87,8 @@ static Expr * unescapeStr(SymbolTable & symbols, const char * s) ID [a-zA-Z\_][a-zA-Z0-9\_\'\-]* INT [0-9]+ FLOAT (([1-9][0-9]*\.[0-9]*)|(0?\.[0-9]+))([Ee][+-]?[0-9]+)? -PATH [a-zA-Z0-9\.\_\-\+]*(\/[a-zA-Z0-9\.\_\-\+]+)+ -HPATH \~(\/[a-zA-Z0-9\.\_\-\+]+)+ +PATH [a-zA-Z0-9\.\_\-\+]*(\/[a-zA-Z0-9\.\_\-\+]+)+\/? +HPATH \~(\/[a-zA-Z0-9\.\_\-\+]+)+\/? SPATH \<[a-zA-Z0-9\.\_\-\+]+(\/[a-zA-Z0-9\.\_\-\+]+)*\> URI [a-zA-Z][a-zA-Z0-9\+\-\.]*\:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']+ @@ -182,14 +182,22 @@ or { return OR_KW; } <INITIAL,INSIDE_DOLLAR_CURLY>{ -{PATH} { yylval->path = strdup(yytext); return PATH; } -{HPATH} { yylval->path = strdup(yytext); return HPATH; } +{PATH} { if (yytext[yyleng-1] == '/') + throw ParseError("path ‘%s’ has a trailing slash", yytext); + yylval->path = strdup(yytext); + return PATH; + } +{HPATH} { if (yytext[yyleng-1] == '/') + throw ParseError("path ‘%s’ has a trailing slash", yytext); + yylval->path = strdup(yytext); + return HPATH; + } {SPATH} { yylval->path = strdup(yytext); return SPATH; } {URI} { yylval->uri = strdup(yytext); return URI; } [ \t\r\n]+ /* eat up whitespace */ \#[^\r\n]* /* single-line comments */ -\/\*([^*]|\*[^\/])*\*\/ /* long comments */ +\/\*([^*]|\*+[^*/])*\*+\/ /* long comments */ . return yytext[0]; diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 4398cc951da2..5be61c647496 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -779,6 +779,9 @@ static void prim_readFile(EvalState & state, const Pos & pos, Value * * args, Va string s = readFile(state.checkSourcePath(path)); if (s.find((char) 0) != string::npos) throw Error(format("the contents of the file ‘%1%’ cannot be represented as a Nix string") % path); + context = state.store->isInStore(path) ? + state.store->queryPathInfo(state.store->toStorePath(path))->references : + PathSet{}; mkString(v, s.c_str(), context); } |