diff options
author | Anatolij Vasilev <Anatolij.Vasilev@flyeralarm.com> | 2024-03-25 15:53:21 +0100 |
---|---|---|
committer | Anatolij Vasilev <Anatolij.Vasilev@flyeralarm.com> | 2024-03-25 15:53:21 +0100 |
commit | 019540a4f522d000c0172faeb096f1af35ad95db (patch) | |
tree | 724f60997a87ac112f146b8e7b17a8a01906900a /src | |
parent | c4f01310bb0a5567d005cc03ff2627c2ecb5824f (diff) |
#447: added error message for incompatible fzf version
Diffstat (limited to 'src')
-rw-r--r-- | src/finder/mod.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/finder/mod.rs b/src/finder/mod.rs index 9b4ccfd..bc745ff 100644 --- a/src/finder/mod.rs +++ b/src/finder/mod.rs @@ -3,12 +3,18 @@ use crate::prelude::*; use std::io::Write; use std::process::{self, Output}; use std::process::{Command, Stdio}; +use std::string::ToString; + pub mod structures; use clap::ValueEnum; pub use post::process; use structures::Opts; use structures::SuggestionType; +const MIN_FZF_VERSION_MAJOR: u32 = 0; +const MIN_FZF_VERSION_MINOR: u32 = 23; +const MIN_FZF_VERSION_PATCH: u32 = 1; + mod post; #[derive(Debug, Clone, Copy, Deserialize, ValueEnum)] @@ -47,6 +53,24 @@ fn parse(out: Output, opts: Opts) -> Result<String> { } impl FinderChoice { + fn check_fzf_version() -> Option<(u32, u32, u32)> { + let output = Command::new("fzf") + .arg("--version") + .output() + .ok()? + .stdout; + let version_string = String::from_utf8(output).ok()?; + let version_parts: Vec<_> = version_string.split('.').collect(); + if version_parts.len() == 3 { + let major = version_parts[0].parse().ok()?; + let minor = version_parts[1].parse().ok()?; + let patch = version_parts[2].split_whitespace().next()?.parse().ok()?; + Some((major, minor, patch)) + } else { + None + } + } + pub fn call<F, R>(&self, finder_opts: Opts, stdin_fn: F) -> Result<(String, R)> where F: Fn(&mut dyn Write) -> Result<R>, @@ -56,6 +80,20 @@ impl FinderChoice { Self::Skim => "sk", }; + if let Self::Fzf = self { + if let Some((major, minor, patch)) = Self::check_fzf_version() { + if major == MIN_FZF_VERSION_MAJOR && minor < MIN_FZF_VERSION_MINOR && patch < MIN_FZF_VERSION_PATCH { + eprintln!("Warning: Fzf version {}.{} does not support the preview window layout used by navi.", major, minor); + eprintln!("Consider updating Fzf to a version >= {}.{}.{} or use a compatible layout.", + MIN_FZF_VERSION_MAJOR, + MIN_FZF_VERSION_MINOR, + MIN_FZF_VERSION_PATCH + ); + process::exit(1); + } + } + } + let mut command = Command::new(finder_str); let opts = finder_opts.clone(); |