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 #[arg(long)]
21 pub verbose: bool,
22}
23
24pub fn run(args: &UpgradeArgs, ctx: &super::MarsContext, json: bool) -> Result<i32, MarsError> {
26 let request = SyncRequest {
27 resolution: ResolutionMode::Maximize {
28 targets: args
29 .names
30 .iter()
31 .map(|s| SourceName::from(s.as_str()))
32 .collect(),
33 bump: args.bump,
34 },
35 mutation: None,
36 options: SyncOptions::default(),
37 lossiness_mode: if args.verbose {
38 crate::diagnostic::LossinessMode::Verbose
39 } else {
40 crate::diagnostic::LossinessMode::Surface
41 },
42 };
43
44 let report = crate::sync::execute(ctx, &request)?;
45
46 if args.bump && !json {
47 print_bump_messages(&report.dependency_changes);
48 }
49 output::print_sync_report(&report, json, true);
50
51 if report.has_conflicts() { Ok(1) } else { Ok(0) }
52}
53
54fn print_bump_messages(changes: &[DependencyUpsertChange]) {
55 for change in changes {
56 if change.old_version == change.new_version {
57 continue;
58 }
59 let from = change.old_version.as_deref().unwrap_or("latest");
60 let to = change.new_version.as_deref().unwrap_or("latest");
61 output::print_info(&format!(
62 "bumped dependency `{}`: {from} -> {to}",
63 change.name
64 ));
65 }
66}