diff --git a/src/libmain/progress-bar.cc b/src/libmain/progress-bar.cc index b3b46fc21..28bb14863 100644 --- a/src/libmain/progress-bar.cc +++ b/src/libmain/progress-bar.cc @@ -402,31 +402,59 @@ std::string ProgressBar::getStatus(State & state) expected = std::max(expected, act.expected); - std::string s; + std::string rendered; if (running || done || expected || failed) { - if (running) - if (expected != 0) - s = fmt(ANSI_BLUE + numberFmt + ANSI_NORMAL "/" ANSI_GREEN + numberFmt + ANSI_NORMAL "/" + numberFmt, - running / unit, done / unit, expected / unit); - else - s = fmt(ANSI_BLUE + numberFmt + ANSI_NORMAL "/" ANSI_GREEN + numberFmt + ANSI_NORMAL, - running / unit, done / unit); - else if (expected != done) - if (expected != 0) - s = fmt(ANSI_GREEN + numberFmt + ANSI_NORMAL "/" + numberFmt, - done / unit, expected / unit); - else - s = fmt(ANSI_GREEN + numberFmt + ANSI_NORMAL, done / unit); - else - s = fmt(done ? ANSI_GREEN + numberFmt + ANSI_NORMAL : numberFmt, done / unit); - s = fmt(itemFmt, s); + if (running) { + if (expected != 0) { + auto const runningPart = fmt(numberFmt, running / unit); + auto const donePart = fmt(numberFmt, done / unit); + auto const expectedPart = fmt(numberFmt, expected / unit); + rendered = fmt( + ANSI_BLUE "%s" ANSI_NORMAL "/" ANSI_GREEN "%s" ANSI_NORMAL "/%s", + runningPart, + donePart, + expectedPart + ); + } else { + auto const runningPart = fmt(numberFmt, running / unit); + auto const donePart = fmt(numberFmt, done / unit); + rendered = fmt( + ANSI_BLUE "%s" ANSI_NORMAL "/" ANSI_GREEN "%s" ANSI_NORMAL, + runningPart, + donePart + ); + } + } else if (expected != done) { + if (expected != 0) { + auto const donePart = fmt(numberFmt, done / unit); + auto const expectedPart = fmt(numberFmt, expected / unit); + rendered = fmt( + ANSI_GREEN "%s" ANSI_NORMAL "/%s", + donePart, + expectedPart + ); + } else { + auto const donePart = fmt(numberFmt, done / unit); + rendered = fmt(ANSI_GREEN "%s" ANSI_NORMAL, donePart); + } + } else { + auto const donePart = fmt(numberFmt, done / unit); + + // We only color if `done` is non-zero. + if (done) { + rendered = concatStrings(ANSI_GREEN, donePart, ANSI_NORMAL); + } else { + rendered = donePart; + } + } + rendered = fmt(itemFmt, rendered); if (failed) - s += fmt(" (" ANSI_RED "%d failed" ANSI_NORMAL ")", failed / unit); + rendered += fmt(" (" ANSI_RED "%d failed" ANSI_NORMAL ")", failed / unit); } - return s; + return rendered; }; auto showActivity = [&](ActivityType type, const std::string & itemFmt, const std::string & numberFmt = "%d", double unit = 1) { diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 115b979f8..3cead4296 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -14,23 +14,71 @@ typedef enum { actRealise = 102, actCopyPaths = 103, actBuilds = 104, + + /** Fields: + * 0: string: path to store derivation being built. + * 1: string: representing the machine this is being built on. Empty string if local machine. + * 2: int: curRound, not used anymore, always 1? + * 3: int: nrRounds, not used anymore always 1? + */ actBuild = 105, actOptimiseStore = 106, actVerifyPaths = 107, + + /** Fields: + * 0: string: store path + * 1: string: substituter + */ actSubstitute = 108, + + /** Fields: + * 0: string: store path + * 1: string: substituter + */ actQueryPathInfo = 109, + + /** Fields: + * 0: string: store path + */ actPostBuildHook = 110, actBuildWaiting = 111, } ActivityType; typedef enum { + /** Fields: + * 0: int: bytes linked + */ resFileLinked = 100, + + /** Fields: + * 0: string: last line + */ resBuildLogLine = 101, resUntrustedPath = 102, resCorruptedPath = 103, + + /** Fields: + * 0: string: phase name + */ resSetPhase = 104, + + /** Fields: + * 0: int: done + * 1: int: expected + * 2: int: running + * 3: int: failed + */ resProgress = 105, + + /** Fields: + * 0: int: ActivityType + * 1: int: expected + */ resSetExpected = 106, + + /** Fields: + * 0: string: last line + */ resPostBuildLogLine = 107, } ResultType;