diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-08-25 14:53:50 +0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-08-25 15:58:35 +0200 |
commit | 0e9ddcc306f0900fc38472a2c8b9d9aa886b279e (patch) | |
tree | 564883e41ee9aee98ec1bdceed43f7d2be8f905b | |
parent | 1f56235438984d8079159d7c81ad4127c318b2dc (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.cc | 7 | ||||
-rw-r--r-- | src/libutil/logging.cc | 5 | ||||
-rw-r--r-- | src/libutil/logging.hh | 34 | ||||
-rw-r--r-- | src/nix/progress-bar.cc | 10 |
4 files changed, 36 insertions, 20 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc index e97fcc9e2..77dee2914 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 900f24e4c..87f20664e 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 08a116175..567af361e 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 f0db3be60..a692250f8 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); } |