Simplify
This commit is contained in:
parent
9b845e6936
commit
94a0548dc4
3 changed files with 56 additions and 29 deletions
|
@ -2401,6 +2401,19 @@ struct BuilderLogger : Logger
|
||||||
|
|
||||||
BuilderLogger(Logger & prevLogger) : prevLogger(prevLogger) { }
|
BuilderLogger(Logger & prevLogger) : prevLogger(prevLogger) { }
|
||||||
|
|
||||||
|
void addFields(nlohmann::json & json, const Fields & fields)
|
||||||
|
{
|
||||||
|
if (fields.empty()) return;
|
||||||
|
auto & arr = json["fields"] = nlohmann::json::array();
|
||||||
|
for (auto & f : fields)
|
||||||
|
if (f.type == Logger::Field::tInt)
|
||||||
|
arr.push_back(f.i);
|
||||||
|
else if (f.type == Logger::Field::tString)
|
||||||
|
arr.push_back(f.s);
|
||||||
|
else
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
void log(Verbosity lvl, const FormatOrString & fs) override
|
void log(Verbosity lvl, const FormatOrString & fs) override
|
||||||
{
|
{
|
||||||
prevLogger.log(lvl, fs);
|
prevLogger.log(lvl, fs);
|
||||||
|
@ -2414,7 +2427,8 @@ struct BuilderLogger : Logger
|
||||||
json["id"] = act;
|
json["id"] = act;
|
||||||
json["type"] = type;
|
json["type"] = type;
|
||||||
json["text"] = s;
|
json["text"] = s;
|
||||||
// FIXME: handle fields, parent
|
addFields(json, fields);
|
||||||
|
// FIXME: handle parent
|
||||||
log(lvlError, "@nix " + json.dump());
|
log(lvlError, "@nix " + json.dump());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2426,15 +2440,13 @@ struct BuilderLogger : Logger
|
||||||
log(lvlError, "@nix " + json.dump());
|
log(lvlError, "@nix " + json.dump());
|
||||||
}
|
}
|
||||||
|
|
||||||
void progress(ActivityId act, uint64_t done = 0, uint64_t expected = 0, uint64_t running = 0, uint64_t failed = 0) override
|
void result(ActivityId act, ResultType type, const Fields & fields) override
|
||||||
{
|
{
|
||||||
nlohmann::json json;
|
nlohmann::json json;
|
||||||
json["action"] = "progress";
|
json["action"] = "result";
|
||||||
json["id"] = act;
|
json["id"] = act;
|
||||||
json["done"] = done;
|
json["type"] = type;
|
||||||
json["expected"] = expected;
|
addFields(json, fields);
|
||||||
json["running"] = running;
|
|
||||||
json["failed"] = failed;
|
|
||||||
log(lvlError, "@nix " + json.dump());
|
log(lvlError, "@nix " + json.dump());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -3299,6 +3311,20 @@ void DerivationGoal::handleEOF(int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Logger::Fields getFields(nlohmann::json & json)
|
||||||
|
{
|
||||||
|
Logger::Fields fields;
|
||||||
|
for (auto & f : json) {
|
||||||
|
if (f.type() == nlohmann::json::value_t::number_unsigned)
|
||||||
|
fields.emplace_back(Logger::Field(f.get<uint64_t>()));
|
||||||
|
else if (f.type() == nlohmann::json::value_t::string)
|
||||||
|
fields.emplace_back(Logger::Field(f.get<std::string>()));
|
||||||
|
else throw Error("unsupported JSON type %d", (int) f.type());
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DerivationGoal::flushLine()
|
void DerivationGoal::flushLine()
|
||||||
{
|
{
|
||||||
if (hasPrefix(currentLogLine, "@nix ")) {
|
if (hasPrefix(currentLogLine, "@nix ")) {
|
||||||
|
@ -3313,16 +3339,16 @@ void DerivationGoal::flushLine()
|
||||||
if (type == actDownload)
|
if (type == actDownload)
|
||||||
builderActivities.emplace(std::piecewise_construct,
|
builderActivities.emplace(std::piecewise_construct,
|
||||||
std::forward_as_tuple(json["id"]),
|
std::forward_as_tuple(json["id"]),
|
||||||
std::forward_as_tuple(*logger, type, json["text"], Logger::Fields{}, act->id));
|
std::forward_as_tuple(*logger, type, json["text"], getFields(json["fields"]), act->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (action == "stop")
|
else if (action == "stop")
|
||||||
builderActivities.erase((ActivityId) json["id"]);
|
builderActivities.erase((ActivityId) json["id"]);
|
||||||
|
|
||||||
else if (action == "progress") {
|
else if (action == "result") {
|
||||||
auto i = builderActivities.find((ActivityId) json["id"]);
|
auto i = builderActivities.find((ActivityId) json["id"]);
|
||||||
if (i != builderActivities.end())
|
if (i != builderActivities.end())
|
||||||
i->second.progress(json.value("done", 0), json.value("expected", 0), json.value("running", 0), json.value("failed", 0));
|
i->second.result((ResultType) json["type"], getFields(json["fields"]));
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (action == "setPhase") {
|
else if (action == "setPhase") {
|
||||||
|
|
|
@ -32,6 +32,7 @@ typedef enum {
|
||||||
resUntrustedPath = 102,
|
resUntrustedPath = 102,
|
||||||
resCorruptedPath = 103,
|
resCorruptedPath = 103,
|
||||||
resSetPhase = 104,
|
resSetPhase = 104,
|
||||||
|
resProgress = 105,
|
||||||
} ResultType;
|
} ResultType;
|
||||||
|
|
||||||
typedef uint64_t ActivityId;
|
typedef uint64_t ActivityId;
|
||||||
|
@ -71,8 +72,6 @@ public:
|
||||||
|
|
||||||
virtual void stopActivity(ActivityId act) { };
|
virtual void stopActivity(ActivityId act) { };
|
||||||
|
|
||||||
virtual void progress(ActivityId act, uint64_t done = 0, uint64_t expected = 0, uint64_t running = 0, uint64_t failed = 0) { };
|
|
||||||
|
|
||||||
virtual void setExpected(ActivityId act, ActivityType type, uint64_t expected) { };
|
virtual void setExpected(ActivityId act, ActivityType type, uint64_t expected) { };
|
||||||
|
|
||||||
virtual void result(ActivityId act, ResultType type, const Fields & fields) { };
|
virtual void result(ActivityId act, ResultType type, const Fields & fields) { };
|
||||||
|
@ -95,16 +94,21 @@ struct Activity
|
||||||
{ logger.stopActivity(id); }
|
{ logger.stopActivity(id); }
|
||||||
|
|
||||||
void progress(uint64_t done = 0, uint64_t expected = 0, uint64_t running = 0, uint64_t failed = 0) const
|
void progress(uint64_t done = 0, uint64_t expected = 0, uint64_t running = 0, uint64_t failed = 0) const
|
||||||
{ logger.progress(id, done, expected, running, failed); }
|
{ result(resProgress, done, expected, running, failed); }
|
||||||
|
|
||||||
void setExpected(ActivityType type2, uint64_t expected) const
|
void setExpected(ActivityType type2, uint64_t expected) const
|
||||||
{ logger.setExpected(id, type2, expected); }
|
{ logger.setExpected(id, type2, expected); }
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void result(ResultType type, const Args & ... args)
|
void result(ResultType type, const Args & ... args) const
|
||||||
{
|
{
|
||||||
Logger::Fields fields;
|
Logger::Fields fields;
|
||||||
nop{(fields.emplace_back(Logger::Field(args)), 1)...};
|
nop{(fields.emplace_back(Logger::Field(args)), 1)...};
|
||||||
|
result(type, fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
void result(ResultType type, const Logger::Fields & fields) const
|
||||||
|
{
|
||||||
logger.result(id, type, fields);
|
logger.result(id, type, fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -192,21 +192,6 @@ public:
|
||||||
update(*state);
|
update(*state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void progress(ActivityId act, uint64_t done = 0, uint64_t expected = 0, uint64_t running = 0, uint64_t failed = 0) override
|
|
||||||
{
|
|
||||||
auto state(state_.lock());
|
|
||||||
|
|
||||||
auto i = state->its.find(act);
|
|
||||||
assert(i != state->its.end());
|
|
||||||
ActInfo & actInfo = *i->second;
|
|
||||||
actInfo.done = done;
|
|
||||||
actInfo.expected = expected;
|
|
||||||
actInfo.running = running;
|
|
||||||
actInfo.failed = failed;
|
|
||||||
|
|
||||||
update(*state);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setExpected(ActivityId act, ActivityType type, uint64_t expected) override
|
void setExpected(ActivityId act, ActivityType type, uint64_t expected) override
|
||||||
{
|
{
|
||||||
auto state(state_.lock());
|
auto state(state_.lock());
|
||||||
|
@ -260,6 +245,18 @@ public:
|
||||||
auto i = state->its.find(act);
|
auto i = state->its.find(act);
|
||||||
assert(i != state->its.end());
|
assert(i != state->its.end());
|
||||||
i->second->phase = getS(fields, 0);
|
i->second->phase = getS(fields, 0);
|
||||||
|
update(*state);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (type == resProgress) {
|
||||||
|
auto i = state->its.find(act);
|
||||||
|
assert(i != state->its.end());
|
||||||
|
ActInfo & actInfo = *i->second;
|
||||||
|
actInfo.done = getI(fields, 0);
|
||||||
|
actInfo.expected = getI(fields, 1);
|
||||||
|
actInfo.running = getI(fields, 2);
|
||||||
|
actInfo.failed = getI(fields, 3);
|
||||||
|
update(*state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue