git-meta-cli 0.1.2

Command-line tool for structured Git metadata (get/set, serialize, materialize, push/pull). Installs the `git-meta` binary.
use anyhow::Result;

use crate::context::CommandContext;

pub fn run(remote: Option<&str>, verbose: bool) -> Result<()> {
    let ctx = CommandContext::open(None)?;

    if verbose {
        let ns = ctx.session.namespace();
        let remote_name = ctx.session.resolve_remote(remote)?;
        let fetch_refspec = format!("refs/{ns}/main:refs/{ns}/remotes/main");
        eprintln!("[verbose] remote: {remote_name}");
        eprintln!("[verbose] fetch refspec: {fetch_refspec}");
    }

    let output = ctx.session.pull(remote)?;

    if !output.materialized {
        println!("Already up-to-date.");
        return Ok(());
    }

    if output.new_commits > 0 {
        eprintln!(
            "Fetched {} new commit{}.",
            output.new_commits,
            if output.new_commits == 1 { "" } else { "s" }
        );
    }

    if output.indexed_keys > 0 {
        eprintln!(
            "Indexed {} keys from history (available on demand).",
            output.indexed_keys
        );
    }

    println!("Pulled metadata from {}", output.remote_name);
    Ok(())
}