diff --git a/crates/uv/src/commands/version.rs b/crates/uv/src/commands/version.rs index 07418306c..d849ee86e 100644 --- a/crates/uv/src/commands/version.rs +++ b/crates/uv/src/commands/version.rs @@ -9,6 +9,7 @@ use uv_cli::version::VersionInfo; use uv_cli::{VersionBump, VersionFormat}; use uv_fs::Simplified; use uv_pep440::Version; +use uv_warnings::warn_user; use uv_workspace::pyproject_mut::Error; use uv_workspace::{ pyproject_mut::{DependencyTarget, PyProjectTomlMut}, @@ -42,25 +43,20 @@ pub(crate) async fn project_version( printer: Printer, ) -> Result { // Read the metadata - let workspace = - match Workspace::discover(project_dir, &DiscoveryOptions::default(), cache).await { - Ok(workspace) => workspace, - Err(err) => { - // If strict, hard bail on missing workspace - if strict { - return Err(err)?; - } - // Otherwise, warn and provide fallback - writeln!( - printer.stderr(), - r"warning: failed to read project: {err} - running `uv self version` for compatibility with old `uv version` command. - this fallback will be removed soon, pass `--preview` to make this an error. -" - )?; - return self_version(short, output_format, printer); + let workspace = match Workspace::discover(project_dir, &DiscoveryOptions::default(), cache) + .await + { + Ok(workspace) => workspace, + Err(err) => { + // If strict, hard bail on missing workspace + if strict { + return Err(err)?; } - }; + // Otherwise, warn and provide fallback + warn_user!("Failed to read project metadata ({err}). Running `{}` for compatibility. This fallback will be removed in the future; pass `--preview` to force an error.", "uv self version".green()); + return self_version(short, output_format, printer); + } + }; let mut pyproject = PyProjectTomlMut::from_toml( &workspace.pyproject_toml().raw, diff --git a/crates/uv/tests/it/version.rs b/crates/uv/tests/it/version.rs index a192de951..81f3a3fce 100644 --- a/crates/uv/tests/it/version.rs +++ b/crates/uv/tests/it/version.rs @@ -840,9 +840,7 @@ fn version_get_fallback_unmanaged() -> Result<()> { uv [VERSION] ([COMMIT] DATE) ----- stderr ----- - warning: failed to read project: The project is marked as unmanaged: `[TEMP_DIR]/` - running `uv self version` for compatibility with old `uv version` command. - this fallback will be removed soon, pass `--preview` to make this an error. + warning: Failed to read project metadata (The project is marked as unmanaged: `[TEMP_DIR]/`). Running `uv self version` for compatibility. This fallback will be removed in the future; pass `--preview` to force an error. "); let pyproject = fs_err::read_to_string(&pyproject_toml)?; @@ -893,9 +891,7 @@ fn version_get_fallback_unmanaged_short() -> Result<()> { [VERSION] ([COMMIT] DATE) ----- stderr ----- - warning: failed to read project: The project is marked as unmanaged: `[TEMP_DIR]/` - running `uv self version` for compatibility with old `uv version` command. - this fallback will be removed soon, pass `--preview` to make this an error. + warning: Failed to read project metadata (The project is marked as unmanaged: `[TEMP_DIR]/`). Running `uv self version` for compatibility. This fallback will be removed in the future; pass `--preview` to force an error. "); let pyproject = fs_err::read_to_string(&pyproject_toml)?; @@ -966,9 +962,7 @@ fn version_get_fallback_unmanaged_json() -> Result<()> { } ----- stderr ----- - warning: failed to read project: The project is marked as unmanaged: `[TEMP_DIR]/` - running `uv self version` for compatibility with old `uv version` command. - this fallback will be removed soon, pass `--preview` to make this an error. + warning: Failed to read project metadata (The project is marked as unmanaged: `[TEMP_DIR]/`). Running `uv self version` for compatibility. This fallback will be removed in the future; pass `--preview` to force an error. "#); let pyproject = fs_err::read_to_string(&pyproject_toml)?;