Add same file system functionality

This adds a `--same-file-system` CLI option that instructs the walker to
not cross file system boundaries.
Due to the fact that the corresponding option of the `ignore` crate's
`WalkBuilder` does not support platforms other than Unix and Windows,
the option does nothing on platforms other than those.
Resolves #507
This commit is contained in:
Simon Engmann 2019-11-14 21:55:40 +01:00 committed by David Peter
parent 0f27485faf
commit 8796de57b5
5 changed files with 26 additions and 13 deletions

View file

@ -285,19 +285,20 @@ USAGE:
fd [FLAGS/OPTIONS] [<pattern>] [<path>...]
FLAGS:
-H, --hidden Search hidden files and directories
-I, --no-ignore Do not respect .(git|fd)ignore files
--no-ignore-vcs Do not respect .gitignore files
-s, --case-sensitive Case-sensitive search (default: smart case)
-i, --ignore-case Case-insensitive search (default: smart case)
-g, --glob Glob-based search (default: regular expression)
-F, --fixed-strings Treat the pattern as a literal string
-a, --absolute-path Show absolute instead of relative paths
-L, --follow Follow symbolic links
-p, --full-path Search full path (default: file-/dirname only)
-0, --print0 Separate results by the null character
-h, --help Prints help information
-V, --version Prints version information
-H, --hidden Search hidden files and directories
-I, --no-ignore Do not respect .(git|fd)ignore files
--no-ignore-vcs Do not respect .gitignore files
-s, --case-sensitive Case-sensitive search (default: smart case)
-i, --ignore-case Case-insensitive search (default: smart case)
-g, --glob Glob-based search (default: regular expression)
-F, --fixed-strings Treat the pattern as a literal string
-a, --absolute-path Show absolute instead of relative paths
-L, --follow Follow symbolic links
--same-file-system Don't cross file system boundaries (only Unix/Windows)
-p, --full-path Search full path (default: file-/dirname only)
-0, --print0 Separate results by the null character
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-d, --max-depth <depth> Set maximum search depth (default: none)

View file

@ -115,6 +115,7 @@ pub fn build_app() -> App<'static, 'static> {
.alias("dereference")
.overrides_with("follow"),
)
.arg(arg("same-file-system").long("same-file-system"))
.arg(
arg("full-path")
.long("full-path")
@ -329,6 +330,11 @@ fn usage() -> HashMap<&'static str, Help> {
, "Follow symbolic links"
, "By default, fd does not descend into symlinked directories. Using this flag, symbolic \
links are also traversed.");
doc!(h, "same-file-system"
, "Don't cross file system boundaries (only Unix/Windows)"
, "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. Does nothing if not on Unix or Windows.");
doc!(h, "full-path"
, "Search full path (default: file-/dirname only)"
, "By default, the search pattern is only matched against the filename (or directory \

View file

@ -28,6 +28,9 @@ pub struct FdOptions {
/// Whether to follow symlinks or not.
pub follow_links: bool,
/// Whether to limit the search to starting file system or not.
pub same_file_system: bool,
/// Whether elements of output should be separated by a null character
pub null_separator: bool,

View file

@ -208,6 +208,7 @@ fn main() {
|| matches.is_present("rg-alias-hidden-ignore")
|| matches.is_present("no-ignore-vcs")),
follow_links: matches.is_present("follow"),
same_file_system: matches.is_present("same-file-system"),
null_separator: matches.is_present("null_separator"),
max_depth: matches
.value_of("depth")

View file

@ -78,6 +78,8 @@ pub fn scan(path_vec: &[PathBuf], pattern: Arc<Regex>, config: Arc<FdOptions>) -
.git_exclude(config.read_vcsignore)
.overrides(overrides)
.follow_links(config.follow_links)
// Same file system is only supported on Unix and Windows platforms
.same_file_system(config.same_file_system && (cfg!(unix) || cfg!(windows)))
.max_depth(config.max_depth);
if config.read_fdignore {