podbox-cli 0.7.1

Declarative Podman-native container environment manager. Define an environment as a TOML file and let systemd own its lifecycle.
Documentation
use anyhow::{Context, Result};

use podbox::config;

use podbox::ui;

pub struct MigrateOpts {
    pub dry_run: bool,
    pub force: bool,
}

pub fn run_migrate(opts: MigrateOpts) -> Result<()> {
    let root = config::config_dir();
    let target_dir = config::profiles_dir();

    let legacy_files = config::find_legacy_root_configs();

    if legacy_files.is_empty() {
        ui::ok("No legacy configs found. All configs are in ~/.config/podbox/profiles/.");
        return Ok(());
    }

    ui::step(&format!(
        "Found {} legacy config(s) in {}",
        legacy_files.len(),
        root.display()
    ));

    if !opts.dry_run {
        std::fs::create_dir_all(&target_dir)
            .with_context(|| format!("failed to create directory {}", target_dir.display()))?;
    }

    let mut migrated_count = 0;

    for src in legacy_files {
        let file_name = src.file_name().unwrap();
        let dst = target_dir.join(file_name);
        let name_str = src.file_stem().unwrap().to_string_lossy();

        if dst.exists() && !opts.force {
            ui::warn(&format!(
                "Skipping {}: target '{}' already exists (use --force to overwrite)",
                src.display(),
                dst.display()
            ));
            continue;
        }

        if opts.dry_run {
            println!("Would move: {}{}", src.display(), dst.display());
        } else {
            std::fs::rename(&src, &dst).with_context(|| {
                format!("failed to move {} to {}", src.display(), dst.display())
            })?;
            ui::ok(&format!(
                "Moved {} → profiles/{}",
                name_str,
                file_name.to_string_lossy()
            ));

            let _ = podbox::history::record(&name_str, "migrate", "moved to profiles/ directory");
            migrated_count += 1;
        }
    }

    if opts.dry_run {
        println!("\n(Dry run: no files moved)");
    } else {
        ui::ok(&format!(
            "Migration complete. {migrated_count} config(s) moved to profiles/."
        ));
    }

    Ok(())
}