diff --git a/crates/uv-settings/Cargo.toml b/crates/uv-settings/Cargo.toml index 0793c9204..0bb003750 100644 --- a/crates/uv-settings/Cargo.toml +++ b/crates/uv-settings/Cargo.toml @@ -50,3 +50,6 @@ url = { workspace = true } ignored = ["uv-options-metadata", "clap"] [dev-dependencies] + +[features] +tracing-durations-export = [] diff --git a/crates/uv-settings/src/lib.rs b/crates/uv-settings/src/lib.rs index 3e0196251..72aca3794 100644 --- a/crates/uv-settings/src/lib.rs +++ b/crates/uv-settings/src/lib.rs @@ -574,6 +574,8 @@ pub struct EnvironmentOptions { pub python_install_registry: Option, pub install_mirrors: PythonInstallMirrors, pub log_context: Option, + #[cfg(feature = "tracing-durations-export")] + pub tracing_durations_file: Option, } impl EnvironmentOptions { @@ -599,6 +601,10 @@ impl EnvironmentOptions { )?, }, log_context: parse_boolish_environment_variable(EnvVars::UV_LOG_CONTEXT)?, + #[cfg(feature = "tracing-durations-export")] + tracing_durations_file: parse_path_environment_variable( + EnvVars::TRACING_DURATIONS_FILE, + ), }) } } @@ -676,6 +682,18 @@ fn parse_string_environment_variable(name: &'static str) -> Result Option { + let value = std::env::var_os(name)?; + + if value.is_empty() { + return None; + } + + Some(PathBuf::from(value)) +} + /// Populate the [`EnvironmentFlags`] from the given [`EnvironmentOptions`]. impl From<&EnvironmentOptions> for EnvironmentFlags { fn from(options: &EnvironmentOptions) -> Self { diff --git a/crates/uv/Cargo.toml b/crates/uv/Cargo.toml index c4c9af821..7c73597ca 100644 --- a/crates/uv/Cargo.toml +++ b/crates/uv/Cargo.toml @@ -167,7 +167,7 @@ performance-memory-allocator = ["dep:uv-performance-memory-allocator"] self-update = ["axoupdater", "uv-cli/self-update"] # Features for development only. -tracing-durations-export = ["dep:tracing-durations-export", "uv-resolver/tracing-durations-export"] +tracing-durations-export = ["dep:tracing-durations-export", "uv-resolver/tracing-durations-export", "uv-settings/tracing-durations-export"] # Features that only apply when running tests, no-ops otherwise. default-tests = [ diff --git a/crates/uv/src/lib.rs b/crates/uv/src/lib.rs index 0b6673ecc..dcd1d1b11 100644 --- a/crates/uv/src/lib.rs +++ b/crates/uv/src/lib.rs @@ -360,7 +360,8 @@ async fn run(mut cli: Cli) -> Result { // Configure the `tracing` crate, which controls internal logging. #[cfg(feature = "tracing-durations-export")] - let (durations_layer, _duration_guard) = logging::setup_durations()?; + let (durations_layer, _duration_guard) = + logging::setup_durations(environment.tracing_durations_file.as_ref())?; #[cfg(not(feature = "tracing-durations-export"))] let durations_layer = None::; logging::setup_logging( diff --git a/crates/uv/src/logging.rs b/crates/uv/src/logging.rs index 1520b4dbc..db34c0ab4 100644 --- a/crates/uv/src/logging.rs +++ b/crates/uv/src/logging.rs @@ -14,8 +14,6 @@ use tracing_tree::time::Uptime; use uv_cli::ColorChoice; use uv_logging::UvFormat; -#[cfg(feature = "tracing-durations-export")] -use uv_static::EnvVars; #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] pub(crate) enum Level { @@ -120,12 +118,13 @@ pub(crate) fn setup_logging( /// Setup the `TRACING_DURATIONS_FILE` environment variable to enable tracing durations. #[cfg(feature = "tracing-durations-export")] -pub(crate) fn setup_durations() -> anyhow::Result<( +pub(crate) fn setup_durations( + tracing_durations_file: Option<&std::path::PathBuf>, +) -> anyhow::Result<( Option>, Option, )> { - if let Ok(location) = std::env::var(EnvVars::TRACING_DURATIONS_FILE) { - let location = std::path::PathBuf::from(location); + if let Some(location) = tracing_durations_file { if let Some(parent) = location.parent() { fs_err::create_dir_all(parent) .context("Failed to create parent of TRACING_DURATIONS_FILE")?; @@ -141,7 +140,7 @@ pub(crate) fn setup_durations() -> anyhow::Result<( ..PlotConfig::default() }; let (layer, guard) = DurationsLayerBuilder::default() - .durations_file(&location) + .durations_file(location) .plot_file(location.with_extension("svg")) .plot_config(plot_config) .build()