From fb19d87768bd9a57655f6f7ee19d999b301f7bf2 Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Wed, 14 Aug 2024 08:57:26 +0200 Subject: [PATCH] wip --- src/docbuilder/rustwide_builder.rs | 47 +++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index 187a43761..8a09db768 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -24,6 +24,7 @@ use rustwide::logging::{self, LogStorage}; use rustwide::toolchain::ToolchainError; use rustwide::{AlternativeRegistry, Build, Crate, Toolchain, Workspace, WorkspaceBuilder}; use std::collections::{HashMap, HashSet}; +use std::fmt::Display; use std::fs; use std::path::Path; use std::sync::Arc; @@ -36,6 +37,28 @@ const COMPONENTS: &[&str] = &["llvm-tools-preview", "rustc-dev", "rustfmt"]; const DUMMY_CRATE_NAME: &str = "empty-library"; const DUMMY_CRATE_VERSION: &str = "1.0.0"; +#[derive(thiserror::Error, Debug)] +struct CommandErrorWithOutput { + #[source] + err: CommandError, + output: String, +} + +fn capture_error_output(cmd: Command) -> Result<(), CommandErrorWithOutput> { + let storage = LogStorage::new(log::LevelFilter::Info); + let result = logging::capture(&storage, || cmd.log_output(true).run()); + result.map_err(|err| CommandErrorWithOutput { + err, + output: storage.to_string(), + }) +} + +impl Display for CommandErrorWithOutput { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}\nCaptured output: {}", self.err, self.output) + } +} + fn get_configured_toolchain(conn: &mut Client) -> Result { let name: String = get_config(conn, ConfigName::Toolchain)?.unwrap_or_else(|| "nightly".into()); @@ -482,17 +505,19 @@ impl RustwideBuilder { std::fs::remove_file(cargo_lock)?; { let _span = info_span!("cargo_generate_lockfile").entered(); - Command::new(&self.workspace, self.toolchain.cargo()) - .cd(build.host_source_dir()) - .args(&["generate-lockfile"]) - .run()?; + capture_error_output( + Command::new(&self.workspace, self.toolchain.cargo()) + .cd(build.host_source_dir()) + .args(&["generate-lockfile"]), + )?; } { let _span = info_span!("cargo fetch --locked").entered(); - Command::new(&self.workspace, self.toolchain.cargo()) - .cd(build.host_source_dir()) - .args(&["fetch", "--locked"]) - .run()?; + capture_error_output( + Command::new(&self.workspace, self.toolchain.cargo()) + .cd(build.host_source_dir()) + .args(&["fetch", "--locked"]), + )?; } res = self.execute_build(default_target, true, build, &limits, &metadata, false)?; @@ -827,12 +852,6 @@ impl RustwideBuilder { }) } - fn capture_output(f: impl FnOnce() -> R) -> (R, String) { - let storage = LogStorage::new(log::LevelFilter::Info); - let result = logging::capture(&storage, f); - (result, storage.to_string()) - } - fn prepare_command<'ws, 'pl>( &self, build: &'ws Build,