gpui_util: Respect custom Scoop installation paths (#62473)

# Objective

- Fix PowerShell discovery when Scoop is installed outside the default
`%USERPROFILE%\scoop` directory.
- Zed currently ignores Scoop's `SCOOP` environment variable, so it can
miss `pwsh.exe` and fall back to another shell.

## Solution

- Use the `SCOOP` environment variable as the Scoop root when it is set.
- Fall back to `%USERPROFILE%\scoop` when `SCOOP` is unset.
- Preserve the PowerShell discovery order and file validation from the
current `main` branch.

The original change also covered Git Bash. That is no longer needed
after #63339 changed Git Bash discovery to follow the active Git
installation.

## Testing

- `cargo fmt --all --check`
- `cargo test -p gpui_util` — 2 passed, 0 failed.
- `cargo check -p gpui_util --tests --target x86_64-pc-windows-msvc` —
passed.
- Did not runtime-test the Windows-specific path on this macOS host
because Windows test binaries cannot run natively here.
- To test manually on Windows, set `SCOOP` to a custom Scoop root
containing `shims\pwsh.exe`, launch Zed, and verify that PowerShell is
selected.

## Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content adheres to Zed's UI standards
([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
and
[icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md)
guidelines)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- Fixed PowerShell installed by Scoop not being detected when Scoop uses
a custom installation directory.
- [GPUI] Fixed PowerShell discovery for custom Scoop installations on
Windows.

Signed-off-by: jliu666 <jliu666@hotmail.com>
This commit is contained in:
jliu666 authored and GitHub committed 2026-09-21 02:25:54 +00:00
1 parent 73609ab13e
commit dfeab92d8e
1 file changed
+6 -2
+6 -2
View File
@@ -95,8 +95,12 @@ pub fn get_powershell() -> Option<String> {
}
fn find_pwsh_in_scoop() -> Option<PathBuf> {
let pwsh_exe =
PathBuf::from(std::env::var_os("USERPROFILE")?).join("scoop\\shims\\pwsh.exe");
// Scoop can be installed to a custom location; $SCOOP points at the
// scoop root in that case and defaults to %USERPROFILE%\scoop otherwise.
let scoop_dir = std::env::var_os("SCOOP").map(PathBuf::from).or_else(|| {
std::env::var_os("USERPROFILE").map(|home| PathBuf::from(home).join("scoop"))
})?;
let pwsh_exe = scoop_dir.join("shims").join("pwsh.exe");
pwsh_exe.is_file().then_some(pwsh_exe)
}