Add :x command which works like nix-shell -p.

This commit is contained in:
Scott Olson 2016-02-17 20:31:30 -06:00
parent 79b02dffcb
commit 86e93b9f61

View file

@ -39,6 +39,7 @@ struct NixRepl
void mainLoop(const Strings & files); void mainLoop(const Strings & files);
void completePrefix(string prefix); void completePrefix(string prefix);
bool getLine(string & input, const char * prompt); bool getLine(string & input, const char * prompt);
Path getDerivationPath(Value & v);
bool processLine(string line); bool processLine(string line);
void loadFile(const Path & path); void loadFile(const Path & path);
void initEnv(); void initEnv();
@ -300,6 +301,17 @@ bool isVarName(const string & s)
} }
Path NixRepl::getDerivationPath(Value & v) {
DrvInfo drvInfo(state);
if (!getDerivation(state, v, drvInfo, false))
throw Error("expression does not evaluate to a derivation, so I can't build it");
Path drvPath = drvInfo.queryDrvPath();
if (drvPath == "" || !state.store->isValidPath(drvPath))
throw Error("expression did not evaluate to a valid derivation");
return drvPath;
}
bool NixRepl::processLine(string line) bool NixRepl::processLine(string line)
{ {
if (line == "") return true; if (line == "") return true;
@ -327,7 +339,8 @@ bool NixRepl::processLine(string line)
<< " :q Exit nix-repl\n" << " :q Exit nix-repl\n"
<< " :r Reload all files\n" << " :r Reload all files\n"
<< " :s <expr> Build dependencies of derivation, then start nix-shell\n" << " :s <expr> Build dependencies of derivation, then start nix-shell\n"
<< " :t <expr> Describe result of evaluation\n"; << " :t <expr> Describe result of evaluation\n"
<< " :x <expr> Build derivation, then start nix-shell\n";
} }
else if (command == ":a" || command == ":add") { else if (command == ":a" || command == ":add") {
@ -350,17 +363,21 @@ bool NixRepl::processLine(string line)
Value v; Value v;
evalString(arg, v); evalString(arg, v);
std::cout << showType(v) << std::endl; std::cout << showType(v) << std::endl;
} else if (command == ":x") {
Value v, f, result;
evalString(arg, v);
evalString("drv: (import <nixpkgs> {}).runCommand \"shell\" { buildInputs = [ drv ]; } \"\"", f);
state.callFunction(f, v, result, Pos());
Path drvPath = getDerivationPath(result);
runProgram("nix-shell", Strings{drvPath});
} }
else if (command == ":b" || command == ":i" || command == ":s") { else if (command == ":b" || command == ":i" || command == ":s") {
Value v; Value v;
evalString(arg, v); evalString(arg, v);
DrvInfo drvInfo(state); Path drvPath = getDerivationPath(v);
if (!getDerivation(state, v, drvInfo, false))
throw Error("expression does not evaluate to a derivation, so I can't build it");
Path drvPath = drvInfo.queryDrvPath();
if (drvPath == "" || !state.store->isValidPath(drvPath))
throw Error("expression did not evaluate to a valid derivation");
if (command == ":b") { if (command == ":b") {
/* We could do the build in this process using buildPaths(), /* We could do the build in this process using buildPaths(),