From 921a2aeb0537f34bc2b41e98e67a1c829321ee81 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 25 Apr 2017 18:48:40 +0200 Subject: [PATCH] Make "nix repl" build --- release.nix | 3 ++- shell.nix | 1 + src/nix/local.mk | 2 ++ src/nix/repl.cc | 60 +++++++++++++++++++++++++----------------------- 4 files changed, 36 insertions(+), 30 deletions(-) diff --git a/release.nix b/release.nix index 294af54cd..534c218c1 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 425eb0a19..3c57826d1 100644 --- a/shell.nix +++ b/shell.nix @@ -16,6 +16,7 @@ with import {}; customMemoryManagement = false; }) autoreconfHook + readline ]; configureFlags = diff --git a/src/nix/local.mk b/src/nix/local.mk index f6e7073b6..21f190e47 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 71790eb48..54e48e405 100644 --- a/src/nix/repl.cc +++ b/src/nix/repl.cc @@ -1,5 +1,3 @@ -#include - #include #include @@ -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); + ~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) } +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; - Strings files, searchPath; + CmdRepl() + { + expectArgs("files", &files); + } - 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; - }); + std::string name() override { return "repl"; } - NixRepl repl(searchPath, openStore()); + std::string description() override + { + return "start an interactive environment for evaluating Nix expressions"; + } + + void run(ref store) override + { + // FIXME: pass searchPath + NixRepl repl({}, openStore()); repl.mainLoop(files); + } +}; + +static RegisterCommand r1(make_ref()); - write_history(historyFile.c_str()); - }); }