aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2021-12-07 21:33:32 +0100
committerEelco Dolstra <edolstra@gmail.com>2021-12-07 21:33:32 +0100
commit8b5088b62fe8f97643d77a024edffabf9ef4aa3d (patch)
tree5f40f05b5a2f5d10a98095474f94e8d7e1ac5d8a
parenta5e9b5428f9a6c7b50752d4e5cb7431625db624a (diff)
parent33926ed1e75c06cbf70a920e462841cc9daa0520 (diff)
Merge branch 'balsoft/nix-repl-log' of https://github.com/tweag/nix
-rw-r--r--doc/manual/src/release-notes/rl-next.md2
-rw-r--r--src/libmain/shared.cc4
-rw-r--r--src/libmain/shared.hh1
-rw-r--r--src/nix/repl.cc26
-rw-r--r--src/nix/repl.md7
-rw-r--r--tests/repl.sh13
-rw-r--r--tests/simple-failing.builder.sh2
-rw-r--r--tests/simple-failing.nix8
8 files changed, 57 insertions, 6 deletions
diff --git a/doc/manual/src/release-notes/rl-next.md b/doc/manual/src/release-notes/rl-next.md
index a6b22dfa7..cf2da9aa8 100644
--- a/doc/manual/src/release-notes/rl-next.md
+++ b/doc/manual/src/release-notes/rl-next.md
@@ -8,3 +8,5 @@
* New built-in function: `builtins.groupBy`, with the same functionality as
Nixpkgs' `lib.groupBy`, but faster.
+
+* `nix repl` now has a `:log` command.
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index b6bfea8cb..4404e0195 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -427,7 +427,7 @@ RunPager::RunPager()
});
pid.setKillSignal(SIGINT);
-
+ stdout = fcntl(STDOUT_FILENO, F_DUPFD_CLOEXEC, 0);
if (dup2(toPager.writeSide.get(), STDOUT_FILENO) == -1)
throw SysError("dupping stdout");
}
@@ -438,7 +438,7 @@ RunPager::~RunPager()
try {
if (pid != -1) {
std::cout.flush();
- close(STDOUT_FILENO);
+ dup2(stdout, STDOUT_FILENO);
pid.wait();
}
} catch (...) {
diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh
index 05277d90a..ed012959b 100644
--- a/src/libmain/shared.hh
+++ b/src/libmain/shared.hh
@@ -88,6 +88,7 @@ public:
private:
Pid pid;
+ int stdout;
};
extern volatile ::sig_atomic_t blockInt;
diff --git a/src/nix/repl.cc b/src/nix/repl.cc
index 2649eb0bd..42143871f 100644
--- a/src/nix/repl.cc
+++ b/src/nix/repl.cc
@@ -430,7 +430,8 @@ bool NixRepl::processLine(string line)
<< " :s <expr> Build dependencies of derivation, then start nix-shell\n"
<< " :t <expr> Describe result of evaluation\n"
<< " :u <expr> Build derivation, then start nix-shell\n"
- << " :doc <expr> Show documentation of a builtin function\n";
+ << " :doc <expr> Show documentation of a builtin function\n"
+ << " :log <expr> Show logs for a derivation\n";
}
else if (command == ":a" || command == ":add") {
@@ -500,7 +501,7 @@ bool NixRepl::processLine(string line)
runNix("nix-shell", {state->store->printStorePath(drvPath)});
}
- else if (command == ":b" || command == ":i" || command == ":s") {
+ else if (command == ":b" || command == ":i" || command == ":s" || command == ":log") {
Value v;
evalString(arg, v);
StorePath drvPath = getDerivationPath(v);
@@ -514,6 +515,27 @@ bool NixRepl::processLine(string line)
logger->cout(" %s -> %s", outputName, state->store->printStorePath(outputPath));
} else if (command == ":i") {
runNix("nix-env", {"-i", drvPathRaw});
+ } else if (command == ":log") {
+ settings.readOnlyMode = true;
+ Finally roModeReset([&]() {
+ settings.readOnlyMode = false;
+ });
+ auto subs = getDefaultSubstituters();
+
+ subs.push_front(state->store);
+
+ bool foundLog = false;
+ RunPager pager;
+ for (auto & sub : subs) {
+ auto log = sub->getBuildLog(drvPath);
+ if (log) {
+ printInfo("got build log for '%s' from '%s'", drvPathRaw, sub->getUri());
+ logger->writeToStdout(*log);
+ foundLog = true;
+ break;
+ }
+ }
+ if (!foundLog) throw Error("build log of '%s' is not available", drvPathRaw);
} else {
runNix("nix-shell", {drvPathRaw});
}
diff --git a/src/nix/repl.md b/src/nix/repl.md
index bba60f871..9b6f2bee3 100644
--- a/src/nix/repl.md
+++ b/src/nix/repl.md
@@ -35,14 +35,17 @@ R""(
nix-repl> emacs.drvPath
"/nix/store/lp0sjrhgg03y2n0l10n70rg0k7hhyz0l-emacs-27.1.drv"
- nix-repl> drv = runCommand "hello" { buildInputs = [ hello ]; } "hello > $out"
+ nix-repl> drv = runCommand "hello" { buildInputs = [ hello ]; } "hello; hello > $out"
- nix-repl> :b x
+ nix-repl> :b drv
this derivation produced the following outputs:
out -> /nix/store/0njwbgwmkwls0w5dv9mpc1pq5fj39q0l-hello
nix-repl> builtins.readFile drv
"Hello, world!\n"
+
+ nix-repl> :log drv
+ Hello, world!
```
# Description
diff --git a/tests/repl.sh b/tests/repl.sh
index d360821f2..f592822bc 100644
--- a/tests/repl.sh
+++ b/tests/repl.sh
@@ -3,6 +3,13 @@ source common.sh
replCmds="
simple = import ./simple.nix
:b simple
+:log simple
+"
+
+replFailingCmds="
+failing = import ./simple-failing.nix
+:b failing
+:log failing
"
testRepl () {
@@ -12,6 +19,12 @@ testRepl () {
local outPath=$(echo "$replOutput" |&
grep -o -E "$NIX_STORE_DIR/\w*-simple")
nix path-info "${nixArgs[@]}" "$outPath"
+ # simple.nix prints a PATH during build
+ echo "$replOutput" | grep -qs 'PATH=' || fail "nix repl :log doesn't output logs"
+ local replOutput="$(nix repl "${nixArgs[@]}" <<< "$replFailingCmds")"
+ echo "$replOutput"
+ echo "$replOutput" | grep -qs 'This should fail' \
+ || fail "nix repl :log doesn't output logs for a failed derivation"
}
# Simple test, try building a drv
diff --git a/tests/simple-failing.builder.sh b/tests/simple-failing.builder.sh
new file mode 100644
index 000000000..6285488ca
--- /dev/null
+++ b/tests/simple-failing.builder.sh
@@ -0,0 +1,2 @@
+echo "This should fail"
+exit 1
diff --git a/tests/simple-failing.nix b/tests/simple-failing.nix
new file mode 100644
index 000000000..1e3a080ed
--- /dev/null
+++ b/tests/simple-failing.nix
@@ -0,0 +1,8 @@
+with import ./config.nix;
+
+mkDerivation {
+ name = "simple-failing";
+ builder = ./simple-failing.builder.sh;
+ PATH = "";
+ goodPath = path;
+}