diff options
author | pennae <82953136+pennae@users.noreply.github.com> | 2022-04-25 14:02:37 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-25 14:02:37 +0000 |
commit | d6d6bbd9ef1eed6443165866cd7bd27faa9586a1 (patch) | |
tree | 38e55dcce53445088725a86c14c903106879e0b6 /src/libcmd/common-eval-args.cc | |
parent | f2603e9c92947a0e0c01fc34e754270f46c63790 (diff) | |
parent | 7f814d6d9af9d78f922d59115a94078f807676a8 (diff) |
Merge branch 'master' into lto
Diffstat (limited to 'src/libcmd/common-eval-args.cc')
-rw-r--r-- | src/libcmd/common-eval-args.cc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/libcmd/common-eval-args.cc b/src/libcmd/common-eval-args.cc new file mode 100644 index 000000000..5b6e82388 --- /dev/null +++ b/src/libcmd/common-eval-args.cc @@ -0,0 +1,105 @@ +#include "common-eval-args.hh" +#include "shared.hh" +#include "filetransfer.hh" +#include "util.hh" +#include "eval.hh" +#include "fetchers.hh" +#include "registry.hh" +#include "flake/flakeref.hh" +#include "store-api.hh" +#include "command.hh" + +namespace nix { + +MixEvalArgs::MixEvalArgs() +{ + auto category = "Common evaluation options"; + + addFlag({ + .longName = "arg", + .description = "Pass the value *expr* as the argument *name* to Nix functions.", + .category = category, + .labels = {"name", "expr"}, + .handler = {[&](std::string name, std::string expr) { autoArgs[name] = 'E' + expr; }} + }); + + addFlag({ + .longName = "argstr", + .description = "Pass the string *string* as the argument *name* to Nix functions.", + .category = category, + .labels = {"name", "string"}, + .handler = {[&](std::string name, std::string s) { autoArgs[name] = 'S' + s; }}, + }); + + addFlag({ + .longName = "include", + .shortName = 'I', + .description = "Add *path* to the list of locations used to look up `<...>` file names.", + .category = category, + .labels = {"path"}, + .handler = {[&](std::string s) { searchPath.push_back(s); }} + }); + + addFlag({ + .longName = "impure", + .description = "Allow access to mutable paths and repositories.", + .category = category, + .handler = {[&]() { + evalSettings.pureEval = false; + }}, + }); + + addFlag({ + .longName = "override-flake", + .description = "Override the flake registries, redirecting *original-ref* to *resolved-ref*.", + .category = category, + .labels = {"original-ref", "resolved-ref"}, + .handler = {[&](std::string _from, std::string _to) { + auto from = parseFlakeRef(_from, absPath(".")); + auto to = parseFlakeRef(_to, absPath(".")); + fetchers::Attrs extraAttrs; + if (to.subdir != "") extraAttrs["dir"] = to.subdir; + fetchers::overrideRegistry(from.input, to.input, extraAttrs); + }}, + .completer = {[&](size_t, std::string_view prefix) { + completeFlakeRef(openStore(), prefix); + }} + }); + + addFlag({ + .longName = "eval-store", + .description = "The Nix store to use for evaluations.", + .category = category, + .labels = {"store-url"}, + .handler = {&evalStoreUrl}, + }); +} + +Bindings * MixEvalArgs::getAutoArgs(EvalState & state) +{ + auto res = state.buildBindings(autoArgs.size()); + for (auto & i : autoArgs) { + auto v = state.allocValue(); + if (i.second[0] == 'E') + state.mkThunk_(*v, state.parseExprFromString(i.second.substr(1), absPath("."))); + else + v->mkString(((std::string_view) i.second).substr(1)); + res.insert(state.symbols.create(i.first), v); + } + return res.finish(); +} + +Path lookupFileArg(EvalState & state, std::string_view s) +{ + if (isUri(s)) { + return state.store->toRealPath( + fetchers::downloadTarball( + state.store, resolveUri(s), "source", false).first.storePath); + } else if (s.size() > 2 && s.at(0) == '<' && s.at(s.size() - 1) == '>') { + Path p(s.substr(1, s.size() - 2)); + return state.findFile(p); + } else + return absPath(std::string(s)); +} + +} |