diff --git a/doc/manual/builtins.xml b/doc/manual/builtins.xml index b6c886199b..4c8e3163b1 100644 --- a/doc/manual/builtins.xml +++ b/doc/manual/builtins.xml @@ -441,6 +441,15 @@ in config.someSetting --> + builtins.readFile + path + + Return the contents of the file + path as a string. + + + + removeAttrs attrs list diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 2a96e25a84..bb9190579a 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -622,6 +622,17 @@ static Expr prim_dirOf(EvalState & state, const ATermVector & args) } +/* Return the contents of a file as a string. */ +static Expr prim_readFile(EvalState & state, const ATermVector & args) +{ + PathSet context; + Path path = coerceToPath(state, args[0], context); + if (!context.empty()) + throw EvalError(format("string `%1%' cannot refer to other paths") % path); + return makeStr(readFile(path)); +} + + /************************************************************* * Creating files *************************************************************/ @@ -968,6 +979,7 @@ void EvalState::addPrimOps() addPrimOp("__pathExists", 1, prim_pathExists); addPrimOp("baseNameOf", 1, prim_baseNameOf); addPrimOp("dirOf", 1, prim_dirOf); + addPrimOp("__readFile", 1, prim_readFile); // Creating files addPrimOp("__toXML", 1, prim_toXML); diff --git a/tests/lang/eval-okay-readfile.exp b/tests/lang/eval-okay-readfile.exp new file mode 100644 index 0000000000..979771c7a3 --- /dev/null +++ b/tests/lang/eval-okay-readfile.exp @@ -0,0 +1 @@ +Str("builtins.readFile ./eval-okay-readfile.nix\n",[]) diff --git a/tests/lang/eval-okay-readfile.nix b/tests/lang/eval-okay-readfile.nix new file mode 100644 index 0000000000..82f7cb1743 --- /dev/null +++ b/tests/lang/eval-okay-readfile.nix @@ -0,0 +1 @@ +builtins.readFile ./eval-okay-readfile.nix