From ce4dee0fa55b15d89e443bdce247a204bf3abeb1 Mon Sep 17 00:00:00 2001 From: Qyriad Date: Thu, 20 Jun 2024 13:50:31 -0600 Subject: [PATCH 1/2] mildly refactor the renderActivity if hell-chain This is primarily for readability, but iwrc chaining std::string's operator+ is also pretty scuffed performance-wise, and this was doing a lot of operator+ chainging. Change-Id: I9f25235df153eb2bbb491f1ff7ebbeed9a8ec985 --- src/libmain/progress-bar.cc | 66 ++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 19 deletions(-) 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) { From 701eb332bd1a3a4196050aa78ee90521279349cb Mon Sep 17 00:00:00 2001 From: Qyriad Date: Thu, 20 Jun 2024 18:00:25 -0600 Subject: [PATCH 2/2] doc-comment Fields for Activity and Result types The ones we were able to figure out, at least. Change-Id: I697f4f3942e35a7adf1b2a6cc28b3168d1de111c --- src/libutil/logging.hh | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) 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;