mirror of https://github.com/sharkdp/fd.git
Merge pull request #1169 from Ptipiak/mention-executable-detection
Using faccess lib to detect executable files
This commit is contained in:
commit
38cdeb0413
16
CHANGELOG.md
16
CHANGELOG.md
|
@ -1,5 +1,21 @@
|
||||||
# Upcoming release
|
# Upcoming release
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- Breaking: On Unix-like systems, `--type executable` now additionally checks if
|
||||||
|
the file is executable by the current user, see #1106 and #1169 (@ptipiak)
|
||||||
|
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# v8.5.3
|
# v8.5.3
|
||||||
|
|
||||||
## Bugfixes
|
## Bugfixes
|
||||||
|
|
|
@ -51,6 +51,7 @@ chrono = "0.4"
|
||||||
once_cell = "1.15.0"
|
once_cell = "1.15.0"
|
||||||
crossbeam-channel = "0.5.6"
|
crossbeam-channel = "0.5.6"
|
||||||
clap_complete = {version = "4.0.5", optional = true}
|
clap_complete = {version = "4.0.5", optional = true}
|
||||||
|
faccess = "0.2.4"
|
||||||
|
|
||||||
[dependencies.clap]
|
[dependencies.clap]
|
||||||
version = "4.0.22"
|
version = "4.0.22"
|
||||||
|
@ -63,9 +64,6 @@ nix = { version = "0.24.2", default-features = false, features = ["signal"] }
|
||||||
[target.'cfg(all(unix, not(target_os = "redox")))'.dependencies]
|
[target.'cfg(all(unix, not(target_os = "redox")))'.dependencies]
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
|
||||||
faccess = "0.2.4"
|
|
||||||
|
|
||||||
# FIXME: Re-enable jemalloc on macOS
|
# FIXME: Re-enable jemalloc on macOS
|
||||||
# jemalloc is currently disabled on macOS due to a bug in jemalloc in combination with macOS
|
# jemalloc is currently disabled on macOS due to a bug in jemalloc in combination with macOS
|
||||||
# Catalina. See https://github.com/sharkdp/fd/issues/498 for details.
|
# Catalina. See https://github.com/sharkdp/fd/issues/498 for details.
|
||||||
|
|
|
@ -643,6 +643,7 @@ pub enum FileType {
|
||||||
Directory,
|
Directory,
|
||||||
#[value(alias = "l")]
|
#[value(alias = "l")]
|
||||||
Symlink,
|
Symlink,
|
||||||
|
/// A file which is executable by the current effective user
|
||||||
#[value(alias = "x")]
|
#[value(alias = "x")]
|
||||||
Executable,
|
Executable,
|
||||||
#[value(alias = "e")]
|
#[value(alias = "e")]
|
||||||
|
|
|
@ -4,12 +4,9 @@ use std::ffi::OsStr;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
#[cfg(any(unix, target_os = "redox"))]
|
#[cfg(any(unix, target_os = "redox"))]
|
||||||
use std::os::unix::fs::{FileTypeExt, PermissionsExt};
|
use std::os::unix::fs::FileTypeExt;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
use faccess::PathExt as _;
|
|
||||||
|
|
||||||
use normpath::PathExt;
|
use normpath::PathExt;
|
||||||
|
|
||||||
use crate::dir_entry;
|
use crate::dir_entry;
|
||||||
|
@ -44,16 +41,6 @@ pub fn is_existing_directory(path: &Path) -> bool {
|
||||||
path.is_dir() && (path.file_name().is_some() || path.normalize().is_ok())
|
path.is_dir() && (path.file_name().is_some() || path.normalize().is_ok())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(unix, target_os = "redox"))]
|
|
||||||
pub fn is_executable(_: &Path, md: &fs::Metadata) -> bool {
|
|
||||||
md.permissions().mode() & 0o111 != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
pub fn is_executable(path: &Path, _: &fs::Metadata) -> bool {
|
|
||||||
path.executable()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_empty(entry: &dir_entry::DirEntry) -> bool {
|
pub fn is_empty(entry: &dir_entry::DirEntry) -> bool {
|
||||||
if let Some(file_type) = entry.file_type() {
|
if let Some(file_type) = entry.file_type() {
|
||||||
if file_type.is_dir() {
|
if file_type.is_dir() {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use crate::dir_entry;
|
use crate::dir_entry;
|
||||||
use crate::filesystem;
|
use crate::filesystem;
|
||||||
|
|
||||||
|
use faccess::PathExt;
|
||||||
|
|
||||||
/// Whether or not to show
|
/// Whether or not to show
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct FileTypes {
|
pub struct FileTypes {
|
||||||
|
@ -21,11 +23,7 @@ impl FileTypes {
|
||||||
|| (!self.symlinks && entry_type.is_symlink())
|
|| (!self.symlinks && entry_type.is_symlink())
|
||||||
|| (!self.sockets && filesystem::is_socket(*entry_type))
|
|| (!self.sockets && filesystem::is_socket(*entry_type))
|
||||||
|| (!self.pipes && filesystem::is_pipe(*entry_type))
|
|| (!self.pipes && filesystem::is_pipe(*entry_type))
|
||||||
|| (self.executables_only
|
|| (self.executables_only && !entry.path().executable())
|
||||||
&& !entry
|
|
||||||
.metadata()
|
|
||||||
.map(|md| filesystem::is_executable(entry.path(), md))
|
|
||||||
.unwrap_or(false))
|
|
||||||
|| (self.empty_only && !filesystem::is_empty(entry))
|
|| (self.empty_only && !filesystem::is_empty(entry))
|
||||||
|| !(entry_type.is_file()
|
|| !(entry_type.is_file()
|
||||||
|| entry_type.is_dir()
|
|| entry_type.is_dir()
|
||||||
|
|
Loading…
Reference in New Issue