aboutsummaryrefslogtreecommitdiff
path: root/src/cli.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli.rs')
-rw-r--r--src/cli.rs77
1 files changed, 73 insertions, 4 deletions
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<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
+ );
+ }
}