summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThayne McCombs <astrothayne@gmail.com>2024-04-27 22:10:55 -0600
committerThayne McCombs <astrothayne@gmail.com>2024-05-07 00:24:06 -0600
commitb1f83a0bb070e3fe96139706f759c62bf9e45c4b (patch)
treeca19e720ef9a8ed58fc64b84e90a77ffdd94b59b
parent3bc70925a98b3eae64a7937e06a699cd104b6d9e (diff)
feat: Add option to always include cwd prefix
Fixes: #1243 Fixes: #1331
-rw-r--r--CHANGELOG.md1
-rw-r--r--contrib/completion/_fd2
-rw-r--r--doc/fd.117
-rw-r--r--src/cli.rs27
-rw-r--r--src/main.rs3
5 files changed, 41 insertions, 9 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4fc85a5..55abe28 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
## Features
+- Allow passing an optional argument to `--strip-cwd-prefix` of "always", "never", or "auto". to force whether the cwd prefix is stripped or not.
## Bugfixes
diff --git a/contrib/completion/_fd b/contrib/completion/_fd
index 28826a9..dc7e94d 100644
--- a/contrib/completion/_fd
+++ b/contrib/completion/_fd
@@ -162,7 +162,7 @@ _fd() {
$no'(*)*--search-path=[set search path (instead of positional <path> arguments)]:directory:_files -/'
+ strip-cwd-prefix
- $no'(strip-cwd-prefix exec-cmds)--strip-cwd-prefix[Strip ./ prefix when output is redirected]'
+ $no'(strip-cwd-prefix exec-cmds)--strip-cwd-prefix=[When to strip ./]:when:(always never auto)'
+ and
'--and=[additional required search path]:pattern'
diff --git a/doc/fd.1 b/doc/fd.1
index 498981f..5893c5c 100644
--- a/doc/fd.1
+++ b/doc/fd.1
@@ -156,9 +156,20 @@ can be used as an alias.
Enable the display of filesystem errors for situations such as insufficient
permissions or dead symlinks.
.TP
-.B \-\-strip-cwd-prefix
-By default, relative paths are prefixed with './' when the output goes to a non interactive terminal
-(TTY). Use this flag to disable this behaviour.
+.B \-\-strip-cwd-prefix [when]
+By default, relative paths are prefixed with './' when -x/--exec,
+-X/--exec-batch, or -0/--print0 are given, to reduce the risk of a
+path starting with '-' being treated as a command line option. Use
+this flag to change this behavior. If this flag is used without a value,
+it is equivalent to passing "always". Possible values are:
+.RS
+.IP auto
+Use the default behavior.
+.IP never
+Never strip the ./ at the beginning of paths
+.IP always
+Always strip the ./ at the beginning of paths
+.RE
.TP
.B \-\-one\-file\-system, \-\-mount, \-\-xdev
By default, fd will traverse the file system tree as far as other options dictate. With this flag, fd ensures that it does not descend into a different file system than the one it started in. Comparable to the -mount or -xdev filters of find(1).
diff --git a/src/cli.rs b/src/cli.rs
index d35d2fb..1b91862 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -617,9 +617,10 @@ pub struct Opts {
/// By default, relative paths are prefixed with './' when -x/--exec,
/// -X/--exec-batch, or -0/--print0 are given, to reduce the risk of a
/// path starting with '-' being treated as a command line option. Use
- /// this flag to disable this behaviour.
- #[arg(long, conflicts_with_all(&["path", "search_path"]), hide_short_help = true, long_help)]
- pub strip_cwd_prefix: bool,
+ /// this flag to change this behavior. If this flag is used without a value,
+ /// it is equivalent to passing "always".
+ #[arg(long, conflicts_with_all(&["path", "search_path"]), value_name = "when", hide_short_help = true, require_equals = true, long_help)]
+ strip_cwd_prefix: Option<Option<StripCwdWhen>>,
/// By default, fd will traverse the file system tree as far as other options
/// dictate. With this flag, fd ensures that it does not descend into a
@@ -700,6 +701,16 @@ impl Opts {
.or_else(|| self.max_one_result.then_some(1))
}
+ pub fn strip_cwd_prefix<P: FnOnce() -> bool>(&self, auto_pred: P) -> bool {
+ use self::StripCwdWhen::*;
+ self.no_search_paths()
+ && match self.strip_cwd_prefix.map_or(Auto, |o| o.unwrap_or(Always)) {
+ Auto => auto_pred(),
+ Always => true,
+ Never => false,
+ }
+ }
+
#[cfg(feature = "completions")]
pub fn gen_completions(&self) -> anyhow::Result<Option<Shell>> {
self.gen_completions
@@ -760,6 +771,16 @@ pub enum ColorWhen {
Never,
}
+#[derive(Copy, Clone, PartialEq, Eq, Debug, ValueEnum)]
+pub enum StripCwdWhen {
+ /// Use the default behavior
+ Auto,
+ /// Always strip the ./ at the beginning of paths
+ Always,
+ /// Never strip the ./
+ Never,
+}
+
// there isn't a derive api for getting grouped values yet,
// so we have to use hand-rolled parsing for exec and exec-batch
pub struct Exec {
diff --git a/src/main.rs b/src/main.rs
index bef4120..eacf02e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -311,8 +311,7 @@ fn construct_config(mut opts: Opts, pattern_regexps: &[String]) -> Result<Config
path_separator,
actual_path_separator,
max_results: opts.max_results(),
- strip_cwd_prefix: (opts.no_search_paths()
- && (opts.strip_cwd_prefix || !(opts.null_separator || has_command))),
+ strip_cwd_prefix: opts.strip_cwd_prefix(|| !(opts.null_separator || has_command)),
})
}