From 446aba33a179090e991554168006432ce8e16037 Mon Sep 17 00:00:00 2001 From: konstin Date: Wed, 11 Feb 2026 14:25:54 +0100 Subject: [PATCH] Fix panic in `debug!` log --- crates/uv-workspace/src/workspace.rs | 15 ++++++--- crates/uv/tests/it/workspace.rs | 47 ++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/crates/uv-workspace/src/workspace.rs b/crates/uv-workspace/src/workspace.rs index 0f64dfea500e9..e1a1da6096e9e 100644 --- a/crates/uv-workspace/src/workspace.rs +++ b/crates/uv-workspace/src/workspace.rs @@ -1092,10 +1092,17 @@ impl Workspace { .and_then(|uv| uv.managed) == Some(false) { - debug!( - "Project `{}` is marked as unmanaged; omitting from workspace members", - pyproject_toml.project.as_ref().unwrap().name - ); + if let Some(project) = pyproject_toml.project.as_ref() { + debug!( + "Project `{}` is marked as unmanaged; omitting from workspace members", + project.name + ); + } else { + debug!( + "Workspace member at `{}` is marked as unmanaged; omitting from workspace members", + member_root.simplified_display() + ); + } continue; } diff --git a/crates/uv/tests/it/workspace.rs b/crates/uv/tests/it/workspace.rs index 3fe9e5384dc09..839ad050bf8f7 100644 --- a/crates/uv/tests/it/workspace.rs +++ b/crates/uv/tests/it/workspace.rs @@ -2277,3 +2277,50 @@ fn workspace_members_with_complex_relative_paths() -> Result<()> { Ok(()) } + +/// Ensure that an unmanaged workspace member without a `[project]` section doesn't panic. +/// +/// Uses `--verbose` to exercise the `debug!` log path, which previously panicked on +/// `.unwrap()` when the `[project]` section was missing. +#[test] +fn workspace_unmanaged_member_no_project() -> Result<()> { + let context = uv_test::test_context!("3.12"); + + let workspace = context.temp_dir.child("workspace"); + workspace.child("pyproject.toml").write_str(indoc! {r#" + [project] + name = "root" + version = "0.1.0" + requires-python = ">=3.12" + + [tool.uv.workspace] + members = ["member"] + + [build-system] + requires = ["uv_build>=0.9.0,<10000"] + build-backend = "uv_build" + "#})?; + + fs_err::create_dir_all(workspace.join("src").join("root"))?; + fs_err::write(workspace.join("src").join("root").join("__init__.py"), "")?; + + // Create a workspace member with `managed = false` but no `[project]` section. + let member = workspace.join("member"); + fs_err::create_dir_all(&member)?; + fs_err::write( + member.join("pyproject.toml"), + indoc! {" + [tool.uv] + managed = false + "}, + )?; + + context + .lock() + .arg("--verbose") + .current_dir(&workspace) + .assert() + .success(); + + Ok(()) +}