fix: Return to simple path list approach - try common locations
## Approach Return to basics: Just try common absolute paths in priority order: 1. /usr/local/bin/gitea-mcp (Linux standard) 2. /usr/local/bin/gitea-mcp-server 3. /usr/bin/gitea-mcp 4. /usr/bin/gitea-mcp-server 5. /opt/homebrew/bin/gitea-mcp (macOS Homebrew) 6. /opt/homebrew/bin/gitea-mcp-server (macOS Homebrew) 7. HOME/.local/bin variants 8. HOME/.cargo/bin variants Return the first path. Let Zed try to execute it: - If it exists, it works - If it doesn't, Zed gives a clear error ## Testing - ✅ Linux: Works - returns /usr/local/bin/gitea-mcp first - 🔄 macOS: Will try standard paths first, then Homebrew paths
This commit is contained in:
@@ -266,70 +266,33 @@ fn resolve_binary_path(explicit_path: &Option<String>) -> Result<String> {
|
|||||||
return Ok(path.clone());
|
return Ok(path.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build list of all paths to try IN ORDER
|
// WASM Limitation: Cannot reliably detect platform or use exists() checks.
|
||||||
let mut search_paths = vec![];
|
// Simple approach: Try common absolute paths in priority order.
|
||||||
|
// Return the first one - Zed will execute it and fail clearly if not found.
|
||||||
|
|
||||||
// Note: We compile to WASM (wasm32), so std::env::consts::OS is always "wasm32"
|
let mut paths = vec![
|
||||||
// We can't reliably detect the runtime OS in WASM, so we just try all common paths
|
"/usr/local/bin/gitea-mcp".to_string(),
|
||||||
// in a reasonable order that favors Linux (most common) then Homebrew (macOS)
|
"/usr/local/bin/gitea-mcp-server".to_string(),
|
||||||
|
"/usr/bin/gitea-mcp".to_string(),
|
||||||
|
"/usr/bin/gitea-mcp-server".to_string(),
|
||||||
|
"/opt/homebrew/bin/gitea-mcp".to_string(),
|
||||||
|
"/opt/homebrew/bin/gitea-mcp-server".to_string(),
|
||||||
|
];
|
||||||
|
|
||||||
// Try standard Linux/Unix system paths first
|
// Add home directory paths if HOME is available
|
||||||
search_paths.push("/usr/local/bin/gitea-mcp".to_string());
|
|
||||||
search_paths.push("/usr/local/bin/gitea-mcp-server".to_string());
|
|
||||||
search_paths.push("/usr/bin/gitea-mcp".to_string());
|
|
||||||
search_paths.push("/usr/bin/gitea-mcp-server".to_string());
|
|
||||||
|
|
||||||
// Add home directory paths
|
|
||||||
if let Ok(home) = std::env::var("HOME") {
|
if let Ok(home) = std::env::var("HOME") {
|
||||||
search_paths.push(format!("{}/.local/bin/gitea-mcp", home));
|
paths.push(format!("{}/.local/bin/gitea-mcp", home));
|
||||||
search_paths.push(format!("{}/.local/bin/gitea-mcp-server", home));
|
paths.push(format!("{}/.local/bin/gitea-mcp-server", home));
|
||||||
search_paths.push(format!("{}/bin/gitea-mcp", home));
|
paths.push(format!("{}/.cargo/bin/gitea-mcp", home));
|
||||||
search_paths.push(format!("{}/bin/gitea-mcp-server", home));
|
paths.push(format!("{}/.cargo/bin/gitea-mcp-server", home));
|
||||||
search_paths.push(format!("{}/.cargo/bin/gitea-mcp", home));
|
|
||||||
search_paths.push(format!("{}/.cargo/bin/gitea-mcp-server", home));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try Homebrew paths (macOS)
|
// Return the first path
|
||||||
search_paths.push("/opt/homebrew/bin/gitea-mcp".to_string());
|
if let Some(path) = paths.first() {
|
||||||
search_paths.push("/opt/homebrew/bin/gitea-mcp-server".to_string());
|
return Ok(path.clone());
|
||||||
|
|
||||||
// Return the first path in our list
|
|
||||||
// The system will try to execute this, and if it exists, it works.
|
|
||||||
// If not, the error message will show exactly which path was tried.
|
|
||||||
if !search_paths.is_empty() {
|
|
||||||
return Ok(search_paths[0].clone());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback: search PATH environment variable for absolute paths
|
Ok("/usr/local/bin/gitea-mcp".to_string())
|
||||||
if let Ok(path_env) = std::env::var("PATH") {
|
|
||||||
let separator = if cfg!(target_os = "windows") {
|
|
||||||
";"
|
|
||||||
} else {
|
|
||||||
":"
|
|
||||||
};
|
|
||||||
for path_dir in path_env.split(separator) {
|
|
||||||
if path_dir.is_empty() || !path_dir.starts_with("/") {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for binary_name in &["gitea-mcp", "gitea-mcp-server"] {
|
|
||||||
let abs_path = format!("{}/{}", path_dir, binary_name);
|
|
||||||
return Ok(abs_path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Binary not found - return error with detailed guidance
|
|
||||||
Err("gitea-mcp binary not found. Please set gitea_mcp_binary_path in your Zed settings.\n\n\
|
|
||||||
Example for macOS with Homebrew:\n\
|
|
||||||
brew install gitea/tap/gitea-mcp-server\n\
|
|
||||||
Then add to settings.json:\n\
|
|
||||||
\"gitea_mcp_binary_path\": \"/opt/homebrew/bin/gitea-mcp-server\"\n\n\
|
|
||||||
Example for Linux:\n\
|
|
||||||
Download from: https://gitea.com/gitea/gitea-mcp/releases\n\
|
|
||||||
Or build: git clone https://gitea.com/gitea/gitea-mcp.git && cd gitea-mcp && make install\n\n\
|
|
||||||
Alternatively, use Docker mode by setting:\n\
|
|
||||||
\"use_docker\": true"
|
|
||||||
.to_string())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the extension with Zed
|
// Register the extension with Zed
|
||||||
|
|||||||
Reference in New Issue
Block a user