aboutsummaryrefslogtreecommitdiff
path: root/src/nix/repl.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2021-04-07 13:10:02 +0200
committerEelco Dolstra <edolstra@gmail.com>2021-04-07 13:10:02 +0200
commit9b9e703df41d75949272059f9b8bc8b763e91fce (patch)
tree8ddcd01325ee08d8029e0a86f467390de23c7b39 /src/nix/repl.cc
parent8a29052cb2f52ef2c82c36fb3818fd0f66349729 (diff)
restoreSignals() + restoreAffinity() -> restoreProcessContext()
Diffstat (limited to 'src/nix/repl.cc')
-rw-r--r--src/nix/repl.cc30
1 files changed, 7 insertions, 23 deletions
diff --git a/src/nix/repl.cc b/src/nix/repl.cc
index bce8d31dc..eed79c332 100644
--- a/src/nix/repl.cc
+++ b/src/nix/repl.cc
@@ -343,24 +343,6 @@ StringSet NixRepl::completePrefix(string prefix)
}
-static int runProgram(const string & program, const Strings & args)
-{
- Strings args2(args);
- args2.push_front(program);
-
- Pid pid;
- pid = fork();
- if (pid == -1) throw SysError("forking");
- if (pid == 0) {
- restoreAffinity();
- execvp(program.c_str(), stringsToCharPtrs(args2).data());
- _exit(1);
- }
-
- return pid.wait();
-}
-
-
bool isVarName(const string & s)
{
if (s.size() == 0) return false;
@@ -462,7 +444,7 @@ bool NixRepl::processLine(string line)
auto args = editorFor(pos);
auto editor = args.front();
args.pop_front();
- runProgram(editor, args);
+ runProgram(editor, true, args);
// Reload right after exiting the editor
state->resetFileCache();
@@ -481,7 +463,7 @@ bool NixRepl::processLine(string line)
state->callFunction(f, v, result, Pos());
StorePath drvPath = getDerivationPath(result);
- runProgram(settings.nixBinDir + "/nix-shell", Strings{state->store->printStorePath(drvPath)});
+ runProgram(settings.nixBinDir + "/nix-shell", true, {state->store->printStorePath(drvPath)});
}
else if (command == ":b" || command == ":i" || command == ":s") {
@@ -494,16 +476,18 @@ bool NixRepl::processLine(string line)
/* We could do the build in this process using buildPaths(),
but doing it in a child makes it easier to recover from
problems / SIGINT. */
- if (runProgram(settings.nixBinDir + "/nix", Strings{"build", "--no-link", drvPathRaw}) == 0) {
+ try {
+ runProgram(settings.nixBinDir + "/nix", true, {"build", "--no-link", drvPathRaw});
auto drv = state->store->readDerivation(drvPath);
std::cout << std::endl << "this derivation produced the following outputs:" << std::endl;
for (auto & i : drv.outputsAndOptPaths(*state->store))
std::cout << fmt(" %s -> %s\n", i.first, state->store->printStorePath(*i.second.second));
+ } catch (ExecError &) {
}
} else if (command == ":i") {
- runProgram(settings.nixBinDir + "/nix-env", Strings{"-i", drvPathRaw});
+ runProgram(settings.nixBinDir + "/nix-env", true, {"-i", drvPathRaw});
} else {
- runProgram(settings.nixBinDir + "/nix-shell", Strings{drvPathRaw});
+ runProgram(settings.nixBinDir + "/nix-shell", true, {drvPathRaw});
}
}