From 0ac35b67b8035ad1166df3fb199590bc346d71f2 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 25 Aug 2017 18:04:05 +0200 Subject: [PATCH] Allow derivations to update the build phase So the progress bar can show [1/0/1 built, 0.0 MiB DL] building hello-2.10 (configuring): checking whether pread is declared without a macro... yes --- src/libstore/build.cc | 5 +++++ src/libutil/logging.hh | 1 + src/nix/progress-bar.cc | 25 ++++++++++++++++++------- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index cb67d7a6c..59013c034 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -3325,6 +3325,11 @@ void DerivationGoal::flushLine() i->second.progress(json.value("done", 0), json.value("expected", 0), json.value("running", 0), json.value("failed", 0)); } + else if (action == "setPhase") { + std::string phase = json["phase"]; + act->result(resSetPhase, phase); + } + } catch (std::exception & e) { printError("bad log message from builder: %s", e.what()); } diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 9427f2682..57157dce1 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -31,6 +31,7 @@ typedef enum { resBuildLogLine = 101, resUntrustedPath = 102, resCorruptedPath = 103, + resSetPhase = 104, } ResultType; typedef uint64_t ActivityId; diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc index 1b597433b..90e54ed48 100644 --- a/src/nix/progress-bar.cc +++ b/src/nix/progress-bar.cc @@ -66,7 +66,7 @@ private: struct ActInfo { - std::string s, s2; + std::string s, lastLine, phase; ActivityType type = actUnknown; uint64_t done = 0; uint64_t expected = 0; @@ -232,13 +232,13 @@ public: } else if (type == resBuildLogLine) { - auto s2 = trim(getS(fields, 0)); - if (!s2.empty()) { + auto lastLine = trim(getS(fields, 0)); + if (!lastLine.empty()) { auto i = state->its.find(act); assert(i != state->its.end()); ActInfo info = *i->second; state->activities.erase(i->second); - info.s2 = s2; + info.lastLine = lastLine; state->activities.emplace_back(info); i->second = std::prev(state->activities.end()); update(*state); @@ -254,6 +254,12 @@ public: state->corruptedPaths++; update(*state); } + + else if (type == resSetPhase) { + auto i = state->its.find(act); + assert(i != state->its.end()); + i->second->phase = getS(fields, 0); + } } void update() @@ -277,14 +283,19 @@ public: if (!status.empty()) line += " "; auto i = state.activities.rbegin(); - while (i != state.activities.rend() && (!i->visible || (i->s.empty() && i->s2.empty()))) + while (i != state.activities.rend() && (!i->visible || (i->s.empty() && i->lastLine.empty()))) ++i; if (i != state.activities.rend()) { line += i->s; - if (!i->s2.empty()) { + if (!i->phase.empty()) { + line += " ("; + line += i->phase; + line += ")"; + } + if (!i->lastLine.empty()) { if (!i->s.empty()) line += ": "; - line += i->s2; + line += i->lastLine; } } }