aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-05-16 16:09:57 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-05-16 16:09:57 +0200
commitb01d62285cdcd376a8db1863049c68d8c7238837 (patch)
tree97662479c20edb683e81f82b26635915703da3ca /src/libutil
parente80257f12209c8fbb709b901039ef5199111276e (diff)
Improve progress indicator
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/logging.cc13
-rw-r--r--src/libutil/logging.hh91
-rw-r--r--src/libutil/util.cc2
-rw-r--r--src/libutil/util.hh2
4 files changed, 75 insertions, 33 deletions
diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc
index afcc2ec58..2d0acca24 100644
--- a/src/libutil/logging.cc
+++ b/src/libutil/logging.cc
@@ -1,6 +1,8 @@
#include "logging.hh"
#include "util.hh"
+#include <atomic>
+
namespace nix {
Logger * logger = makeDefaultLogger();
@@ -42,12 +44,7 @@ public:
writeToStderr(prefix + (tty ? fs.s : filterANSIEscapes(fs.s)) + "\n");
}
- void startActivity(Activity & activity, Verbosity lvl, const FormatOrString & fs) override
- {
- log(lvl, fs);
- }
-
- void stopActivity(Activity & activity) override
+ void event(const Event & ev) override
{
}
};
@@ -79,4 +76,8 @@ Logger * makeDefaultLogger()
return new SimpleLogger();
}
+std::atomic<uint64_t> Activity::nextId{(uint64_t) getpid() << 32};
+
+Activity::Activity() : id(nextId++) { };
+
}
diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh
index a8c69dbd9..ddfc336fe 100644
--- a/src/libutil/logging.hh
+++ b/src/libutil/logging.hh
@@ -13,7 +13,64 @@ typedef enum {
lvlVomit
} Verbosity;
-class Activity;
+class Activity
+{
+ static std::atomic<uint64_t> nextId;
+public:
+ typedef uint64_t t;
+ const t id;
+ Activity();
+ Activity(const Activity & act) : id(act.id) { };
+ Activity(uint64_t id) : id(id) { };
+};
+
+typedef enum {
+ evBuildCreated = 0,
+ evBuildStarted = 1,
+ evBuildOutput = 2,
+ evBuildFinished = 3,
+ evDownloadCreated = 4,
+ evDownloadDestroyed = 5,
+ evDownloadProgress = 6,
+ evDownloadSucceeded = 7,
+ evSubstitutionCreated = 8,
+ evSubstitutionStarted = 9,
+ evSubstitutionFinished = 10,
+} EventType;
+
+struct Event
+{
+ 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) { }
+ Field(const Activity & act) : type(tInt), i(act.id) { }
+ };
+
+ typedef std::vector<Field> Fields;
+
+ EventType type;
+ Fields fields;
+
+ std::string getS(size_t n) const
+ {
+ assert(n < fields.size());
+ assert(fields[n].type == Field::tString);
+ return fields[n].s;
+ }
+
+ uint64_t getI(size_t n) const
+ {
+ assert(n < fields.size());
+ assert(fields[n].type == Field::tInt);
+ return fields[n].i;
+ }
+};
class Logger
{
@@ -32,34 +89,16 @@ public:
virtual void warn(const std::string & msg);
- virtual void setExpected(const std::string & label, uint64_t value = 1) { }
- virtual void setProgress(const std::string & label, uint64_t value = 1) { }
- virtual void incExpected(const std::string & label, uint64_t value = 1) { }
- virtual void incProgress(const std::string & label, uint64_t value = 1) { }
-
-private:
-
- virtual void startActivity(Activity & activity, Verbosity lvl, const FormatOrString & fs) = 0;
-
- virtual void stopActivity(Activity & activity) = 0;
-
-};
-
-class Activity
-{
-public:
- Logger & logger;
-
- Activity(Logger & logger, Verbosity lvl, const FormatOrString & fs)
- : logger(logger)
+ template<typename... Args>
+ void event(EventType type, const Args & ... args)
{
- logger.startActivity(*this, lvl, fs);
+ Event ev;
+ ev.type = type;
+ nop{(ev.fields.emplace_back(Event::Field(args)), 1)...};
+ event(ev);
}
- ~Activity()
- {
- logger.stopActivity(*this);
- }
+ virtual void event(const Event & ev) = 0;
};
extern Logger * logger;
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 1d1f68fc8..16f4b232e 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -372,7 +372,7 @@ void deletePath(const Path & path)
void deletePath(const Path & path, unsigned long long & bytesFreed)
{
- Activity act(*logger, lvlDebug, format("recursively deleting path ‘%1%’") % path);
+ //Activity act(*logger, lvlDebug, format("recursively deleting path ‘%1%’") % path);
bytesFreed = 0;
_deletePath(path, bytesFreed);
}
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 5a9c9513f..7ea32e8d9 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -364,6 +364,8 @@ void ignoreException();
#define ANSI_NORMAL "\e[0m"
#define ANSI_BOLD "\e[1m"
#define ANSI_RED "\e[31;1m"
+#define ANSI_GREEN "\e[32;1m"
+#define ANSI_BLUE "\e[34;1m"
/* Filter out ANSI escape codes from the given string. If ‘nixOnly’ is