aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexander Bantyev <balsoft@balsoft.ru>2021-11-26 18:03:07 +0300
committerAlexander Bantyev <balsoft@balsoft.ru>2021-12-06 16:52:50 +0300
commit33926ed1e75c06cbf70a920e462841cc9daa0520 (patch)
tree1e375e99c1848edb70427588f2febaa9967be1d3 /src
parent0a2fa2d68460eca946c91b72cd264725e5cda7db (diff)
nix repl: add :log
Add a :log command that shows logs for a derivation. Closes https://github.com/NixOS/nix/issues/3504 Co-authored-by: Taeer Bar-Yam <taeer@bar-yam.me>
Diffstat (limited to 'src')
-rw-r--r--src/nix/repl.cc26
-rw-r--r--src/nix/repl.md7
2 files changed, 29 insertions, 4 deletions
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