Improve progress indicator
This commit is contained in:
parent
e80257f122
commit
b01d62285c
26 changed files with 339 additions and 168 deletions
|
@ -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++) { };
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue