From 291b10c607e3f9d19acee692ac2488056e53eeee Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 1 Mar 2024 14:35:27 +0100 Subject: [PATCH] Add --arg-from-file for reading a string from a file --- src/libcmd/common-eval-args.cc | 12 ++++++++++++ src/libcmd/common-eval-args.hh | 3 ++- tests/functional/eval.sh | 8 ++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/libcmd/common-eval-args.cc b/src/libcmd/common-eval-args.cc index ed2c126a4..89df67406 100644 --- a/src/libcmd/common-eval-args.cc +++ b/src/libcmd/common-eval-args.cc @@ -31,6 +31,15 @@ MixEvalArgs::MixEvalArgs() .handler = {[&](std::string name, std::string s) { autoArgs.insert_or_assign(name, AutoArg{AutoArgString(s)}); }}, }); + addFlag({ + .longName = "arg-from-file", + .description = "Pass the contents of file *path* as the argument *name* to Nix functions.", + .category = category, + .labels = {"name", "path"}, + .handler = {[&](std::string name, std::string path) { autoArgs.insert_or_assign(name, AutoArg{AutoArgFile(path)}); }}, + .completer = completePath + }); + addFlag({ .longName = "include", .shortName = 'I', @@ -162,6 +171,9 @@ Bindings * MixEvalArgs::getAutoArgs(EvalState & state) }, [&](const AutoArgString & arg) { v->mkString(arg.s); + }, + [&](const AutoArgFile & arg) { + v->mkString(readFile(arg.path)); } }, arg); res.insert(state.symbols.create(name), v); diff --git a/src/libcmd/common-eval-args.hh b/src/libcmd/common-eval-args.hh index 2e2f18385..9f4da4231 100644 --- a/src/libcmd/common-eval-args.hh +++ b/src/libcmd/common-eval-args.hh @@ -28,8 +28,9 @@ struct MixEvalArgs : virtual Args, virtual MixRepair private: struct AutoArgExpr { std::string expr; }; struct AutoArgString { std::string s; }; + struct AutoArgFile { std::filesystem::path path; }; - using AutoArg = std::variant; + using AutoArg = std::variant; std::map autoArgs; }; diff --git a/tests/functional/eval.sh b/tests/functional/eval.sh index b81bb1e2c..321593670 100644 --- a/tests/functional/eval.sh +++ b/tests/functional/eval.sh @@ -41,3 +41,11 @@ mkdir -p $TEST_ROOT/xyzzy $TEST_ROOT/foo ln -sfn ../xyzzy $TEST_ROOT/foo/bar printf 123 > $TEST_ROOT/xyzzy/default.nix [[ $(nix eval --impure --expr "import $TEST_ROOT/foo/bar") = 123 ]] + +# Test --arg-from-file. +[[ "$(nix eval --raw --arg-from-file foo config.nix --expr '{ foo }: { inherit foo; }' foo)" = "$(cat config.nix)" ]] + +# Check that special(-ish) files are drained. +if [[ -e /proc/version ]]; then + [[ "$(nix eval --raw --arg-from-file foo /proc/version --expr '{ foo }: { inherit foo; }' foo)" = "$(cat /proc/version)" ]] +fi