Upgrade to clap 4.0

This commit is contained in:
Thayne McCombs 2022-10-08 23:51:45 -06:00
parent a50e417c67
commit f4c34b81c7
4 changed files with 110 additions and 89 deletions

96
Cargo.lock generated
View file

@ -96,36 +96,34 @@ dependencies = [
[[package]]
name = "clap"
version = "3.2.20"
version = "4.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b71c3ce99b7611011217b366d923f1d0a7e07a92bb2dbf1e84508c673ca3bd"
checksum = "3b1a0a4208c6c483b952ad35c6eed505fc13b46f08f631b81e828084a9318d74"
dependencies = [
"atty",
"bitflags",
"clap_derive",
"clap_lex",
"indexmap",
"once_cell",
"strsim",
"termcolor",
"terminal_size",
"textwrap",
]
[[package]]
name = "clap_complete"
version = "3.2.2"
version = "4.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c09fbb00fb6e20e92f785598ecbf0c118f269737490c57af28b1ed07f392be16"
checksum = "11cba7abac9b56dfe2f035098cdb3a43946f276e6db83b72c4e692343f9aab9a"
dependencies = [
"clap",
]
[[package]]
name = "clap_derive"
version = "3.2.18"
version = "4.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65"
checksum = "db342ce9fda24fb191e2ed4e102055a4d381c1086a06630174cd8da8d5d917ce"
dependencies = [
"heck",
"proc-macro-error",
@ -136,9 +134,9 @@ dependencies = [
[[package]]
name = "clap_lex"
version = "0.2.3"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87eba3c8c7f42ef17f6c659fc7416d0f4758cd3e58861ee63c5fa4a4dde649e4"
checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
dependencies = [
"os_str_bytes",
]
@ -190,6 +188,27 @@ dependencies = [
"winapi",
]
[[package]]
name = "errno"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
dependencies = [
"errno-dragonfly",
"libc",
"winapi",
]
[[package]]
name = "errno-dragonfly"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "fd-find"
version = "8.4.0"
@ -277,12 +296,6 @@ dependencies = [
"regex",
]
[[package]]
name = "hashbrown"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3"
[[package]]
name = "heck"
version = "0.4.0"
@ -323,14 +336,10 @@ dependencies = [
]
[[package]]
name = "indexmap"
version = "1.9.1"
name = "io-lifetimes"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
dependencies = [
"autocfg",
"hashbrown",
]
checksum = "1ea37f355c05dde75b84bba2d767906ad522e97cd9e2eef2be7a4ab7fb442c06"
[[package]]
name = "jemalloc-sys"
@ -365,6 +374,12 @@ version = "0.2.132"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
[[package]]
name = "linux-raw-sys"
version = "0.0.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d"
[[package]]
name = "log"
version = "0.4.17"
@ -510,9 +525,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.40"
version = "1.0.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7"
checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b"
dependencies = [
"unicode-ident",
]
@ -609,6 +624,20 @@ dependencies = [
"winapi",
]
[[package]]
name = "rustix"
version = "0.35.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72c825b8aa8010eb9ee99b75f05e10180b9278d161583034d7574c9d617aeada"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
"windows-sys",
]
[[package]]
name = "same-file"
version = "1.0.6"
@ -656,12 +685,12 @@ dependencies = [
[[package]]
name = "terminal_size"
version = "0.1.17"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
checksum = "8440c860cf79def6164e4a0a983bcc2305d82419177a0e0c71930d049e3ac5a1"
dependencies = [
"libc",
"winapi",
"rustix",
"windows-sys",
]
[[package]]
@ -686,15 +715,6 @@ dependencies = [
"syn",
]
[[package]]
name = "textwrap"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
dependencies = [
"terminal_size",
]
[[package]]
name = "thiserror"
version = "1.0.31"

View file

@ -30,7 +30,6 @@ name = "fd"
path = "src/main.rs"
[build-dependencies]
clap = { version = "3.2", features = ["cargo"] }
version_check = "0.9"
[dependencies]
@ -50,10 +49,10 @@ dirs-next = "2.0"
normpath = "0.3.2"
chrono = "0.4"
once_cell = "1.13.1"
clap_complete = {version = "3.2", optional = true}
clap_complete = {version = "4.0", optional = true}
[dependencies.clap]
version = "3.2"
version = "4.0"
features = ["suggestions", "color", "wrap_help", "cargo", "unstable-grouped", "derive"]
[target.'cfg(unix)'.dependencies]

View file

@ -4,8 +4,8 @@ use std::time::Duration;
#[cfg(feature = "completions")]
use anyhow::anyhow;
use clap::{
builder::RangedU64ValueParser, value_parser, AppSettings, Arg, ArgAction, ArgGroup, ArgMatches,
Command, ErrorKind, Parser, ValueEnum,
builder::RangedU64ValueParser, error::ErrorKind, value_parser, Arg, ArgAction, ArgGroup,
ArgMatches, Command, Parser, ValueEnum,
};
#[cfg(feature = "completions")]
use clap_complete::Shell;
@ -23,23 +23,24 @@ use crate::filter::SizeFilter;
struct Negations;
impl clap::FromArgMatches for Negations {
fn from_arg_matches(_: &ArgMatches) -> clap::Result<Self> {
fn from_arg_matches(_: &ArgMatches) -> clap::error::Result<Self> {
Ok(Negations)
}
fn update_from_arg_matches(&mut self, _: &ArgMatches) -> clap::Result<()> {
fn update_from_arg_matches(&mut self, _: &ArgMatches) -> clap::error::Result<()> {
Ok(())
}
}
impl clap::Args for Negations {
fn augment_args(cmd: Command<'_>) -> Command<'_> {
fn augment_args(cmd: Command) -> Command {
Self::augment_args_for_update(cmd)
}
fn augment_args_for_update(cmd: Command<'_>) -> Command<'_> {
fn augment_args_for_update(cmd: Command) -> Command {
cmd.arg(
Arg::new("no-hidden")
Arg::new("no_hidden")
.action(ArgAction::Count)
.long("no-hidden")
.overrides_with("hidden")
.hide(true)
@ -47,27 +48,31 @@ impl clap::Args for Negations {
)
.arg(
Arg::new("ignore")
.action(ArgAction::Count)
.long("ignore")
.overrides_with("no-ignore")
.overrides_with("no_ignore")
.hide(true)
.long_help("Overrides --no-ignore."),
)
.arg(
Arg::new("ignore-vcs")
Arg::new("ignore_vcs")
.action(ArgAction::Count)
.long("ignore-vcs")
.overrides_with("no-ignore-vcs")
.overrides_with("no_ignore_vcs")
.hide(true)
.long_help("Overrides --no-ignore-vcs."),
)
.arg(
Arg::new("relative-path")
Arg::new("relative_path")
.action(ArgAction::Count)
.long("relative-path")
.overrides_with("absolute-path")
.overrides_with("absolute_path")
.hide(true)
.long_help("Overrides --absolute-path."),
)
.arg(
Arg::new("no-follow")
Arg::new("no_follow")
.action(ArgAction::Count)
.long("no-follow")
.overrides_with("follow")
.hide(true)
@ -79,12 +84,12 @@ impl clap::Args for Negations {
#[derive(Parser)]
#[clap(
version,
setting(AppSettings::DeriveDisplayOrder),
dont_collapse_args_in_usage = true,
after_help = "Note: `fd -h` prints a short and concise overview while `fd --help` gives all \
details.",
group(ArgGroup::new("execs").args(&["exec", "exec-batch", "list-details"]).conflicts_with_all(&[
"max-results", "has-results", "count"])),
args_override_self = true,
group(ArgGroup::new("execs").args(&["exec", "exec_batch", "list_details"]).conflicts_with_all(&[
"max_results", "has_results", "count"])),
)]
pub struct Opts {
/// Search hidden files and directories
@ -121,24 +126,24 @@ pub struct Opts {
///
///Perform an unrestricted search, including ignored and hidden files. This is
///an alias for '--no-ignore --hidden'.
#[clap(long = "unrestricted", short = 'u', overrides_with_all(&["ignore", "no-hidden"]), action(ArgAction::Count), hide_short_help = true)]
#[clap(long = "unrestricted", short = 'u', overrides_with_all(&["ignore", "no_hidden"]), action(ArgAction::Count), hide_short_help = true)]
rg_alias_hidden_ignore: u8,
/// Case-sensitive search (default: smart case)
///
///Perform a case-sensitive search. By default, fd uses case-insensitive
///searches, unless the pattern contains an uppercase character (smart case).
#[clap(long, short = 's', action, overrides_with("ignore-case"))]
#[clap(long, short = 's', action, overrides_with("ignore_case"))]
pub case_sensitive: bool,
/// Case-insensitive search (default: smart case)
///
/// Perform a case-insensitive search. By default, fd uses case-insensitive searches, unless
/// the pattern contains an uppercase character (smart case).
#[clap(long, short = 'i', action, overrides_with("case-sensitive"))]
#[clap(long, short = 'i', action, overrides_with("case_sensitive"))]
pub ignore_case: bool,
/// Glob-based search (default: regular expression)
///
/// Perform a glob-based search instead of a regular expression search.
#[clap(long, short = 'g', action, conflicts_with("fixed-strings"))]
#[clap(long, short = 'g', action, conflicts_with("fixed_strings"))]
pub glob: bool,
/// Regular-expression based search (default)
///
@ -164,7 +169,7 @@ pub struct Opts {
/// for '--exec-batch ls -l' with some additional 'ls' options. This can be
/// used to see more metadata, to show symlink targets and to achieve a
/// deterministic sort order.
#[clap(long, short = 'l', action, conflicts_with("absolute-path"))]
#[clap(long, short = 'l', action, conflicts_with("absolute_path"))]
pub list_details: bool,
/// Follow symbolic links
///
@ -190,7 +195,7 @@ pub struct Opts {
long = "print0",
short = '0',
action,
conflicts_with("list-details"),
conflicts_with("list_details"),
hide_short_help = true
)]
pub null_separator: bool,
@ -216,13 +221,13 @@ pub struct Opts {
///
/// Only show search results at the exact given depth. This is an alias for
/// '--min-depth <depth> --max-depth <depth>'.
#[clap(long, value_name = "depth", hide_short_help = true, value_parser, conflicts_with_all(&["max-depth", "min-depth"]))]
#[clap(long, value_name = "depth", hide_short_help = true, value_parser, conflicts_with_all(&["max_depth", "min_depth"]))]
exact_depth: Option<usize>,
/// Do not travers into matching directories
///
/// Do not traverse into directories that match the search criteria. If
/// you want to exclude specific directories, use the '--exclude=…' option.
#[clap(long, hide_short_help = true, action, conflicts_with_all(&["size", "exact-depth"]))]
#[clap(long, hide_short_help = true, action, conflicts_with_all(&["size", "exact_depth"]))]
pub prune: bool,
/// Filter by type: file (f), directory (d), symlink (l),
/// executable (x), empty (e), socket (s), pipe (p)
@ -296,7 +301,7 @@ pub struct Opts {
long,
value_name = "size",
hide_short_help = true,
requires("exec-batch"),
requires("exec_batch"),
value_parser = value_parser!(usize),
default_value_t
)]
@ -413,7 +418,7 @@ pub struct Opts {
#[clap(
short = '1',
hide_short_help = true,
overrides_with("max-results"),
overrides_with("max_results"),
action
)]
max_one_result: bool,
@ -429,7 +434,7 @@ pub struct Opts {
short = 'q',
alias = "has-results",
hide_short_help = true,
conflicts_with("max-results"),
conflicts_with("max_results"),
action
)]
pub quiet: bool,
@ -476,7 +481,7 @@ pub struct Opts {
///
/// By default, relative paths are prefixed with './' when the output goes to a non
/// interactive terminal (TTY). Use this flag to disable this behaviour.
#[clap(long, conflicts_with_all(&["path", "search-path"]), hide_short_help = true, action)]
#[clap(long, conflicts_with_all(&["path", "search_path"]), hide_short_help = true, action)]
pub strip_cwd_prefix: bool,
/// Filter by owning user and/or group
///
@ -501,7 +506,7 @@ pub struct Opts {
pub one_file_system: bool,
#[cfg(feature = "completions")]
#[clap(long, value_parser = value_parser!(Shell), hide = true, exclusive = true)]
#[clap(long, action, hide = true, exclusive = true)]
gen_completions: Option<Option<Shell>>,
#[clap(flatten)]
@ -642,13 +647,13 @@ pub struct Exec {
}
impl clap::FromArgMatches for Exec {
fn from_arg_matches(matches: &ArgMatches) -> clap::Result<Self> {
fn from_arg_matches(matches: &ArgMatches) -> clap::error::Result<Self> {
let command = matches
.grouped_values_of("exec")
.map(CommandSet::new)
.or_else(|| {
matches
.grouped_values_of("exec-batch")
.grouped_values_of("exec_batch")
.map(CommandSet::new_batch)
})
.transpose()
@ -656,23 +661,23 @@ impl clap::FromArgMatches for Exec {
Ok(Exec { command })
}
fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> clap::Result<()> {
fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> clap::error::Result<()> {
*self = Self::from_arg_matches(matches)?;
Ok(())
}
}
impl clap::Args for Exec {
fn augment_args(cmd: Command<'_>) -> Command<'_> {
fn augment_args(cmd: Command) -> Command {
cmd.arg(Arg::new("exec")
.action(ArgAction::Append)
.long("exec")
.short('x')
.min_values(1)
.multiple_occurrences(true)
.num_args(1..)
.allow_hyphen_values(true)
.value_terminator(";")
.value_name("cmd")
.conflicts_with("list-details")
.conflicts_with("list_details")
.help("Execute a command for each search result")
.long_help(
"Execute a command for each search result in parallel (use --threads=1 for sequential command execution). \
@ -696,15 +701,15 @@ impl clap::Args for Exec {
),
)
.arg(
Arg::new("exec-batch")
Arg::new("exec_batch")
.action(ArgAction::Append)
.long("exec-batch")
.short('X')
.min_values(1)
.multiple_occurrences(true)
.num_args(1..)
.allow_hyphen_values(true)
.value_terminator(";")
.value_name("cmd")
.conflicts_with_all(&["exec", "list-details"])
.conflicts_with_all(&["exec", "list_details"])
.help("Execute a command with all search results at once")
.long_help(
"Execute the given command once, with all search results as arguments.\n\
@ -725,7 +730,7 @@ impl clap::Args for Exec {
)
}
fn augment_args_for_update(cmd: Command<'_>) -> Command<'_> {
fn augment_args_for_update(cmd: Command) -> Command {
Self::augment_args(cmd)
}
}
@ -743,4 +748,3 @@ fn ensure_current_directory_exists(current_directory: &Path) -> anyhow::Result<(
))
}
}

View file

@ -1466,10 +1466,9 @@ fn test_exec_batch() {
&["foo", "--exec-batch", "echo", "{}", "{}"],
"error: Only one placeholder allowed for batch commands\n\
\n\
USAGE:\n\
fd-find [OPTIONS] [--] [PATTERN] [PATH]...\n\
Usage: fd-find [OPTIONS] [PATTERN] [PATH]...\n\
\n\
For more information try --help\n\
For more information try '--help'\n\
",
);
@ -1487,10 +1486,9 @@ fn test_exec_batch() {
&["foo", "--exec-batch", "echo {}"],
"error: First argument of exec-batch is expected to be a fixed executable\n\
\n\
USAGE:\n\
fd-find [OPTIONS] [--] [PATTERN] [PATH]...\n\
Usage: fd-find [OPTIONS] [PATTERN] [PATH]...\n\
\n\
For more information try --help\n\
For more information try '--help'\n\
",
);
}