use crate::define_tool;
use crate::tools::common::{InstallError, has, run};
#[cfg(target_os = "linux")]
use crate::tools::pinned_installer::PinnedInstaller;
#[cfg(target_os = "linux")]
const OLLAMA_INSTALLER_COMMIT: &str = "f866e7608f378dcfca6f8c717101df1945db3b97";
#[cfg(target_os = "linux")]
const OLLAMA_INSTALLER_SHA256: &str =
"25f64b810b947145095956533e1bdf56eacea2673c55a7e586be4515fc882c9f";
define_tool!(OLLAMA, {
command: "ollama",
macos: { brew: "ollama" },
linux: { brew: "ollama" },
windows: { winget: "Ollama.Ollama" },
custom_install: install_ollama,
});
fn install_ollama(_min_hint: &str) -> Result<(), InstallError> {
if has("ollama") {
return Ok(());
}
#[cfg(target_os = "macos")]
{
if !has("brew") {
return Err(InstallError::Prereq(
"Homebrew not found. Install https://brew.sh and re-run.",
));
}
run("brew", &["install", "ollama"])?;
return Ok(());
}
#[cfg(target_os = "linux")]
{
if has("brew") {
run("brew", &["install", "ollama"])?;
return Ok(());
}
let url = format!(
"https://raw.githubusercontent.com/ollama/ollama/{}/scripts/install.sh",
OLLAMA_INSTALLER_COMMIT
);
let installer = PinnedInstaller {
name: "ollama",
url: &url,
sha256: OLLAMA_INSTALLER_SHA256,
};
run("sh", &["-c", &installer.shell_command()])?;
return Ok(());
}
#[cfg(target_os = "windows")]
{
if !has("winget") {
return Err(InstallError::Prereq(
"winget not found. Install Windows Package Manager, then re-run.",
));
}
run("winget", &["install", "-e", "--id", "Ollama.Ollama"])?;
return Ok(());
}
#[allow(unreachable_code)]
Err(InstallError::Unsupported)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ensure_ollama_no_panic() {
let res = ensure("");
assert!(res.is_ok() || res.is_err());
}
}