diff --git a/src/update.rs b/src/update.rs index 3455841..1f2faf6 100644 --- a/src/update.rs +++ b/src/update.rs @@ -30,7 +30,9 @@ const HERDR_UPDATE_COMMAND: &str = "herdr update"; const HOMEBREW_UPDATE_COMMAND: &str = "brew update && brew upgrade herdr"; const MISE_UPDATE_COMMAND: &str = "mise upgrade herdr"; const NIX_UPDATE_COMMAND: &str = "update through Nix"; +const MACPORTS_UPDATE_COMMAND: &str = "sudo port selfupdate && sudo port upgrade herdr"; const MISE_INSTALLS_DIR_ENV: &str = "MISE_INSTALLS_DIR"; +const MACPORTS_BUILD: bool = option_env!("HERDR_MACPORTS_BUILD").is_some(); const FAKE_UPDATE_VERSION_ENV: &str = "HERDR_FAKE_UPDATE_VERSION"; const FAKE_UPDATE_NOTES_VERSION_ENV: &str = "HERDR_FAKE_UPDATE_NOTES_VERSION"; const DEFAULT_FAKE_UPDATE_NOTES_VERSION: &str = "0.3.0"; @@ -1732,7 +1734,9 @@ fn print_running_session_update_outcomes( // --------------------------------------------------------------------------- pub(crate) fn update_install_command() -> &'static str { - if is_homebrew_managed_install() { + if MACPORTS_BUILD { + MACPORTS_UPDATE_COMMAND + } else if is_homebrew_managed_install() { HOMEBREW_UPDATE_COMMAND } else if is_mise_managed_install() { MISE_UPDATE_COMMAND @@ -1758,6 +1762,10 @@ pub(crate) fn update_install_instruction(install_command: &str) -> String { NIX_UPDATE_COMMAND => { "detach, update through Nix, then restart this Herdr session when ready".to_string() } + MACPORTS_UPDATE_COMMAND => { + "detach, update Herdr through MacPorts, then restart this Herdr session when ready" + .to_string() + } command => format!("detach, run `{command}`, then restart this Herdr session when ready"), } } @@ -1796,7 +1804,9 @@ pub(crate) fn preview_channel_rejection_for_current_install() -> Option<&'static pub(crate) fn package_manager_channel_update_guidance_for_current_install() -> Option<&'static str> { - if is_homebrew_managed_install() { + if MACPORTS_BUILD { + Some("Use MacPorts to update this Herdr install.") + } else if is_homebrew_managed_install() { Some("Use `brew update && brew upgrade herdr` to update Homebrew installs.") } else if is_mise_managed_install() { Some("Use `mise upgrade herdr` to update mise installs.") @@ -1808,7 +1818,11 @@ pub(crate) fn package_manager_channel_update_guidance_for_current_install() -> O } fn preview_channel_rejection_for_exe_path(path: &Path) -> Option<&'static str> { - if is_homebrew_managed_exe_path_following_links(path) { + if MACPORTS_BUILD { + Some( + "preview channel is only available for direct Herdr installs; MacPorts installs update through MacPorts", + ) + } else if is_homebrew_managed_exe_path_following_links(path) { Some( "preview channel is only available for direct Herdr installs; Homebrew installs update through `brew update && brew upgrade herdr`", ) @@ -1825,7 +1839,8 @@ fn preview_channel_rejection_for_exe_path(path: &Path) -> Option<&'static str> { #[cfg(unix)] pub(crate) fn is_package_manager_managed_exe_path(path: &Path) -> bool { - is_homebrew_managed_exe_path_following_links(path) + MACPORTS_BUILD + || is_homebrew_managed_exe_path_following_links(path) || is_mise_managed_exe_path_following_links(path) || is_nix_store_exe_path_following_links(path) } @@ -1960,6 +1975,12 @@ pub fn self_update(options: SelfUpdateOptions) -> Result { ); } + if MACPORTS_BUILD { + return Err(format!( + "self-update is disabled for MacPorts installs; run `{MACPORTS_UPDATE_COMMAND}`" + )); + } + if is_homebrew_managed_install() { if channel == UpdateChannel::Preview { return Err(