aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-07 02:31:59 +0100
committereldritch horrors <pennae@lix.systems>2024-03-06 19:11:12 -0700
commit706f0df55b4aaf7d0441227338bd4bec7121fe67 (patch)
tree7491b5df315fa1acba7de7b149b9b41b6d93b22f /src
parent6f36a8834c1d7a2de548a943ec93a4ad02e27083 (diff)
Merge pull request #9280 from R-VdP/rvdp/fix_remote_logging_phase_reporting
Include phase reporting in log file for ssh-ng builds (cherry picked from commit b1e7d7cad625095656fff05ac4aedeb12135110a) Change-Id: I4076669b0ba160412f7c628ca9113f9abbc8c303
Diffstat (limited to 'src')
-rw-r--r--src/libstore/build/derivation-goal.cc23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc
index 01643605f..dadaccbcf 100644
--- a/src/libstore/build/derivation-goal.cc
+++ b/src/libstore/build/derivation-goal.cc
@@ -1340,9 +1340,26 @@ void DerivationGoal::handleChildOutput(int fd, std::string_view data)
auto s = handleJSONLogMessage(*json, worker.act, hook->activities, true);
// ensure that logs from a builder using `ssh-ng://` as protocol
// are also available to `nix log`.
- if (s && !isWrittenToLog && logSink && (*json)["type"] == resBuildLogLine) {
- auto f = (*json)["fields"];
- (*logSink)((f.size() > 0 ? f.at(0).get<std::string>() : "") + "\n");
+ if (s && !isWrittenToLog && logSink) {
+ const auto type = (*json)["type"];
+ const auto fields = (*json)["fields"];
+ if (type == resBuildLogLine) {
+ (*logSink)((fields.size() > 0 ? fields[0].get<std::string>() : "") + "\n");
+ } else if (type == resSetPhase && ! fields.is_null()) {
+ const auto phase = fields[0];
+ if (! phase.is_null()) {
+ // nixpkgs' stdenv produces lines in the log to signal
+ // phase changes.
+ // We want to get the same lines in case of remote builds.
+ // The format is:
+ // @nix { "action": "setPhase", "phase": "$curPhase" }
+ const auto logLine = nlohmann::json::object({
+ {"action", "setPhase"},
+ {"phase", phase}
+ });
+ (*logSink)("@nix " + logLine.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace) + "\n");
+ }
+ }
}
}
currentHookLine.clear();