From c9a175af54f8f58a73f61a84d22879d59088aab4 Mon Sep 17 00:00:00 2001 From: Hare Date: Sat, 30 May 2026 01:51:49 +0900 Subject: [PATCH] fix: ignore user manifest for profiles --- crates/pod/src/main.rs | 58 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/crates/pod/src/main.rs b/crates/pod/src/main.rs index 8a8b39d1..c900348b 100644 --- a/crates/pod/src/main.rs +++ b/crates/pod/src/main.rs @@ -88,18 +88,23 @@ fn resolve_manifest_with_user_manifest_env( cli: &Cli, user_manifest_env: Option, ) -> Result<(PodManifest, PromptLoader), String> { - let user_manifest = paths::user_manifest_path_from_env(user_manifest_env); + resolve_manifest_with_user_manifest_env_and_profile_loader(cli, user_manifest_env, load_profile) +} +fn resolve_manifest_with_user_manifest_env_and_profile_loader( + cli: &Cli, + user_manifest_env: Option, + load_profile_fn: F, +) -> Result<(PodManifest, PromptLoader), String> +where + F: FnOnce(&Path, Option<&str>) -> Result<(PodManifest, PromptLoader), String>, +{ if let Some(path) = &cli.profile { - if user_manifest.is_some() { - return Err(format!( - "--profile cannot be used when {} is set", - paths::USER_MANIFEST_ENV - )); - } - return load_profile(path, cli.profile_pod_name.as_deref()); + return load_profile_fn(path, cli.profile_pod_name.as_deref()); } + let user_manifest = paths::user_manifest_path_from_env(user_manifest_env); + if let Some(path) = &cli.manifest { if user_manifest.is_some() { return Err(format!( @@ -446,6 +451,43 @@ permission = "write" assert!(err.contains(paths::USER_MANIFEST_ENV)); } + #[test] + fn profile_ignores_non_empty_user_manifest_env() { + let tmp = TempDir::new().unwrap(); + let profile = tmp.path().join("profile.nix"); + let cli = Cli::try_parse_from([ + "insomnia-pod", + "--profile", + profile.to_str().unwrap(), + "--profile-pod-name", + "from-profile-name", + ]) + .unwrap(); + let mut called = false; + + let (manifest, loader) = resolve_manifest_with_user_manifest_env_and_profile_loader( + &cli, + Some(OsString::from("non-existent-user-manifest.toml")), + |path, pod_name| { + called = true; + assert_eq!(path, profile.as_path()); + assert_eq!(pod_name, Some("from-profile-name")); + let mut manifest = + PodManifest::from_toml(&manifest_toml("from-profile", tmp.path())).unwrap(); + if let Some(pod_name) = pod_name { + manifest.pod.name = pod_name.to_string(); + } + Ok((manifest, PromptLoader::builtins_only())) + }, + ) + .unwrap(); + + assert!(called); + assert_eq!(manifest.pod.name, "from-profile-name"); + assert!(loader.user_dir().is_none()); + assert!(loader.workspace_dir().is_none()); + } + #[test] fn manifest_allows_empty_user_manifest_env() { let tmp = TempDir::new().unwrap();