forked from lix-project/lix
242f9bf3dc
I had started the trend of doing `std::visit` by value (because a type error once mislead me into thinking that was the only form that existed). While the optomizer in principle should be able to deal with extra coppying or extra indirection once the lambdas inlined, sticking with by reference is the conventional default. I hope this might even improve performance.
57 lines
1.4 KiB
C++
57 lines
1.4 KiB
C++
#include "command.hh"
|
|
#include "common-args.hh"
|
|
#include "shared.hh"
|
|
#include "store-api.hh"
|
|
#include "progress-bar.hh"
|
|
|
|
using namespace nix;
|
|
|
|
struct CmdLog : InstallableCommand
|
|
{
|
|
std::string description() override
|
|
{
|
|
return "show the build log of the specified packages or paths, if available";
|
|
}
|
|
|
|
std::string doc() override
|
|
{
|
|
return
|
|
#include "log.md"
|
|
;
|
|
}
|
|
|
|
Category category() override { return catSecondary; }
|
|
|
|
void run(ref<Store> store) override
|
|
{
|
|
settings.readOnlyMode = true;
|
|
|
|
auto subs = getDefaultSubstituters();
|
|
|
|
subs.push_front(store);
|
|
|
|
auto b = installable->toDerivedPath();
|
|
|
|
RunPager pager;
|
|
for (auto & sub : subs) {
|
|
auto log = std::visit(overloaded {
|
|
[&](const DerivedPath::Opaque & bo) {
|
|
return sub->getBuildLog(bo.path);
|
|
},
|
|
[&](const DerivedPath::Built & bfd) {
|
|
return sub->getBuildLog(bfd.drvPath);
|
|
},
|
|
}, b.raw());
|
|
if (!log) continue;
|
|
stopProgressBar();
|
|
printInfo("got build log for '%s' from '%s'", installable->what(), sub->getUri());
|
|
std::cout << *log;
|
|
return;
|
|
}
|
|
|
|
throw Error("build log of '%s' is not available", installable->what());
|
|
}
|
|
};
|
|
|
|
static auto rCmdLog = registerCommand<CmdLog>("log");
|