Initial upload: DotMigrate dotfiles migration tool with CI/CD
Some checks failed
CI / test (push) Has been cancelled
CI / release (push) Has been cancelled

This commit is contained in:
2026-02-04 09:53:00 +00:00
parent 6d93e02ddd
commit 78b5a6cd66

143
src/cli/mod.rs Normal file
View File

@@ -0,0 +1,143 @@
pub mod commands;
pub use commands::{init, detect, backup, sync, merge, status, diff, completions};
use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Debug, Clone, ValueEnum)]
pub enum SyncBackend {
Git,
S3,
Direct,
}
#[derive(Debug, Clone, ValueEnum)]
pub enum Platform {
Linux,
Macos,
Wsl,
}
#[derive(Debug, Clone, ValueEnum)]
pub enum MergeStrategy {
Diff3,
Ours,
Theirs,
Ask,
}
#[derive(Parser, Debug)]
#[command(name = "dotmigrate")]
#[command(author, version, about, long_about = None)]
pub struct Args {
#[arg(short, long, global = true)]
pub config: Option<PathBuf>,
#[arg(short, long, global = true)]
pub dry_run: bool,
#[arg(short, long, global = true)]
pub verbose: bool,
#[arg(short, long, global = true)]
pub backend: Option<SyncBackend>,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
#[command(name = "init")]
Init {
#[arg(short, long)]
backend: Option<SyncBackend>,
},
#[command(name = "detect")]
Detect {
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(short, long)]
include_system: bool,
},
#[command(name = "backup")]
Backup {
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(short, long)]
backup_dir: Option<PathBuf>,
},
#[command(name = "sync")]
Sync {
#[arg(short, long)]
remote: Option<String>,
#[arg(short, long)]
branch: Option<String>,
#[arg(short, long)]
strategy: Option<MergeStrategy>,
},
#[command(name = "merge")]
Merge {
#[arg(short, long)]
base: PathBuf,
#[arg(short, long)]
local: PathBuf,
#[arg(short, long)]
remote: PathBuf,
#[arg(short, long)]
output: PathBuf,
#[arg(short, long)]
strategy: Option<MergeStrategy>,
},
#[command(name = "status")]
Status {
#[arg(short, long)]
detailed: bool,
},
#[command(name = "diff")]
Diff {
#[arg(short, long)]
local: PathBuf,
#[arg(short, long)]
remote: PathBuf,
},
#[command(name = "completions")]
Completions {
#[arg(value_enum)]
shell: clap_complete::Shell,
},
}
pub fn execute(args: Args) -> anyhow::Result<()> {
if args.verbose {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("debug"))
.init();
}
match &args.command {
Commands::Init { backend } => init(args.clone(), *backend),
Commands::Detect { output, include_system } => detect(args.clone(), output.clone(), *include_system),
Commands::Backup { output, backup_dir } => backup(args.clone(), output.clone(), backup_dir.clone()),
Commands::Sync { remote, branch, strategy } => sync(args.clone(), remote.clone(), branch.clone(), strategy.clone()),
Commands::Merge { base, local, remote, output, strategy } => merge(args.clone(), base.clone(), local.clone(), remote.clone(), output.clone(), strategy.clone()),
Commands::Status { detailed } => status(args.clone(), *detailed),
Commands::Diff { local, remote } => diff(args.clone(), local.clone(), remote.clone()),
Commands::Completions { shell } => completions(*shell),
}
}