use eyre::Result;
use super::driver::{self, Action, DriverOpts};
use crate::config::Config;
use crate::system;
use crate::system::history::OperationScope;
#[derive(Debug, usage_rs::Args)]
#[usage(
visible_alias = "up",
verbatim_doc_comment,
example(
r###"mise bootstrap packages upgrade
mise bootstrap packages upgrade brew:postgresql@17
mise bootstrap packages upgrade --manager brew-cask
mise bootstrap packages upgrade --manager mas
mise bootstrap packages upgrade --manager winget
mise bootstrap packages upgrade --manager apt --yes
mise bootstrap packages upgrade --dry-run"###
)
)]
pub(crate) struct SystemUpgrade {
#[usage(value_name = "PACKAGE")]
packages: Vec<String>,
#[usage(long, short)]
manager: Option<String>,
#[usage(long, short = 'n')]
dry_run: bool,
#[usage(long, short)]
yes: bool,
}
impl SystemUpgrade {
pub(crate) async fn run(self) -> Result<()> {
OperationScope::wrap("bootstrap packages upgrade", self.dry_run, self.run_inner()).await
}
async fn run_inner(self) -> Result<()> {
let mgrs = if self.packages.is_empty() {
let config = Config::get().await?;
system::packages_from_config(&config)
} else {
let config = Config::get().await?;
system::packages_from_specs_with_config(&self.packages, Some(&config))?
};
let opts = DriverOpts {
manager: self.manager,
explicit: !self.packages.is_empty(),
allow_unavailable_manager: false,
dry_run: self.dry_run,
update: false,
yes: self.yes,
};
driver::run(mgrs, Action::Upgrade, &opts).await
}
}