aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libutil/util.hh1
-rw-r--r--src/nix/main.cc10
-rw-r--r--src/nix/progress-bar.cc39
-rw-r--r--src/nix/progress-bar.hh2
4 files changed, 39 insertions, 13 deletions
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 7c57d0afa..fce3cab8d 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -408,6 +408,7 @@ void ignoreException();
/* Some ANSI escape sequences. */
#define ANSI_NORMAL "\e[0m"
#define ANSI_BOLD "\e[1m"
+#define ANSI_FAINT "\e[2m"
#define ANSI_RED "\e[31;1m"
#define ANSI_GREEN "\e[32;1m"
#define ANSI_BLUE "\e[34;1m"
diff --git a/src/nix/main.cc b/src/nix/main.cc
index 64c1dc357..4f87ad72b 100644
--- a/src/nix/main.cc
+++ b/src/nix/main.cc
@@ -20,6 +20,8 @@ std::string programPath;
struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
{
+ bool printBuildLogs = false;
+
NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
{
mkFlag()
@@ -42,6 +44,11 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
});
mkFlag()
+ .longName("print-build-logs")
+ .description("print full build logs on stderr")
+ .set(&printBuildLogs, true);
+
+ mkFlag()
.longName("version")
.description("show version information")
.handler([&]() { printVersion(programName); });
@@ -98,8 +105,7 @@ void mainWrapped(int argc, char * * argv)
Finally f([]() { stopProgressBar(); });
- if (isatty(STDERR_FILENO))
- startProgressBar();
+ startProgressBar(args.printBuildLogs);
args.command->prepare();
args.command->run();
diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc
index 40b905ba3..304f918cc 100644
--- a/src/nix/progress-bar.cc
+++ b/src/nix/progress-bar.cc
@@ -2,6 +2,7 @@
#include "util.hh"
#include "sync.hh"
#include "store-api.hh"
+#include "names.hh"
#include <atomic>
#include <map>
@@ -38,6 +39,7 @@ private:
std::map<ActivityType, uint64_t> expectedByType;
bool visible = true;
ActivityId parent;
+ std::optional<std::string> name;
};
struct ActivitiesByType
@@ -68,10 +70,16 @@ private:
std::condition_variable quitCV, updateCV;
+ bool printBuildLogs;
+ bool isTTY;
+
public:
- ProgressBar()
+ ProgressBar(bool printBuildLogs, bool isTTY)
+ : printBuildLogs(printBuildLogs)
+ , isTTY(isTTY)
{
+ state_.lock()->active = isTTY;
updateThread = std::thread([&]() {
auto state(state_.lock());
while (state->active) {
@@ -109,8 +117,14 @@ public:
void log(State & state, Verbosity lvl, const std::string & s)
{
- writeToStderr("\r\e[K" + s + ANSI_NORMAL "\n");
- draw(state);
+ if (state.active) {
+ 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,
@@ -141,6 +155,7 @@ public:
auto nrRounds = getI(fields, 3);
if (nrRounds != 1)
i->s += fmt(" (round %d/%d)", curRound, nrRounds);
+ i->name = DrvName(name).name;
}
if (type == actSubstitute) {
@@ -217,11 +232,15 @@ public:
auto i = state->its.find(act);
assert(i != state->its.end());
ActInfo info = *i->second;
- state->activities.erase(i->second);
- info.lastLine = lastLine;
- state->activities.emplace_back(info);
- i->second = std::prev(state->activities.end());
- update();
+ if (printBuildLogs) {
+ log(*state, lvlInfo, ANSI_FAINT + info.name.value_or("unnamed") + "> " + ANSI_NORMAL + lastLine);
+ } else {
+ state->activities.erase(i->second);
+ 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()
diff --git a/src/nix/progress-bar.hh b/src/nix/progress-bar.hh
index af8eda5a8..4d61175c2 100644
--- a/src/nix/progress-bar.hh
+++ b/src/nix/progress-bar.hh
@@ -4,7 +4,7 @@
namespace nix {
-void startProgressBar();
+void startProgressBar(bool printBuildLogs = false);
void stopProgressBar();