use clap::Args;
use homeboy::upgrade;
use serde_json::Value;
use crate::commands::{CmdResult, GlobalArgs};
#[derive(Args)]
pub struct UpgradeArgs {
#[arg(long)]
pub check: bool,
#[arg(long)]
pub force: bool,
#[arg(long)]
pub no_restart: bool,
}
pub fn run(args: UpgradeArgs, _global: &GlobalArgs) -> CmdResult<Value> {
if args.check {
let result = upgrade::check_for_updates()?;
let json = serde_json::to_value(result)
.map_err(|e| homeboy::Error::internal_json(e.to_string(), None))?;
return Ok((json, 0));
}
let result = upgrade::run_upgrade(args.force)?;
let json = serde_json::to_value(&result)
.map_err(|e| homeboy::Error::internal_json(e.to_string(), None))?;
if result.upgraded && result.restart_required && !args.no_restart {
println!(
"{}",
serde_json::to_string_pretty(&serde_json::json!({
"success": true,
"data": json
}))
.unwrap_or_default()
);
#[cfg(unix)]
upgrade::restart_with_new_binary();
#[cfg(not(unix))]
eprintln!("Please restart homeboy to use the new version.");
}
Ok((json, 0))
}