From abe004372c6a0027339563a88162ca1aca320a1d Mon Sep 17 00:00:00 2001 From: sbatial Date: Fri, 16 Feb 2024 16:58:38 +0100 Subject: [PATCH 1/2] copy over code from gix to generate completions for ein as well lint --- src/porcelain/main.rs | 19 +++++++++++++++++-- src/porcelain/options.rs | 10 ++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/porcelain/main.rs b/src/porcelain/main.rs index aeb89458d83..a622571485e 100644 --- a/src/porcelain/main.rs +++ b/src/porcelain/main.rs @@ -3,8 +3,8 @@ use std::sync::{ Arc, }; -use anyhow::Result; -use clap::Parser; +use anyhow::{anyhow, Result}; +use clap::{CommandFactory, Parser}; use gitoxide::shared::pretty::prepare_and_run; use gitoxide_core as core; @@ -169,6 +169,21 @@ pub fn main() -> Result<()> { ) } }, + Subcommands::Completions { shell, out_dir } => { + let mut app = Args::command(); + + let shell = shell + .or_else(clap_complete::Shell::from_env) + .ok_or_else(|| anyhow!("The shell could not be derived from the environment"))?; + + let bin_name = app.get_name().to_owned(); + if let Some(out_dir) = out_dir { + clap_complete::generate_to(shell, &mut app, bin_name, &out_dir)?; + } else { + clap_complete::generate(shell, &mut app, bin_name, &mut std::io::stdout()); + } + Ok(()) + } }?; Ok(()) } diff --git a/src/porcelain/options.rs b/src/porcelain/options.rs index 263779dec11..a646b4bb0e3 100644 --- a/src/porcelain/options.rs +++ b/src/porcelain/options.rs @@ -1,3 +1,4 @@ +use clap_complete::Shell; use std::path::PathBuf; #[derive(Debug, clap::Parser)] @@ -39,6 +40,15 @@ pub enum Subcommands { /// A selection of useful tools #[clap(subcommand)] Tool(ToolCommands), + /// Generate shell completions to stdout or a directory. + #[clap(visible_alias = "generate-completions", visible_alias = "shell-completions")] + Completions { + /// The shell to generate completions for. Otherwise it's derived from the environment. + #[clap(long, short)] + shell: Option, + /// The output directory in case multiple files are generated. If not provided, will write to stdout. + out_dir: Option, + }, #[cfg(debug_assertions)] Panic, } From 4fd6ab89753f9b947034806fecb60ad77380334c Mon Sep 17 00:00:00 2001 From: sbatial Date: Fri, 16 Feb 2024 17:34:39 +0100 Subject: [PATCH 2/2] Tell clap that ein is named ein --- src/porcelain/options.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/porcelain/options.rs b/src/porcelain/options.rs index a646b4bb0e3..708ffdd1417 100644 --- a/src/porcelain/options.rs +++ b/src/porcelain/options.rs @@ -2,7 +2,7 @@ use clap_complete::Shell; use std::path::PathBuf; #[derive(Debug, clap::Parser)] -#[clap(about = "The rusty git", version = option_env!("GIX_VERSION"))] +#[clap(name = "ein", about = "The rusty git", version = option_env!("GIX_VERSION"))] #[clap(subcommand_required = true)] pub struct Args { /// Do not display verbose messages and progress information