use std::path::PathBuf;
use clap::Parser;
#[derive(Parser)]
#[command(name = "git metadata", bin_name = "git metadata")]
#[command(
author,
version,
about = "Manage Git object metadata stored in a fanout ref tree.",
long_about = None
)]
pub struct Cli {
#[arg(short = 'C', long, global = true)]
pub repo: Option<PathBuf>,
#[arg(long, global = true, default_value = "refs/metadata/commits")]
pub r#ref: String,
#[command(subcommand)]
pub command: Command,
}
#[derive(clap::Subcommand)]
pub enum Command {
List,
Show {
#[arg(default_value = "HEAD")]
object: String,
},
Add {
path: String,
#[arg(default_value = "HEAD")]
object: String,
#[arg(short, long)]
message: Option<String>,
#[arg(short = 'F', long, conflicts_with = "message")]
file: Option<PathBuf>,
#[arg(short, long)]
force: bool,
#[arg(long)]
allow_empty: bool,
#[arg(long, default_value_t = 1, value_parser = clap::value_parser!(u8).range(0..=19))]
shard_level: u8,
},
Remove {
patterns: Vec<String>,
#[arg(short, long, default_value = "HEAD")]
object: String,
#[arg(long)]
keep: bool,
},
Copy {
from: String,
to: String,
#[arg(short, long)]
force: bool,
#[arg(long, default_value_t = 1, value_parser = clap::value_parser!(u8).range(0..=19))]
shard_level: u8,
},
Prune {
#[arg(short = 'n', long)]
dry_run: bool,
#[arg(short, long)]
verbose: bool,
},
GetRef,
Link {
a: String,
b: String,
#[arg(long)]
forward: String,
#[arg(long)]
reverse: String,
},
Unlink {
a: String,
b: String,
#[arg(long)]
forward: String,
#[arg(long)]
reverse: String,
},
Linked {
key: String,
#[arg(long)]
relation: Option<String>,
},
}