diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bc1086..5c2cce9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,16 +5,20 @@ ## Features +- Support multiple `--exec ` instances, see #406 and +#960 (@tmccombs) ## Bugfixes ## Changes -- Directories are now printed with an additional path separator at the end: `foo/bar/` +- Changed `-u` flag to be equivalent to `-HI`. Multiple `-u` flags still allowed but do nothing, see #840 (@jacksontheel) +- Directories are now printed with an additional path separator at the end: `foo/bar/`, see #436 and #812 (@yyogo) ## Other +- Added installation instructions for RHEL8, see #989 (@ethsol) # v8.3.2 diff --git a/Cargo.lock b/Cargo.lock index 8895415..df8805a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,9 +22,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.55" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "159bb86af3a200e19a068f4224eae4c8bb2d0fa054c7e5d1cacd5cef95e684cd" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" [[package]] name = "atty" @@ -85,15 +85,15 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.5" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced1892c55c910c1219e98d6fc8d71f6bddba7905866ce740066d8bfea859312" +checksum = "535434c063ced786eb04aaf529308092c5ab60889e8fe24275d15de07b01fa97" dependencies = [ "atty", "bitflags", + "clap_lex", "indexmap", "lazy_static", - "os_str_bytes", "strsim", "termcolor", "terminal_size", @@ -102,13 +102,22 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.1.1" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6f3613c0a3cddfd78b41b10203eb322cb29b600cbdf808a7d3db95691b8e25" +checksum = "1d7ca9141e27e6ebc52e3c378b0c07f3cea52db46ed1cc5861735fb697b56356" dependencies = [ "clap", ] +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "crossbeam-utils" version = "0.8.7" @@ -121,9 +130,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.2.1" +version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19c6cedffdc8c03a3346d723eb20bd85a13362bb96dc2ac000842c6381ec7bf" +checksum = "b37feaa84e6861e00a1f5e5aa8da3ee56d605c9992d33e082786754828e20865" dependencies = [ "nix", "winapi", @@ -320,9 +329,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.119" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] name = "log" @@ -359,12 +368,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.23.1" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" dependencies = [ "bitflags", - "cc", "cfg-if", "libc", "memoffset", @@ -410,18 +418,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "os_str_bytes" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" -dependencies = [ - "memchr", -] [[package]] name = "proc-macro-error" @@ -523,9 +528,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", "memchr", @@ -604,9 +609,9 @@ dependencies = [ [[package]] name = "test-case" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7d58e237f65d5fe5eaf1105188c94c9a441e1fbc298ed5df45ec9c9af236d3" +checksum = "6344589a99d3971d6fa4e8314dbcbeca2df6273a6b642e46906971779159af1f" dependencies = [ "cfg-if", "proc-macro-error", diff --git a/Cargo.toml b/Cargo.toml index 6502428..636d8c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ ansi_term = "0.12" atty = "0.2" ignore = "0.4.3" num_cpus = "1.13" -regex = "1.5.4" +regex = "1.5.5" regex-syntax = "0.6" ctrlc = "3.2" humantime = "2.1" @@ -49,7 +49,7 @@ anyhow = "1.0" dirs-next = "2.0" normpath = "0.3.2" chrono = "0.4" -once_cell = "1.9.0" +once_cell = "1.10.0" [dependencies.clap] version = "3.1" @@ -57,7 +57,7 @@ features = ["suggestions", "color", "wrap_help", "cargo", "unstable-grouped"] [target.'cfg(unix)'.dependencies] users = "0.11.0" -nix = "0.23.1" +nix = "0.24.1" [target.'cfg(all(unix, not(target_os = "redox")))'.dependencies] libc = "0.2" diff --git a/README.md b/README.md index 8d28ce7..7267bfc 100644 --- a/README.md +++ b/README.md @@ -592,6 +592,22 @@ You can install `fd` via xbps-install: xbps-install -S fd ``` +### On RedHat Enterprise Linux 8 (RHEL8) or Almalinux 8 or Rocky Linux 8 + +Get the latest fd-v*-x86_64-unknown-linux-gnu.tar.gz file from [sharkdp on github](https://github.com/sharkdp/fd/releases) +``` +tar xf fd-v*-x86_64-unknown-linux-gnu.tar.gz +chown -R root:root fd-v*-x86_64-unknown-linux-gnu +cd fd-v*-x86_64-unknown-linux-gnu +sudo cp fd /bin +gzip fd.1 +chown root:root fd.1.gz +sudo cp fd.1.gz /usr/share/man/man1 +sudo cp autocomplete/fd.bash /usr/share/bash-completion/completions/fd +source /usr/share/bash-completion/completions/fd +fd +``` + ### On macOS You can install `fd` with [Homebrew](https://formulae.brew.sh/formula/fd): @@ -618,6 +634,13 @@ Or via [Chocolatey](https://chocolatey.org): choco install fd ``` +### On GuixOS + +You can install [the fd package](https://guix.gnu.org/en/packages/fd-8.1.1/) from the official repo: +``` +guix install fd +``` + ### On NixOS / via Nix You can use the [Nix package manager](https://nixos.org/nix/) to install `fd`: diff --git a/doc/fd.1 b/doc/fd.1 index 620af8b..314b0a1 100644 --- a/doc/fd.1 +++ b/doc/fd.1 @@ -58,7 +58,7 @@ The global fd ignore file (usually The flag can be overridden with '--ignore'. .TP .B \-u, \-\-unrestricted -Alias for '--no-ignore'. Can be repeated; '-uu' is an alias for '--no-ignore --hidden'. +Perform an unrestricted search, including ignored and hidden files. This is an alias for '--hidden --no-ignore'. .TP .B \-\-no\-ignore\-vcs Show search results from files and directories that would otherwise be ignored by gitignore files diff --git a/src/app.rs b/src/app.rs index 01ddc1d..d7cdc3f 100644 --- a/src/app.rs +++ b/src/app.rs @@ -102,12 +102,12 @@ pub fn build_app() -> Command<'static> { .short('u') .long("unrestricted") .overrides_with_all(&["ignore", "no-hidden"]) - .multiple_occurrences(true) + .multiple_occurrences(true) // Allowed for historical reasons .hide_short_help(true) - .help("Alias for '--no-ignore', and '--hidden' when given twice") + .help("Unrestricted search, alias for '--no-ignore --hidden'") .long_help( - "Alias for '--no-ignore'. Can be repeated. '-uu' is an alias for \ - '--no-ignore --hidden'.", + "Perform an unrestricted search, including ignored and hidden files. This is \ + an alias for '--no-ignore --hidden'." ), ) .arg( diff --git a/src/main.rs b/src/main.rs index 40aea58..9c16ff0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -260,7 +260,7 @@ fn construct_config(matches: clap::ArgMatches, pattern_regex: &str) -> Result= 2), + || matches.is_present("rg-alias-hidden-ignore")), read_fdignore: !(matches.is_present("no-ignore") || matches.is_present("rg-alias-hidden-ignore")), read_vcsignore: !(matches.is_present("no-ignore") diff --git a/src/regex_helper.rs b/src/regex_helper.rs index bc7f77a..877c927 100644 --- a/src/regex_helper.rs +++ b/src/regex_helper.rs @@ -15,19 +15,19 @@ pub fn pattern_has_uppercase_char(pattern: &str) -> bool { fn hir_has_uppercase_char(hir: &Hir) -> bool { use regex_syntax::hir::*; - match *hir.kind() { + match hir.kind() { HirKind::Literal(Literal::Unicode(c)) => c.is_uppercase(), - HirKind::Literal(Literal::Byte(b)) => char::from(b).is_uppercase(), - HirKind::Class(Class::Unicode(ref ranges)) => ranges + HirKind::Literal(Literal::Byte(b)) => char::from(*b).is_uppercase(), + HirKind::Class(Class::Unicode(ranges)) => ranges .iter() .any(|r| r.start().is_uppercase() || r.end().is_uppercase()), - HirKind::Class(Class::Bytes(ref ranges)) => ranges + HirKind::Class(Class::Bytes(ranges)) => ranges .iter() .any(|r| char::from(r.start()).is_uppercase() || char::from(r.end()).is_uppercase()), - HirKind::Group(Group { ref hir, .. }) | HirKind::Repetition(Repetition { ref hir, .. }) => { + HirKind::Group(Group { hir, .. }) | HirKind::Repetition(Repetition { hir, .. }) => { hir_has_uppercase_char(hir) } - HirKind::Concat(ref hirs) | HirKind::Alternation(ref hirs) => { + HirKind::Concat(hirs) | HirKind::Alternation(hirs) => { hirs.iter().any(hir_has_uppercase_char) } _ => false, @@ -52,11 +52,11 @@ fn hir_matches_strings_with_leading_dot(hir: &Hir) -> bool { // "^\\.", i.e. a start text anchor and a literal dot character. There are a lot // of other patterns that ONLY match hidden files, e.g. ^(\\.foo|\\.bar) which are // not (yet) detected by this algorithm. - match *hir.kind() { - HirKind::Concat(ref hirs) => { + match hir.kind() { + HirKind::Concat(hirs) => { let mut hirs = hirs.iter(); if let Some(hir) = hirs.next() { - if *hir.kind() != HirKind::Anchor(Anchor::StartText) { + if hir.kind() != &HirKind::Anchor(Anchor::StartText) { return false; } } else { @@ -64,7 +64,7 @@ fn hir_matches_strings_with_leading_dot(hir: &Hir) -> bool { } if let Some(hir) = hirs.next() { - *hir.kind() == HirKind::Literal(Literal::Unicode('.')) + hir.kind() == &HirKind::Literal(Literal::Unicode('.')) } else { false } diff --git a/tests/tests.rs b/tests/tests.rs index 5efae31..2b83e64 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -656,18 +656,6 @@ fn test_no_ignore_aliases() { te.assert_output( &["-u", "foo"], - "./a.foo - ./fdignored.foo - ./gitignored.foo - ./one/b.foo - ./one/two/c.foo - ./one/two/C.Foo2 - ./one/two/three/d.foo - ./one/two/three/directory_foo/", - ); - - te.assert_output( - &["-uu", "foo"], "./.hidden.foo ./a.foo ./fdignored.foo @@ -2039,7 +2027,7 @@ fn test_number_parsing_errors() { #[test_case("--no-ignore-vcs", &["--ignore-vcs"] ; "no-ignore-vcs")] #[test_case("--follow", &["--no-follow"] ; "follow")] #[test_case("--absolute-path", &["--relative-path"] ; "absolute-path")] -#[test_case("-u", &["--ignore"] ; "u")] +#[test_case("-u", &["--ignore", "--no-hidden"] ; "u")] #[test_case("-uu", &["--ignore", "--no-hidden"] ; "uu")] fn test_opposing(flag: &str, opposing_flags: &[&str]) { let te = TestEnv::new(DEFAULT_DIRS, DEFAULT_FILES);