about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-04-25T16·48+0200
committerEelco Dolstra <edolstra@gmail.com>2017-04-25T16·48+0200
commit921a2aeb0537f34bc2b41e98e67a1c829321ee81 (patch)
tree9fb8bdd89cf0bfa221f8f683c100fb4c6cf3e028
parentc31000bc935d3d51665fb2a7d7c2fa88e6f12acf (diff)
Make "nix repl" build
-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 294af54cd6..534c218c11 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 425eb0a191..3c57826d1a 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 f6e7073b6e..21f190e476 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 71790eb481..54e48e405b 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());
-    });
 }