use crate::cli::upgrade::UpgradeArgs;
use crate::context::AppContext;
use crate::error::AppError;
use crate::output;
use crate::services::upgrader::{UpgradeOptions, upgrade};
pub fn run(ctx: &AppContext, args: UpgradeArgs) -> Result<(), AppError> {
let target = if args.target.is_absolute() {
args.target
} else if args.target == "." {
ctx.cwd.clone()
} else {
return Err(AppError::Usage("target must be absolute or .".to_string()));
};
crate::commands::front::serves(crate::plan::classify::Intent::Upgrade, &target)?;
let selections = crate::plan::decision::parse(&args.set)
.map_err(|error| AppError::Usage(error.to_string()))?;
let outcome = upgrade(
&UpgradeOptions {
target,
dry_run: args.dry_run,
selections,
},
&crate::release::embedded::EmbeddedReleaseBundle::new(),
)?;
for line in &outcome.lines {
output::line(line);
}
if outcome.failures > 0 {
return Err(AppError::Violations {
count: outcome.failures,
});
}
Ok(())
}