Skip to main content

mars_agents/cli/
upgrade.rs

1//! `mars upgrade` — upgrade dependencies to newest versions.
2
3use crate::error::MarsError;
4use crate::sync::{DependencyUpsertChange, ResolutionMode, SyncOptions, SyncRequest};
5use crate::types::SourceName;
6
7use super::output;
8
9/// Arguments for `mars upgrade`.
10#[derive(Debug, clap::Args)]
11pub struct UpgradeArgs {
12    /// Specific dependencies to upgrade (default: all).
13    pub names: Vec<String>,
14
15    /// Bump direct dependency version constraints to resolved latest tags.
16    #[arg(long)]
17    pub bump: bool,
18
19    /// Show per-item detail for launch-time fields handled by meridian at spawn.
20    #[arg(long)]
21    pub verbose: bool,
22}
23
24/// Run `mars upgrade`.
25pub 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}