diff options
Diffstat (limited to 'src/cli.rs')
| -rw-r--r-- | src/cli.rs | 77 |
1 files changed, 73 insertions, 4 deletions
@@ -77,6 +77,14 @@ fn channel_set(args: &[String]) -> std::io::Result<i32> { 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<i32> { "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 + ); + } } |
