fix: Prioritize Homebrew paths over Linux paths in PATH search
Previous version returned the first match found in PATH, which meant /usr/local/bin would be chosen before /opt/homebrew/bin if it appeared first in the PATH variable. Changes: - Collect ALL candidate paths from PATH first - Assign priority scores (1=Homebrew, 2=.local, 3=.cargo, 4=/usr/local, 5=/usr/bin) - Sort by priority (lowest number = highest priority) - Return the highest priority path This ensures macOS Homebrew paths (/opt/homebrew/bin) are always preferred over Linux/Intel Mac paths (/usr/local/bin), regardless of PATH order. Priority scheme: 1. /opt/homebrew/bin (M1/M2/M3/M4 Macs with Homebrew) 2. ~/.local/bin (user-local installs) 3. ~/.cargo/bin (Rust/Cargo installs) 4. /usr/local/bin (Linux/Intel Mac standard) 5. /usr/bin (system binaries)
This commit is contained in:
@@ -281,24 +281,38 @@ fn resolve_binary_path(explicit_path: &Option<String>) -> Result<String> {
|
|||||||
if let Ok(path_env) = std::env::var("PATH") {
|
if let Ok(path_env) = std::env::var("PATH") {
|
||||||
let binary_names = ["gitea-mcp", "gitea-mcp-server"];
|
let binary_names = ["gitea-mcp", "gitea-mcp-server"];
|
||||||
|
|
||||||
// Parse PATH and try each directory with each binary name
|
// Collect all candidate paths from PATH, then prioritize them
|
||||||
|
let mut candidates = Vec::new();
|
||||||
|
|
||||||
|
// Parse PATH and collect all plausible paths
|
||||||
for path_dir in path_env.split(':') {
|
for path_dir in path_env.split(':') {
|
||||||
for binary_name in &binary_names {
|
for binary_name in &binary_names {
|
||||||
let full_path = format!("{}/{}", path_dir, binary_name);
|
let full_path = format!("{}/{}", path_dir, binary_name);
|
||||||
// We can't check if file exists in WASM, but we can return the path
|
|
||||||
// and let Zed try to execute it. We'll return the first match from
|
// Categorize by priority (lower number = higher priority)
|
||||||
// common directories to increase success rate.
|
let priority = if path_dir.contains("/opt/homebrew/bin") {
|
||||||
if path_dir.contains("/usr/local/bin")
|
1 // Highest: macOS Homebrew (M1/M2/M3/M4 Macs)
|
||||||
|| path_dir.contains("/usr/bin")
|
} else if path_dir.contains("/.local/bin") {
|
||||||
|| path_dir.contains("/opt/homebrew/bin")
|
2 // User-local installations
|
||||||
|| path_dir.contains("/.local/bin")
|
} else if path_dir.contains("/.cargo/bin") {
|
||||||
|| path_dir.contains("/.cargo/bin")
|
3 // Cargo installations
|
||||||
{
|
} else if path_dir.contains("/usr/local/bin") {
|
||||||
// This looks like a plausible location, try it
|
4 // Linux standard location
|
||||||
return Ok(full_path);
|
} else if path_dir.contains("/usr/bin") {
|
||||||
}
|
5 // System binaries
|
||||||
|
} else {
|
||||||
|
continue; // Skip non-standard locations
|
||||||
|
};
|
||||||
|
|
||||||
|
candidates.push((priority, full_path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sort by priority and return the highest priority candidate
|
||||||
|
candidates.sort_by_key(|(priority, _)| *priority);
|
||||||
|
if let Some((_, path)) = candidates.first() {
|
||||||
|
return Ok(path.clone());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback: Try common absolute paths
|
// Fallback: Try common absolute paths
|
||||||
|
|||||||
Reference in New Issue
Block a user