src/libcmd/repl.cc: allow :log /path/to/store.drv
This adds a second form to the `:log` command: it now can accept a derivation path in addition to a derivation expression. As derivation store paths start with `/nix/store`, this is not ambiguous. Resolves: https://git.lix.systems/lix-project/lix/issues/51 Change-Id: Iebc7b011537e7012fae8faed4024ea1b8fdc81c3
This commit is contained in:
parent
66469fc281
commit
9adfd9b8ad
3 changed files with 58 additions and 30 deletions
9
doc/manual/rl-next/repl-log-drv.md
Normal file
9
doc/manual/rl-next/repl-log-drv.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
synopsis: "`:log` in repl now works on derivation paths"
|
||||||
|
issues: [fj#51]
|
||||||
|
cls: [1716]
|
||||||
|
category: Improvements
|
||||||
|
credits: [goldstein]
|
||||||
|
---
|
||||||
|
|
||||||
|
`:log` can now accept store derivation paths in addition to derivation expressions.
|
|
@ -536,7 +536,7 @@ ProcessLineResult NixRepl::processLine(std::string line)
|
||||||
<< " :t <expr> Describe result of evaluation\n"
|
<< " :t <expr> Describe result of evaluation\n"
|
||||||
<< " :u <expr> Build derivation, then start nix-shell\n"
|
<< " :u <expr> Build derivation, then start nix-shell\n"
|
||||||
<< " :doc <expr> Show documentation for the provided function (experimental lambda support)\n"
|
<< " :doc <expr> Show documentation for the provided function (experimental lambda support)\n"
|
||||||
<< " :log <expr> Show logs for a derivation\n"
|
<< " :log <expr | .drv path> Show logs for a derivation\n"
|
||||||
<< " :te, :trace-enable [bool] Enable, disable or toggle showing traces for\n"
|
<< " :te, :trace-enable [bool] Enable, disable or toggle showing traces for\n"
|
||||||
<< " errors\n"
|
<< " errors\n"
|
||||||
<< " :?, :help Brings up this help menu\n"
|
<< " :?, :help Brings up this help menu\n"
|
||||||
|
@ -676,7 +676,49 @@ ProcessLineResult NixRepl::processLine(std::string line)
|
||||||
runNix("nix-shell", {state->store->printStorePath(drvPath)});
|
runNix("nix-shell", {state->store->printStorePath(drvPath)});
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (command == ":b" || command == ":bl" || command == ":i" || command == ":sh" || command == ":log") {
|
else if (command == ":log") {
|
||||||
|
StorePath drvPath = ([&] {
|
||||||
|
auto maybeDrvPath = state->store->maybeParseStorePath(arg);
|
||||||
|
if (maybeDrvPath && maybeDrvPath->isDerivation()) {
|
||||||
|
return std::move(*maybeDrvPath);
|
||||||
|
} else {
|
||||||
|
Value v;
|
||||||
|
evalString(arg, v);
|
||||||
|
return getDerivationPath(v);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
Path drvPathRaw = state->store->printStorePath(drvPath);
|
||||||
|
|
||||||
|
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 * logSubP = dynamic_cast<LogStore *>(&*sub);
|
||||||
|
if (!logSubP) {
|
||||||
|
printInfo("Skipped '%s' which does not support retrieving build logs", sub->getUri());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto & logSub = *logSubP;
|
||||||
|
|
||||||
|
auto log = logSub.getBuildLog(drvPath);
|
||||||
|
if (log) {
|
||||||
|
printInfo("got build log for '%s' from '%s'", drvPathRaw, logSub.getUri());
|
||||||
|
logger->writeToStdout(*log);
|
||||||
|
foundLog = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!foundLog) throw Error("build log of '%s' is not available", drvPathRaw);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (command == ":b" || command == ":bl" || command == ":i" || command == ":sh") {
|
||||||
Value v;
|
Value v;
|
||||||
evalString(arg, v);
|
evalString(arg, v);
|
||||||
StorePath drvPath = getDerivationPath(v);
|
StorePath drvPath = getDerivationPath(v);
|
||||||
|
@ -712,34 +754,6 @@ ProcessLineResult NixRepl::processLine(std::string line)
|
||||||
}
|
}
|
||||||
} else if (command == ":i") {
|
} else if (command == ":i") {
|
||||||
runNix("nix-env", {"-i", drvPathRaw});
|
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 * logSubP = dynamic_cast<LogStore *>(&*sub);
|
|
||||||
if (!logSubP) {
|
|
||||||
printInfo("Skipped '%s' which does not support retrieving build logs", sub->getUri());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
auto & logSub = *logSubP;
|
|
||||||
|
|
||||||
auto log = logSub.getBuildLog(drvPath);
|
|
||||||
if (log) {
|
|
||||||
printInfo("got build log for '%s' from '%s'", drvPathRaw, logSub.getUri());
|
|
||||||
logger->writeToStdout(*log);
|
|
||||||
foundLog = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!foundLog) throw Error("build log of '%s' is not available", drvPathRaw);
|
|
||||||
} else {
|
} else {
|
||||||
runNix("nix-shell", {drvPathRaw});
|
runNix("nix-shell", {drvPathRaw});
|
||||||
}
|
}
|
||||||
|
|
|
@ -271,3 +271,8 @@ a = ''test string that we'll grep later''
|
||||||
:e identity
|
:e identity
|
||||||
a
|
a
|
||||||
" "undefined variable"
|
" "undefined variable"
|
||||||
|
|
||||||
|
# Test :log with derivation paths.
|
||||||
|
simple_path="$(nix-instantiate "$testDir/simple.nix")"
|
||||||
|
# `PATH=` is a part of build log.
|
||||||
|
testReplResponseNoRegex ":log ${simple_path}" "PATH="
|
||||||
|
|
Loading…
Reference in a new issue