From 3236154d8dfdc6dbe32f1745231e2e2e5eab4178 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Sun, 9 Jun 2024 03:01:24 +0200 Subject: [PATCH] Fix `fzf` chooser preview with space-separated module paths (#2141) --- src/config.rs | 23 ++++++++++------------- src/subcommand.rs | 10 +++++++++- tests/show.rs | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/config.rs b/src/config.rs index d2056d5..34b72f3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,14 +11,6 @@ const CHOOSE_HELP: &str = "Select one or more recipes to run using a binary choo If `--chooser` is not passed the chooser defaults to the \ value of $JUST_CHOOSER, falling back to `fzf`"; -pub(crate) fn chooser_default(justfile: &Path) -> OsString { - let mut chooser = OsString::new(); - chooser.push("fzf --multi --preview 'just --unstable --color always --justfile \""); - chooser.push(justfile); - chooser.push("\" --show {}'"); - chooser -} - #[derive(Debug, PartialEq)] pub(crate) struct Config { pub(crate) check: bool, @@ -568,15 +560,20 @@ impl Config { } } - fn parse_module_path(path: ValuesRef) -> ConfigResult { + fn parse_module_path(values: ValuesRef) -> ConfigResult { + let path = values.clone().map(|s| (*s).as_str()).collect::>(); + + let path = if path.len() == 1 && path[0].contains(' ') { + path[0].split_whitespace().collect::>() + } else { + path + }; + path - .clone() - .map(|s| (*s).as_str()) - .collect::>() .as_slice() .try_into() .map_err(|()| ConfigError::ModulePath { - path: path.cloned().collect(), + path: values.cloned().collect(), }) } diff --git a/src/subcommand.rs b/src/subcommand.rs index e143315..450ffa3 100644 --- a/src/subcommand.rs +++ b/src/subcommand.rs @@ -231,7 +231,15 @@ impl Subcommand { return Err(Error::NoChoosableRecipes); } - let chooser = chooser.map_or_else(|| config::chooser_default(&search.justfile), From::from); + let chooser = if let Some(chooser) = chooser { + OsString::from(chooser) + } else { + let mut chooser = OsString::new(); + chooser.push("fzf --multi --preview 'just --unstable --color always --justfile \""); + chooser.push(&search.justfile); + chooser.push("\" --show {}'"); + chooser + }; let result = justfile .settings diff --git a/tests/show.rs b/tests/show.rs index e9fe5e6..17aaa47 100644 --- a/tests/show.rs +++ b/tests/show.rs @@ -124,3 +124,18 @@ fn show_invalid_path() { .status(1) .run(); } + +#[test] +fn show_space_separated_path() { + Test::new() + .write("foo.just", "bar:\n @echo MODULE") + .justfile( + " + mod foo + ", + ) + .test_round_trip(false) + .args(["--unstable", "--show", "foo bar"]) + .stdout("bar:\n @echo MODULE\n") + .run(); +}