Merge pull request #2810 from NixOS/print-build-logs

nix: Add --print-build-logs flag
This commit is contained in:
Eelco Dolstra 2019-05-15 20:38:38 +02:00 committed by GitHub
commit 8f6c72faee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 13 deletions

View file

@ -408,6 +408,7 @@ void ignoreException();
/* Some ANSI escape sequences. */ /* Some ANSI escape sequences. */
#define ANSI_NORMAL "\e[0m" #define ANSI_NORMAL "\e[0m"
#define ANSI_BOLD "\e[1m" #define ANSI_BOLD "\e[1m"
#define ANSI_FAINT "\e[2m"
#define ANSI_RED "\e[31;1m" #define ANSI_RED "\e[31;1m"
#define ANSI_GREEN "\e[32;1m" #define ANSI_GREEN "\e[32;1m"
#define ANSI_BLUE "\e[34;1m" #define ANSI_BLUE "\e[34;1m"

View file

@ -20,6 +20,8 @@ std::string programPath;
struct NixArgs : virtual MultiCommand, virtual MixCommonArgs struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
{ {
bool printBuildLogs = false;
NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix") NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
{ {
mkFlag() mkFlag()
@ -41,6 +43,11 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
throw Exit(); throw Exit();
}); });
mkFlag()
.longName("print-build-logs")
.description("print full build logs on stderr")
.set(&printBuildLogs, true);
mkFlag() mkFlag()
.longName("version") .longName("version")
.description("show version information") .description("show version information")
@ -98,8 +105,7 @@ void mainWrapped(int argc, char * * argv)
Finally f([]() { stopProgressBar(); }); Finally f([]() { stopProgressBar(); });
if (isatty(STDERR_FILENO)) startProgressBar(args.printBuildLogs);
startProgressBar();
args.command->prepare(); args.command->prepare();
args.command->run(); args.command->run();

View file

@ -2,6 +2,7 @@
#include "util.hh" #include "util.hh"
#include "sync.hh" #include "sync.hh"
#include "store-api.hh" #include "store-api.hh"
#include "names.hh"
#include <atomic> #include <atomic>
#include <map> #include <map>
@ -38,6 +39,7 @@ private:
std::map<ActivityType, uint64_t> expectedByType; std::map<ActivityType, uint64_t> expectedByType;
bool visible = true; bool visible = true;
ActivityId parent; ActivityId parent;
std::optional<std::string> name;
}; };
struct ActivitiesByType struct ActivitiesByType
@ -68,10 +70,16 @@ private:
std::condition_variable quitCV, updateCV; std::condition_variable quitCV, updateCV;
bool printBuildLogs;
bool isTTY;
public: public:
ProgressBar() ProgressBar(bool printBuildLogs, bool isTTY)
: printBuildLogs(printBuildLogs)
, isTTY(isTTY)
{ {
state_.lock()->active = isTTY;
updateThread = std::thread([&]() { updateThread = std::thread([&]() {
auto state(state_.lock()); auto state(state_.lock());
while (state->active) { while (state->active) {
@ -109,8 +117,14 @@ public:
void log(State & state, Verbosity lvl, const std::string & s) void log(State & state, Verbosity lvl, const std::string & s)
{ {
writeToStderr("\r\e[K" + s + ANSI_NORMAL "\n"); if (state.active) {
draw(state); writeToStderr("\r\e[K" + s + ANSI_NORMAL "\n");
draw(state);
} else {
auto s2 = s + ANSI_NORMAL "\n";
if (!isTTY) s2 = filterANSIEscapes(s2, true);
writeToStderr(s2);
}
} }
void startActivity(ActivityId act, Verbosity lvl, ActivityType type, void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
@ -141,6 +155,7 @@ public:
auto nrRounds = getI(fields, 3); auto nrRounds = getI(fields, 3);
if (nrRounds != 1) if (nrRounds != 1)
i->s += fmt(" (round %d/%d)", curRound, nrRounds); i->s += fmt(" (round %d/%d)", curRound, nrRounds);
i->name = DrvName(name).name;
} }
if (type == actSubstitute) { if (type == actSubstitute) {
@ -217,11 +232,15 @@ public:
auto i = state->its.find(act); auto i = state->its.find(act);
assert(i != state->its.end()); assert(i != state->its.end());
ActInfo info = *i->second; ActInfo info = *i->second;
state->activities.erase(i->second); if (printBuildLogs) {
info.lastLine = lastLine; log(*state, lvlInfo, ANSI_FAINT + info.name.value_or("unnamed") + "> " + ANSI_NORMAL + lastLine);
state->activities.emplace_back(info); } else {
i->second = std::prev(state->activities.end()); state->activities.erase(i->second);
update(); info.lastLine = lastLine;
state->activities.emplace_back(info);
i->second = std::prev(state->activities.end());
update();
}
} }
} }
@ -395,9 +414,9 @@ public:
} }
}; };
void startProgressBar() void startProgressBar(bool printBuildLogs)
{ {
logger = new ProgressBar(); logger = new ProgressBar(printBuildLogs, isatty(STDERR_FILENO));
} }
void stopProgressBar() void stopProgressBar()

View file

@ -4,7 +4,7 @@
namespace nix { namespace nix {
void startProgressBar(); void startProgressBar(bool printBuildLogs = false);
void stopProgressBar(); void stopProgressBar();