Skip to content

Commit a7a8f93

Browse files
committed
fix(complete): Strip wrappers for running completer
1 parent b2c8e44 commit a7a8f93

2 files changed

Lines changed: 18 additions & 8 deletions

File tree

clap_complete/examples/exhaustive.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use clap_complete::{generate, Generator, Shell};
33

44
fn main() {
55
#[cfg(feature = "unstable-dynamic")]
6-
clap_complete::CompleteEnv::with_factory(cli).complete();
6+
clap_complete::CompleteEnv::with_factory(cli)
7+
// Avoid tests snapshotting a path into `target/`
8+
.completer("exhaustive")
9+
.complete();
710

811
let matches = cli().get_matches();
912
if let Some(generator) = matches.get_one::<Shell>("generate") {

clap_complete/src/env/mod.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ impl<'s, F: FnOnce() -> clap::Command> CompleteEnv<'s, F> {
161161

162162
/// Override the binary to call to get completions
163163
///
164-
/// Default: `Command::get_bin_name`
164+
/// Default: `args_os()[0]`
165165
pub fn completer(mut self, completer: impl Into<String>) -> Self {
166166
self.completer = Some(completer.into());
167167
self
@@ -242,6 +242,7 @@ impl<'s, F: FnOnce() -> clap::Command> CompleteEnv<'s, F> {
242242
let mut cmd = (self.factory)();
243243
cmd.build();
244244

245+
let completer = args.remove(0);
245246
let escape_index = args
246247
.iter()
247248
.position(|a| *a == "--")
@@ -255,14 +256,20 @@ impl<'s, F: FnOnce() -> clap::Command> CompleteEnv<'s, F> {
255256
.as_deref()
256257
.or_else(|| cmd.get_bin_name())
257258
.unwrap_or_else(|| cmd.get_name());
258-
let completer = self
259-
.completer
260-
.as_deref()
261-
.or_else(|| cmd.get_bin_name())
262-
.unwrap_or_else(|| cmd.get_name());
259+
let completer = if let Some(completer) = self.completer.as_deref() {
260+
completer.to_owned()
261+
} else {
262+
let mut completer = std::path::PathBuf::from(completer);
263+
if let Some(current_dir) = current_dir.as_deref() {
264+
if 1 < completer.components().count() {
265+
completer = current_dir.join(completer);
266+
}
267+
}
268+
completer.to_string_lossy().into_owned()
269+
};
263270

264271
let mut buf = Vec::new();
265-
shell.write_registration(self.var, name, bin, completer, &mut buf)?;
272+
shell.write_registration(self.var, name, bin, &completer, &mut buf)?;
266273
std::io::stdout().write_all(&buf)?;
267274
} else {
268275
let mut buf = Vec::new();

0 commit comments

Comments
 (0)