From da7d8daa77c2cce5805947a012060b02be9e4a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Sat, 19 Feb 2022 16:59:52 +0100 Subject: Add shell completion for --override-flake Requires moving the MixEvalArgs class from libexpr to libcmd because that's where completeFlakeRef is. --- src/libcmd/common-eval-args.cc | 105 +++++++++++++++++++++++++++++++++++++++++ src/libcmd/common-eval-args.hh | 27 +++++++++++ 2 files changed, 132 insertions(+) create mode 100644 src/libcmd/common-eval-args.cc create mode 100644 src/libcmd/common-eval-args.hh (limited to 'src/libcmd') 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)); +} + +} diff --git a/src/libcmd/common-eval-args.hh b/src/libcmd/common-eval-args.hh new file mode 100644 index 000000000..03fa226aa --- /dev/null +++ b/src/libcmd/common-eval-args.hh @@ -0,0 +1,27 @@ +#pragma once + +#include "args.hh" + +namespace nix { + +class Store; +class EvalState; +class Bindings; + +struct MixEvalArgs : virtual Args +{ + MixEvalArgs(); + + Bindings * getAutoArgs(EvalState & state); + + Strings searchPath; + + std::optional evalStoreUrl; + +private: + std::map autoArgs; +}; + +Path lookupFileArg(EvalState & state, std::string_view s); + +} -- cgit v1.2.3