aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release.nix3
-rw-r--r--shell.nix1
-rw-r--r--src/nix/local.mk2
-rw-r--r--src/nix/repl.cc66
4 files changed, 39 insertions, 33 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 <nixpkgs> {};
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 <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());
- });
}