Skip to content

Commit 215c3ac

Browse files
ShaunSHamiltonByron
authored andcommitted
user decides completion output
1 parent 6c913bf commit 215c3ac

File tree

2 files changed

+17
-32
lines changed

2 files changed

+17
-32
lines changed

Diff for: src/plumbing/main.rs

+7-29
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::{
99

1010
use anyhow::{Context, Result};
1111
use clap::{CommandFactory, Parser};
12-
use clap_complete::{generate, shells::Bash};
12+
use clap_complete::{generate, generate_to};
1313
use gitoxide_core as core;
1414
use gitoxide_core::{pack::verify, repository::PathsOrPatterns};
1515
use gix::bstr::{io::BufReadExt, BString};
@@ -1220,36 +1220,14 @@ pub fn main() -> Result<()> {
12201220
},
12211221
),
12221222
},
1223-
Subcommands::GenerateCompletions => {
1223+
Subcommands::GenerateCompletions { shell, out_dir } => {
12241224
let mut app = Args::command();
12251225

1226-
let bin_name = "gix";
1227-
1228-
app.set_bin_name(bin_name);
1229-
1230-
// TODO: For additonal shells, find preferred completion workflow
1231-
let outdir = std::path::Path::new("/etc/").join("bash_completion.d/");
1232-
1233-
match &mut std::fs::OpenOptions::new()
1234-
.read(true)
1235-
.write(true)
1236-
.create(true)
1237-
.open(&outdir.join(bin_name))
1238-
{
1239-
Ok(write_buffer) => {
1240-
generate(Bash, &mut app, bin_name, write_buffer);
1241-
// generate(Fish, &mut app, bin_name, write_buffer);
1242-
// generate(Zsh, &mut app, bin_name, write_buffer);
1243-
// generate(PowerShell, &mut app, bin_name, write_buffer);
1244-
// generate(Elvish, &mut app, bin_name, write_buffer);
1245-
1246-
println!("completion file generated in: {outdir:?}");
1247-
}
1248-
Err(e) => {
1249-
eprintln!("failed to open path '{outdir:?}': {}", e);
1250-
std::process::exit(1);
1251-
}
1252-
};
1226+
if let Some(out_dir) = out_dir {
1227+
generate_to(shell, &mut app, env!("CARGO_PKG_NAME"), &out_dir)?;
1228+
} else {
1229+
generate(shell, &mut app, env!("CARGO_PKG_NAME"), &mut std::io::stdout());
1230+
}
12531231

12541232
Ok(())
12551233
}

Diff for: src/plumbing/options/mod.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::path::PathBuf;
22

3+
use clap_complete::Shell;
34
use gitoxide_core as core;
45
use gix::bstr::BString;
56

@@ -134,9 +135,15 @@ pub enum Subcommands {
134135
/// Subcommands that need no git repository to run.
135136
#[clap(subcommand)]
136137
Free(free::Subcommands),
137-
/// Generate shell completions in `/etc/bash_completion.d/gix.bash`.
138-
/// NOTE: Requires `sudo` to write to `/etc/`.
139-
GenerateCompletions,
138+
/// Generate shell completions
139+
GenerateCompletions {
140+
/// Shell for generating completions.
141+
#[clap(long, short)]
142+
shell: Shell,
143+
/// Output directory. If not provided, will write to stdout.
144+
#[clap(long, short)]
145+
out_dir: Option<String>,
146+
},
140147
}
141148

142149
#[cfg(feature = "gitoxide-core-tools-archive")]

0 commit comments

Comments
 (0)