Skip to main content

mars_agents/cli/
sync.rs

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