From e584f93f367650a2b752a4e3a889603fb81b08f4 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Wed, 3 Jun 2026 14:38:08 +0300 Subject: fix: reconcile update channel switches --- src/cli.rs | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 4 deletions(-) (limited to 'src/cli.rs') diff --git a/src/cli.rs b/src/cli.rs index b6e2fc94..f756b96f 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -77,6 +77,14 @@ fn channel_set(args: &[String]) -> std::io::Result { return Ok(2); }; + if let Some(reason) = channel_set_preview_rejection( + channel, + crate::update::preview_channel_rejection_for_current_install(), + ) { + eprintln!("{reason}."); + return Ok(1); + } + let path = crate::config::config_path(); let content = if path.exists() { std::fs::read_to_string(&path)? @@ -112,11 +120,23 @@ fn channel_set(args: &[String]) -> std::io::Result { "Herdr update channel set to {channel} in {}.", path.display() ); - if channel == "preview" { - println!("Run `herdr update` to install the latest preview build when ready."); - } else { - println!("Run `herdr update` to install the latest stable release when ready."); + + match channel_set_install_action( + crate::update::package_manager_channel_update_guidance_for_current_install(), + ) { + ChannelSetInstallAction::PrintGuidance(guidance) => { + println!("{guidance}"); + return Ok(0); + } + ChannelSetInstallAction::RunSelfUpdate => {} } + + if let Err(err) = crate::update::self_update(crate::update::SelfUpdateOptions::default()) { + eprintln!("update failed: {err}"); + eprintln!("Run `herdr update` to retry."); + return Ok(1); + } + Ok(0) } @@ -129,6 +149,30 @@ fn parse_channel_set_arg(args: &[String]) -> Option<&str> { } } +fn channel_set_preview_rejection( + channel: &str, + install_rejection: Option<&'static str>, +) -> Option<&'static str> { + (channel == "preview") + .then_some(install_rejection) + .flatten() +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum ChannelSetInstallAction { + RunSelfUpdate, + PrintGuidance(&'static str), +} + +fn channel_set_install_action( + package_manager_guidance: Option<&'static str>, +) -> ChannelSetInstallAction { + match package_manager_guidance { + Some(guidance) => ChannelSetInstallAction::PrintGuidance(guidance), + None => ChannelSetInstallAction::RunSelfUpdate, + } +} + fn print_channel_help() { eprintln!("herdr channel commands:"); eprintln!(" herdr channel show print the configured update channel"); @@ -848,4 +892,29 @@ mod tests { None ); } + + #[test] + fn channel_set_rejects_package_managed_preview_before_config_write() { + assert_eq!( + super::channel_set_preview_rejection("preview", Some("no preview")), + Some("no preview") + ); + assert_eq!( + super::channel_set_preview_rejection("stable", Some("no preview")), + None + ); + assert_eq!(super::channel_set_preview_rejection("preview", None), None); + } + + #[test] + fn channel_set_skips_self_update_for_package_manager_guidance() { + assert_eq!( + super::channel_set_install_action(Some("use package manager")), + super::ChannelSetInstallAction::PrintGuidance("use package manager") + ); + assert_eq!( + super::channel_set_install_action(None), + super::ChannelSetInstallAction::RunSelfUpdate + ); + } } -- cgit v1.2.3