diff --git a/crates/util/src/shell_env.rs b/crates/util/src/shell_env.rs index 9e42ebe500ba372806731b799b15afd4b44429b4..21f6096f19fa0c89bf4516b122878be04361ddcd 100644 --- a/crates/util/src/shell_env.rs +++ b/crates/util/src/shell_env.rs @@ -16,8 +16,13 @@ pub fn capture(directory: &std::path::Path) -> Result format!(">[1={}]", ENV_OUTPUT_FD), // `[1=0]` + _ => format!(">&{}", ENV_OUTPUT_FD), // `>&0` + }; command.stdin(Stdio::null()); command.stdout(Stdio::piped()); command.stderr(Stdio::piped()); @@ -38,10 +43,7 @@ pub fn capture(directory: &std::path::Path) -> Result&{}\";", - zed_path, ENV_OUTPUT_FD - )); + command_string.push_str(&format!("{} --printenv {}", zed_path, redir)); command.args(["-i", "-c", &command_string]); super::set_pre_exec_to_start_new_session(&mut command); diff --git a/crates/util/src/util.rs b/crates/util/src/util.rs index 86bee7ffd14c1782f806ebfe4dbe0537b675a5bc..932b519b18d4c555a2ee6189eef5744b0f85829e 100644 --- a/crates/util/src/util.rs +++ b/crates/util/src/util.rs @@ -1097,52 +1097,6 @@ mod tests { assert_eq!(vec, &[1000, 101, 21, 19, 17, 13, 9, 8]); } - #[test] - fn test_get_shell_safe_zed_path_with_spaces() { - // Test that shlex::try_quote handles paths with spaces correctly - let path_with_spaces = "/Applications/Zed Nightly.app/Contents/MacOS/zed"; - let quoted = shlex::try_quote(path_with_spaces).unwrap(); - - // The quoted path should be properly escaped for shell use - assert!(quoted.contains(path_with_spaces)); - - // When used in a shell command, it should not be split at spaces - let command = format!("sh -c '{} --printenv'", quoted); - println!("Command would be: {}", command); - - // Test that shlex can parse it back correctly - let parsed = shlex::split(&format!("{} --printenv", quoted)).unwrap(); - assert_eq!(parsed.len(), 2); - assert_eq!(parsed[0], path_with_spaces); - assert_eq!(parsed[1], "--printenv"); - } - - #[test] - fn test_shell_command_construction_with_quoted_path() { - // Test the specific pattern used in shell_env.rs to ensure proper quoting - let path_with_spaces = "/Applications/Zed Nightly.app/Contents/MacOS/zed"; - let quoted_path = shlex::try_quote(path_with_spaces).unwrap(); - - // This should be: '/Applications/Zed Nightly.app/Contents/MacOS/zed' - assert_eq!( - quoted_path, - "'/Applications/Zed Nightly.app/Contents/MacOS/zed'" - ); - - // Test the command construction pattern from shell_env.rs - // The fixed version should use double quotes around the entire sh -c argument - let env_fd = 0; - let command = format!("sh -c \"{} --printenv >&{}\";", quoted_path, env_fd); - - // This should produce: sh -c "'/Applications/Zed Nightly.app/Contents/MacOS/zed' --printenv >&0"; - let expected = - "sh -c \"'/Applications/Zed Nightly.app/Contents/MacOS/zed' --printenv >&0\";"; - assert_eq!(command, expected); - - // The command should not contain the problematic double single-quote pattern - assert!(!command.contains("''")); - } - #[test] fn test_truncate_to_bottom_n_sorted_by() { let mut vec: Vec = vec![5, 2, 3, 4, 1];