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
This commit is contained in:
Eelco Dolstra 2017-08-25 18:04:05 +02:00
parent c137c0a5eb
commit 0ac35b67b8
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
3 changed files with 24 additions and 7 deletions

View file

@ -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());
}

View file

@ -31,6 +31,7 @@ typedef enum {
resBuildLogLine = 101,
resUntrustedPath = 102,
resCorruptedPath = 103,
resSetPhase = 104,
} ResultType;
typedef uint64_t ActivityId;

View file

@ -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;
}
}
}