diff --git a/crates/wkg/src/wit.rs b/crates/wkg/src/wit.rs index 38c7cdc..f0ba6be 100644 --- a/crates/wkg/src/wit.rs +++ b/crates/wkg/src/wit.rs @@ -155,7 +155,12 @@ pub async fn temp_wit_file(package: &PackageRef, bytes: &[u8]) -> anyhow::Result impl FetchArgs { pub async fn run(self) -> anyhow::Result<()> { let cwd = std::env::current_dir()?; - let root = Manifest::load_root_workspace(&cwd).await?; + let mut root = Manifest::load_root_workspace(&cwd).await?; + if root.as_ref().is_some_and(|root| root.root_dir() != cwd) + && tokio::fs::try_exists(cwd.join(MANIFEST_FILE_NAME)).await? + { + root = None; + } let dirs = if let Some(dir) = self.dir.clone() { vec![dir] diff --git a/crates/wkg/tests/e2e.rs b/crates/wkg/tests/e2e.rs index 29858d1..7389ed7 100644 --- a/crates/wkg/tests/e2e.rs +++ b/crates/wkg/tests/e2e.rs @@ -250,6 +250,25 @@ async fn fetch_workspace_packages() { } } +#[tokio::test] +async fn fetch_from_member_manifest_uses_member_context() { + let fixture = common::load_fixture("fetch-workspace-member").await; + let member = fixture.fixture_path.join("member/wit"); + let mut command = fixture.command(); + command.current_dir(&member).args(["fetch", "."]); + + let status = command.status().await.expect("spawn wkg fetch"); + assert!(status.success(), "member fetch should succeed"); + assert!( + member.join("wkg.lock").exists(), + "member fetch should create a member lock file" + ); + assert!( + !fixture.fixture_path.join("wkg.lock").exists(), + "member fetch should not create a workspace lock file" + ); +} + #[tokio::test] pub async fn check() { // Use an explicit config that maps `wasi` to `wasi.dev`. diff --git a/crates/wkg/tests/fixtures/fetch-workspace-member/member/wit/wkg.toml b/crates/wkg/tests/fixtures/fetch-workspace-member/member/wit/wkg.toml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/crates/wkg/tests/fixtures/fetch-workspace-member/member/wit/wkg.toml @@ -0,0 +1 @@ + diff --git a/crates/wkg/tests/fixtures/fetch-workspace-member/member/wit/world.wit b/crates/wkg/tests/fixtures/fetch-workspace-member/member/wit/world.wit new file mode 100644 index 0000000..c8aef2a --- /dev/null +++ b/crates/wkg/tests/fixtures/fetch-workspace-member/member/wit/world.wit @@ -0,0 +1,3 @@ +package test:member; + +world member {} diff --git a/crates/wkg/tests/fixtures/fetch-workspace-member/wkg.toml b/crates/wkg/tests/fixtures/fetch-workspace-member/wkg.toml new file mode 100644 index 0000000..c03ae07 --- /dev/null +++ b/crates/wkg/tests/fixtures/fetch-workspace-member/wkg.toml @@ -0,0 +1,2 @@ +[workspace] +members = ["member/wit"]