This refactors a huge chunk of the code base to make it more maintainable. Main points: * Proper separation between bin and lib. Bin handles argument parsing & validation and (most of) the output. Lib provides interfaces for all opreations. * Before, libgit2 internals were literred throughout the codebase, mainly the `Repository` struct and `git2::Error` in Results. They library is now properly wrapped in `repo.rs`, which exposes only the required functionality. It also standardizes the Error messages (they're just Strings for now) and handles stuff like the copious usage of Options to wrap maybe-invalid-utf-8 values. The program will still panic on non-utf-8 Strings e.g. in git remotes, but I guess this is acceptable. If you actually manage to hit this case, I promise I'll fix it :D * Many unwraps() are now gone and properly handled. * The table printing functionality is now confined to `table.rs`, instead of passing tables as parameters through the whole program.
130 lines
3.1 KiB
Rust
130 lines
3.1 KiB
Rust
use clap::{AppSettings, Parser};
|
|
|
|
#[derive(Parser)]
|
|
#[clap(
|
|
name = clap::crate_name!(),
|
|
version = clap::crate_version!(),
|
|
author = clap::crate_authors!("\n"),
|
|
about = clap::crate_description!(),
|
|
long_version = clap::crate_version!(),
|
|
license = clap::crate_license!(),
|
|
setting = AppSettings::DeriveDisplayOrder,
|
|
setting = AppSettings::PropagateVersion,
|
|
setting = AppSettings::HelpRequired,
|
|
)]
|
|
pub struct Opts {
|
|
#[clap(subcommand)]
|
|
pub subcmd: SubCommand,
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub enum SubCommand {
|
|
#[clap(about = "Manage repositories")]
|
|
Repos(Repos),
|
|
#[clap(visible_alias = "wt", about = "Manage worktrees")]
|
|
Worktree(Worktree),
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub struct Repos {
|
|
#[clap(subcommand, name = "action")]
|
|
pub action: ReposAction,
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub enum ReposAction {
|
|
#[clap(
|
|
visible_alias = "run",
|
|
about = "Synchronize the repositories to the configured values"
|
|
)]
|
|
Sync(Sync),
|
|
#[clap(about = "Generate a repository configuration from an existing file tree")]
|
|
Find(Find),
|
|
#[clap(about = "Show status of configured repositories")]
|
|
Status(OptionalConfig),
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
#[clap()]
|
|
pub struct Sync {
|
|
#[clap(
|
|
short,
|
|
long,
|
|
default_value = "./config.toml",
|
|
about = "Path to the configuration file"
|
|
)]
|
|
pub config: String,
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
#[clap()]
|
|
pub struct OptionalConfig {
|
|
#[clap(short, long, about = "Path to the configuration file")]
|
|
pub config: Option<String>,
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub struct Find {
|
|
#[clap(about = "The path to search through")]
|
|
pub path: String,
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub struct Worktree {
|
|
#[clap(subcommand, name = "action")]
|
|
pub action: WorktreeAction,
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub enum WorktreeAction {
|
|
#[clap(about = "Add a new worktree")]
|
|
Add(WorktreeAddArgs),
|
|
#[clap(about = "Add an existing worktree")]
|
|
Delete(WorktreeDeleteArgs),
|
|
#[clap(about = "Show state of existing worktrees")]
|
|
Status(WorktreeStatusArgs),
|
|
#[clap(about = "Convert a normal repository to a worktree setup")]
|
|
Convert(WorktreeConvertArgs),
|
|
#[clap(about = "Clean all worktrees that do not contain uncommited/unpushed changes")]
|
|
Clean(WorktreeCleanArgs),
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub struct WorktreeAddArgs {
|
|
#[clap(about = "Name of the worktree")]
|
|
pub name: String,
|
|
|
|
#[clap(
|
|
short = 'n',
|
|
long = "branch-namespace",
|
|
about = "Namespace of the branch"
|
|
)]
|
|
pub branch_namespace: Option<String>,
|
|
#[clap(short = 't', long = "track", about = "Remote branch to track")]
|
|
pub track: Option<String>,
|
|
}
|
|
#[derive(Parser)]
|
|
pub struct WorktreeDeleteArgs {
|
|
#[clap(about = "Name of the worktree")]
|
|
pub name: String,
|
|
|
|
#[clap(
|
|
long = "force",
|
|
about = "Force deletion, even when there are uncommitted/unpushed changes"
|
|
)]
|
|
pub force: bool,
|
|
}
|
|
|
|
#[derive(Parser)]
|
|
pub struct WorktreeStatusArgs {}
|
|
|
|
#[derive(Parser)]
|
|
pub struct WorktreeConvertArgs {}
|
|
|
|
#[derive(Parser)]
|
|
pub struct WorktreeCleanArgs {}
|
|
|
|
pub fn parse() -> Opts {
|
|
Opts::parse()
|
|
}
|