mars_agents/cli/
upgrade.rs1use crate::error::MarsError;
4use crate::sync::{DependencyUpsertChange, ResolutionMode, SyncOptions, SyncRequest};
5use crate::types::SourceName;
6
7use super::output;
8
9#[derive(Debug, clap::Args)]
11pub struct UpgradeArgs {
12 pub names: Vec<String>,
14
15 #[arg(long)]
17 pub bump: bool,
18}
19
20pub fn run(args: &UpgradeArgs, ctx: &super::MarsContext, json: bool) -> Result<i32, MarsError> {
22 let request = SyncRequest {
23 resolution: ResolutionMode::Maximize {
24 targets: args
25 .names
26 .iter()
27 .map(|s| SourceName::from(s.as_str()))
28 .collect(),
29 bump: args.bump,
30 },
31 mutation: None,
32 options: SyncOptions::default(),
33 };
34
35 let report = crate::sync::execute(ctx, &request)?;
36
37 if args.bump && !json {
38 print_bump_messages(&report.dependency_changes);
39 }
40 output::print_sync_report(&report, json, true);
41
42 if report.has_conflicts() { Ok(1) } else { Ok(0) }
43}
44
45fn print_bump_messages(changes: &[DependencyUpsertChange]) {
46 for change in changes {
47 if change.old_version == change.new_version {
48 continue;
49 }
50 let from = change.old_version.as_deref().unwrap_or("latest");
51 let to = change.new_version.as_deref().unwrap_or("latest");
52 output::print_info(&format!(
53 "bumped dependency `{}`: {from} -> {to}",
54 change.name
55 ));
56 }
57}