about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-08-25T12·53+0200
committerEelco Dolstra <edolstra@gmail.com>2017-08-25T13·58+0200
commit0e9ddcc306f0900fc38472a2c8b9d9aa886b279e (patch)
tree564883e41ee9aee98ec1bdceed43f7d2be8f905b
parent1f56235438984d8079159d7c81ad4127c318b2dc (diff)
Restore activity metadata
This allows the progress bar to display "building perl-5.22.3" instead
of "building /nix/store/<hash>-perl-5.22.3.drv".
-rw-r--r--src/libstore/build.cc7
-rw-r--r--src/libutil/logging.cc5
-rw-r--r--src/libutil/logging.hh34
-rw-r--r--src/nix/progress-bar.cc10
4 files changed, 36 insertions, 20 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index e97fcc9e269c..77dee2914677 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -1390,7 +1390,8 @@ void DerivationGoal::tryToBuild()
     bool buildLocally = buildMode != bmNormal || drv->willBuildLocally();
 
     auto started = [&]() {
-        act = std::make_unique<Activity>(*logger, actBuild, fmt("building '%s'", drvPath));
+        act = std::make_unique<Activity>(*logger, actBuild,
+            fmt("building '%s'", drvPath), Logger::Fields{drvPath});
         mcRunningBuilds = std::make_unique<MaintainCount<uint64_t>>(worker.runningBuilds);
         worker.updateProgress();
     };
@@ -2405,13 +2406,15 @@ struct BuilderLogger : Logger
         prevLogger.log(lvl, fs);
     }
 
-    void startActivity(ActivityId act, ActivityType type, const std::string & s) override
+    void startActivity(ActivityId act, ActivityType type,
+        const std::string & s, const Fields & fields) override
     {
         nlohmann::json json;
         json["action"] = "start";
         json["id"] = act;
         json["type"] = type;
         json["text"] = s;
+        // FIXME: handle fields
         log(lvlError, "@nix " + json.dump());
     }
 
diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc
index 900f24e4cbdf..87f20664ef08 100644
--- a/src/libutil/logging.cc
+++ b/src/libutil/logging.cc
@@ -74,10 +74,11 @@ Logger * makeDefaultLogger()
 
 std::atomic<uint64_t> nextId{(uint64_t) getpid() << 32};
 
-Activity::Activity(Logger & logger, ActivityType type, const std::string & s)
+Activity::Activity(Logger & logger, ActivityType type,
+    const std::string & s, const Logger::Fields & fields)
     : logger(logger), id(nextId++)
 {
-    logger.startActivity(id, type, s);
+    logger.startActivity(id, type, s, fields);
 }
 
 }
diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh
index 08a11617591e..567af361e8e9 100644
--- a/src/libutil/logging.hh
+++ b/src/libutil/logging.hh
@@ -40,6 +40,19 @@ class Logger
 
 public:
 
+    struct Field
+    {
+        // FIXME: use std::variant.
+        enum { tInt, tString } type;
+        uint64_t i = 0;
+        std::string s;
+        Field(const std::string & s) : type(tString), s(s) { }
+        Field(const char * s) : type(tString), s(s) { }
+        Field(const uint64_t & i) : type(tInt), i(i) { }
+    };
+
+    typedef std::vector<Field> Fields;
+
     virtual ~Logger() { }
 
     virtual void log(Verbosity lvl, const FormatOrString & fs) = 0;
@@ -51,7 +64,8 @@ public:
 
     virtual void warn(const std::string & msg);
 
-    virtual void startActivity(ActivityId act, ActivityType type, const std::string & s) { };
+    virtual void startActivity(ActivityId act, ActivityType type,
+        const std::string & s, const Fields & fields) { };
 
     virtual void stopActivity(ActivityId act) { };
 
@@ -59,18 +73,7 @@ public:
 
     virtual void setExpected(ActivityId act, ActivityType type, uint64_t expected) { };
 
-    struct Field
-    {
-        // FIXME: use std::variant.
-        enum { tInt, tString } type;
-        uint64_t i = 0;
-        std::string s;
-        Field(const std::string & s) : type(tString), s(s) { }
-        Field(const char * s) : type(tString), s(s) { }
-        Field(const uint64_t & i) : type(tInt), i(i) { }
-    };
-
-    virtual void result(ActivityId act, ResultType type, const std::vector<Field> & fields) { };
+    virtual void result(ActivityId act, ResultType type, const Fields & fields) { };
 };
 
 struct Activity
@@ -79,7 +82,8 @@ struct Activity
 
     const ActivityId id;
 
-    Activity(Logger & logger, ActivityType type, const std::string & s = "");
+    Activity(Logger & logger, ActivityType type, const std::string & s = "",
+        const Logger::Fields & fields = {});
 
     Activity(const Activity & act) = delete;
 
@@ -95,7 +99,7 @@ struct Activity
     template<typename... Args>
     void result(ResultType type, const Args & ... args)
     {
-        std::vector<Logger::Field> fields;
+        Logger::Fields fields;
         nop{(fields.emplace_back(Logger::Field(args)), 1)...};
         logger.result(id, type, fields);
     }
diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc
index f0db3be60263..a692250f826d 100644
--- a/src/nix/progress-bar.cc
+++ b/src/nix/progress-bar.cc
@@ -93,7 +93,8 @@ public:
         update(state);
     }
 
-    void startActivity(ActivityId act, ActivityType type, const std::string & s) override
+    void startActivity(ActivityId act, ActivityType type, const std::string & s,
+        const Fields & fields) override
     {
         auto state(state_.lock());
 
@@ -102,6 +103,13 @@ public:
         state->its.emplace(act, i);
         state->activitiesByType[type].its.emplace(act, i);
 
+        if (type == actBuild) {
+            auto name = storePathToName(getS(fields, 0));
+            if (hasSuffix(name, ".drv"))
+                name.resize(name.size() - 4);
+            i->s = fmt("building " ANSI_BOLD "%s" ANSI_NORMAL, name);
+        }
+
         update(*state);
     }