diff options
-rw-r--r-- | release.nix | 3 | ||||
-rw-r--r-- | shell.nix | 1 | ||||
-rw-r--r-- | src/nix/local.mk | 2 | ||||
-rw-r--r-- | src/nix/repl.cc | 66 |
4 files changed, 39 insertions, 33 deletions
diff --git a/release.nix b/release.nix index 294af54cd61b..534c218c1123 100644 --- a/release.nix +++ b/release.nix @@ -73,7 +73,8 @@ let buildInputs = [ curl bzip2 xz brotli - openssl pkgconfig sqlite boehmgc + openssl pkgconfig sqlite boehmgc readline + ] ++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium ++ lib.optional (stdenv.isLinux || stdenv.isDarwin) diff --git a/shell.nix b/shell.nix index 425eb0a191f2..3c57826d1a1e 100644 --- a/shell.nix +++ b/shell.nix @@ -16,6 +16,7 @@ with import <nixpkgs> {}; customMemoryManagement = false; }) autoreconfHook + readline ]; configureFlags = diff --git a/src/nix/local.mk b/src/nix/local.mk index f6e7073b6e7d..21f190e476f4 100644 --- a/src/nix/local.mk +++ b/src/nix/local.mk @@ -6,4 +6,6 @@ nix_SOURCES := $(wildcard $(d)/*.cc) nix_LIBS = libexpr libmain libstore libutil libformat +nix_LDFLAGS = -lreadline + $(eval $(call install-symlink, nix, $(bindir)/nix-hash)) diff --git a/src/nix/repl.cc b/src/nix/repl.cc index 71790eb481a7..54e48e405b89 100644 --- a/src/nix/repl.cc +++ b/src/nix/repl.cc @@ -1,5 +1,3 @@ -#include <nix/config.h> - #include <iostream> #include <cstdlib> @@ -17,9 +15,11 @@ #include "derivations.hh" #include "affinity.hh" #include "globals.hh" +#include "command.hh" + +namespace nix { using namespace std; -using namespace nix; #define ESC_RED "\033[31m" #define ESC_GRE "\033[32m" @@ -49,6 +49,7 @@ struct NixRepl StringSet::iterator curCompletion; NixRepl(const Strings & searchPath, nix::ref<Store> store); + ~NixRepl(); void mainLoop(const Strings & files); void completePrefix(string prefix); bool getLine(string & input, const char * prompt); @@ -119,10 +120,16 @@ NixRepl::NixRepl(const Strings & searchPath, nix::ref<Store> store) } +NixRepl::~NixRepl() +{ + write_history(historyFile.c_str()); +} + + void NixRepl::mainLoop(const Strings & files) { string error = ANSI_RED "error:" ANSI_NORMAL " "; - std::cout << "Welcome to Nix version " << NIX_VERSION << ". Type :? for help." << std::endl << std::endl; + std::cout << "Welcome to Nix version " << nixVersion << ". Type :? for help." << std::endl << std::endl; for (auto & i : files) loadedFiles.push_back(i); @@ -685,35 +692,30 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m return str; } - -int main(int argc, char * * argv) +struct CmdRepl : StoreCommand { - return handleExceptions(argv[0], [&]() { - initNix(); - initGC(); - - Strings files, searchPath; - - parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) { - if (*arg == "--version") - printVersion("nix-repl"); - else if (*arg == "--help") { - printHelp(); - // exit with 0 since user asked for help - _exit(0); - } - else if (parseSearchPathArg(arg, end, searchPath)) - ; - else if (*arg != "" && arg->at(0) == '-') - return false; - else - files.push_back(*arg); - return true; - }); - - NixRepl repl(searchPath, openStore()); + Strings files; + + CmdRepl() + { + expectArgs("files", &files); + } + + std::string name() override { return "repl"; } + + std::string description() override + { + return "start an interactive environment for evaluating Nix expressions"; + } + + void run(ref<Store> store) override + { + // FIXME: pass searchPath + NixRepl repl({}, openStore()); repl.mainLoop(files); + } +}; + +static RegisterCommand r1(make_ref<CmdRepl>()); - write_history(historyFile.c_str()); - }); } |