about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-08-25T16·04+0200
committerEelco Dolstra <edolstra@gmail.com>2017-08-25T16·04+0200
commit0ac35b67b8035ad1166df3fb199590bc346d71f2 (patch)
treeee26ea6fc3ef46a056e8adfa17383f844c8b410a /src
parentc137c0a5ebc0d58c53f86986ab66967ac8629cbe (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/libstore/build.cc5
-rw-r--r--src/libutil/logging.hh1
-rw-r--r--src/nix/progress-bar.cc25
3 files changed, 24 insertions, 7 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index cb67d7a6c144..59013c0349b8 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 9427f268267a..57157dce15cc 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 1b597433b30e..90e54ed48a21 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;
                 }
             }
         }