Skip to main content

mars_agents/cli/
sync.rs

1//! `mars sync` — resolve + install (make reality match config).
2
3use crate::error::MarsError;
4use crate::sync::{ResolutionMode, SyncOptions, SyncRequest};
5
6use super::output;
7
8/// Arguments for `mars sync`.
9#[derive(Debug, clap::Args)]
10pub struct SyncArgs {
11    /// Overwrite local modifications for managed files.
12    #[arg(long)]
13    pub force: bool,
14
15    /// Dry run — show what would change.
16    #[arg(long)]
17    pub diff: bool,
18
19    /// Install exactly from lock file, error if stale.
20    #[arg(long)]
21    pub frozen: bool,
22}
23
24/// Run `mars sync`.
25pub fn run(args: &SyncArgs, ctx: &super::MarsContext, json: bool) -> Result<i32, MarsError> {
26    let request = SyncRequest {
27        resolution: ResolutionMode::Normal,
28        mutation: None,
29        options: SyncOptions {
30            force: args.force,
31            dry_run: args.diff,
32            frozen: args.frozen,
33        },
34    };
35
36    let report = crate::sync::execute(&ctx.managed_root, &request)?;
37
38    output::print_sync_report(&report, json);
39
40    if report.has_conflicts() { Ok(1) } else { Ok(0) }
41}