git.delta.rocks / jrsonnet / refs/commits / f28c97b01543

difftreelog

fix logs may contain non-utf8 lines, use lossy conversion

nruokynsYaroslav Bolyukin2025-09-10parent: #3a7032e.patch.diff
in: trunk

2 files changed

modifiedcrates/nix-eval/src/logging.ccdiffbeforeafterboth
before · crates/nix-eval/src/logging.cc
1#include "nix-eval/src/logging.rs"2#include "logging.hh"3#include <nix/util/logging.hh>45using namespace nix;67struct TracingLogger : Logger {8  TracingLogger() {}910  bool isVerbose() override { return true; }11  void log(Verbosity lvl, std::string_view s) override {12    rust::Str str(s.data(), s.size());13    emit_log(lvl, str);14  }15  void logEI(const ErrorInfo &ei) override { emit_log(ei.level, ei.msg.str()); }1617  void startActivity(ActivityId act, Verbosity lvl, ActivityType type,18                     const std::string &s, const Fields &fields,19                     ActivityId parent) override {20    auto b = new_start_activity(act, lvl, type);21    for (auto &f : fields) {22      if (f.type == Logger::Field::tInt) {23        b->add_int_field(f.i);24      } else if (f.type == Logger::Field::tString) {25        b->add_string_field(f.s);26      } else {27        unreachable();28      }29    }30    b->emit(parent, s);31  };3233  void stopActivity(ActivityId act) override { emit_stop(act); };3435  void result(ActivityId act, ResultType type, const Fields &fields) override {36    auto b = new_start_activity(act, 0, type);37    for (auto &f : fields) {38      if (f.type == Logger::Field::tInt) {39        b->add_int_field(f.i);40      } else if (f.type == Logger::Field::tString) {41        b->add_string_field(f.s);42      } else {43        unreachable();44      }45    }46    b->emit_result(type);47  };4849  void writeToStdout(std::string_view s) override {50    emit_warn("writeToStdout() called, but unsupported");51  }52  void warn(const std::string &msg) override { emit_warn(msg); }5354  virtual std::optional<char> ask(std::string_view s) {55    emit_warn("ask() called, but unsupported");56    return {};57  }58};5960extern "C" {61void apply_tracing_logger() {62  logger = std::make_unique<TracingLogger>();63  // verbosity = lvlVomit;64}65}
after · crates/nix-eval/src/logging.cc
1#include "nix-eval/src/logging.rs"2#include "logging.hh"3#include <nix/util/logging.hh>45using namespace nix;67struct TracingLogger : Logger {8  TracingLogger() {}910  bool isVerbose() override { return true; }11  void log(Verbosity lvl, std::string_view s) override {12    rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s.data()), s.size());13    emit_log(lvl, str);14  }15  void logEI(const ErrorInfo &ei) override {16    auto s = ei.msg.str();17    rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s.data()), s.size());18    emit_log(ei.level, str);19  }2021  void startActivity(ActivityId act, Verbosity lvl, ActivityType type,22                     const std::string &s, const Fields &fields,23                     ActivityId parent) override {24    auto b = new_start_activity(act, lvl, type);25    for (auto &f : fields) {26      if (f.type == Logger::Field::tInt) {27        b->add_int_field(f.i);28      } else if (f.type == Logger::Field::tString) {29        auto s = &f.s;30        rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s->data()), s->size());31        b->add_string_field(str);32      } else {33        unreachable();34      }35    }36    b->emit(parent, s);37  };3839  void stopActivity(ActivityId act) override { emit_stop(act); };4041  void result(ActivityId act, ResultType type, const Fields &fields) override {42    auto b = new_start_activity(act, 0, type);43    for (auto &f : fields) {44      if (f.type == Logger::Field::tInt) {45        b->add_int_field(f.i);46      } else if (f.type == Logger::Field::tString) {47        auto s = &f.s;48        rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s->data()), s->size());49        b->add_string_field(str);50      } else {51        unreachable();52      }53    }54    b->emit_result(type);55  };5657  void writeToStdout(std::string_view s) override {58    emit_warn("writeToStdout() called, but unsupported");59  }60  void warn(const std::string &msg) override { emit_warn(msg); }6162  virtual std::optional<char> ask(std::string_view s) {63    emit_warn("ask() called, but unsupported");64    return {};65  }66};6768extern "C" {69void apply_tracing_logger() {70  logger = std::make_unique<TracingLogger>();71  // verbosity = lvlVomit;72}73}
modifiedcrates/nix-eval/src/logging.rsdiffbeforeafterboth
--- a/crates/nix-eval/src/logging.rs
+++ b/crates/nix-eval/src/logging.rs
@@ -300,8 +300,9 @@
 	fn add_int_field(&mut self, i: i32) {
 		self.fields.push(FieldValue::Int(i));
 	}
-	fn add_string_field(&mut self, v: &str) {
-		self.fields.push(FieldValue::Str(v.to_owned()));
+	fn add_string_field(&mut self, v: &[u8]) {
+		let v = String::from_utf8_lossy(v);
+		self.fields.push(FieldValue::Str(v.to_string()));
 	}
 	fn emit(&mut self, parent: u64, s: &str) {
 		let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");
@@ -455,9 +456,10 @@
 	let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");
 	mapping.remove(&v);
 }
-fn emit_log(lvl: u32, v: &str) {
+fn emit_log(lvl: u32, v: &[u8]) {
 	let verbosity = Verbosity::from_int(lvl);
 	let level: Level = verbosity.into();
+	let v = String::from_utf8_lossy(v);
 	if level == Level::ERROR {
 		error!(target: "nix", "{v}")
 	} else if level == Level::WARN {
@@ -539,13 +541,13 @@
 		type StartActivityBuilder;
 		fn new_start_activity(activity_id: u64, lvl: u32, typ: u32) -> Box<StartActivityBuilder>;
 		fn add_int_field(&mut self, i: i32);
-		fn add_string_field(&mut self, v: &str);
+		fn add_string_field(&mut self, v: &[u8]);
 		fn emit(&mut self, parent: u64, s: &str);
 		fn emit_result(&mut self, ty: u32);
 
 		fn emit_warn(v: &str);
 		fn emit_stop(id: u64);
-		fn emit_log(lvl: u32, v: &str);
+		fn emit_log(lvl: u32, v: &[u8]);
 	}
 	unsafe extern "C++" {
 		include!("nix-eval/src/logging.hh");