diff options
author | Andrew Gallant <jamslam@gmail.com> | 2019-04-14 16:46:02 -0400 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2019-04-14 19:29:27 -0400 |
commit | da9d7204315164e3740099aac4a4b88fb743e4d5 (patch) | |
tree | 5a03ef6a3f619ece2f7a9433f4d73c3885572075 /src | |
parent | a9d71a03680ac9c7b0b26ce6b0570145e7e2e2de (diff) |
ripgrep: add --pcre2-version flag
This flag will output details about the version of PCRE2 that ripgrep
is using (if any).
Diffstat (limited to 'src')
-rw-r--r-- | src/app.rs | 15 | ||||
-rw-r--r-- | src/args.rs | 17 | ||||
-rw-r--r-- | src/main.rs | 28 |
3 files changed, 55 insertions, 5 deletions
@@ -605,6 +605,7 @@ pub fn all_args_and_flags() -> Vec<RGArg> { flag_path_separator(&mut args); flag_passthru(&mut args); flag_pcre2(&mut args); + flag_pcre2_version(&mut args); flag_pre(&mut args); flag_pre_glob(&mut args); flag_pretty(&mut args); @@ -651,7 +652,7 @@ will be provided. Namely, the following is equivalent to the above: let arg = RGArg::positional("pattern", "PATTERN") .help(SHORT).long_help(LONG) .required_unless(&[ - "file", "files", "regexp", "type-list", + "file", "files", "regexp", "type-list", "pcre2-version", ]); args.push(arg); } @@ -1946,6 +1947,18 @@ This flag can be disabled with --no-pcre2. args.push(arg); } +fn flag_pcre2_version(args: &mut Vec<RGArg>) { + const SHORT: &str = "Print the version of PCRE2 that ripgrep uses."; + const LONG: &str = long!("\ +When this flag is present, ripgrep will print the version of PCRE2 in use, +along with other information, and then exit. If PCRE2 is not available, then +ripgrep will print an error message and exit with an error code. +"); + let arg = RGArg::switch("pcre2-version") + .help(SHORT).long_help(LONG); + args.push(arg); +} + fn flag_pre(args: &mut Vec<RGArg>) { const SHORT: &str = "search outputs of COMMAND FILE for each FILE"; const LONG: &str = long!("\ diff --git a/src/args.rs b/src/args.rs index 1a5b8a31..414bf815 100644 --- a/src/args.rs +++ b/src/args.rs @@ -73,6 +73,8 @@ pub enum Command { /// List all file type definitions configured, including the default file /// types and any additional file types added to the command line. Types, + /// Print the version of PCRE2 in use. + PCRE2Version, } impl Command { @@ -82,7 +84,11 @@ impl Command { match *self { Search | SearchParallel => true, - SearchNever | Files | FilesParallel | Types => false, + | SearchNever + | Files + | FilesParallel + | Types + | PCRE2Version => false, } } } @@ -235,7 +241,9 @@ impl Args { let threads = self.matches().threads()?; let one_thread = is_one_search || threads == 1; - Ok(if self.matches().is_present("type-list") { + Ok(if self.matches().is_present("pcre2-version") { + Command::PCRE2Version + } else if self.matches().is_present("type-list") { Command::Types } else if self.matches().is_present("files") { if one_thread { @@ -685,8 +693,8 @@ impl ArgMatches { .word(self.is_present("word-regexp")); // For whatever reason, the JIT craps out during regex compilation with // a "no more memory" error on 32 bit systems. So don't use it there. - if !cfg!(target_pointer_width = "32") { builder.jit_if_available(true); + if cfg!(target_pointer_width = "64") { } if self.pcre2_unicode() { builder.utf(true).ucp(true); @@ -1278,7 +1286,8 @@ impl ArgMatches { !cli::is_readable_stdin() || (self.is_present("file") && file_is_stdin) || self.is_present("files") - || self.is_present("type-list"); + || self.is_present("type-list") + || self.is_present("pcre2-version"); if search_cwd { Path::new("./").to_path_buf() } else { diff --git a/src/main.rs b/src/main.rs index 63dab998..f607422d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,6 +39,7 @@ fn try_main(args: Args) -> Result<()> { Files => files(&args), FilesParallel => files_parallel(&args), Types => types(&args), + PCRE2Version => pcre2_version(&args), }?; if matched && (args.quiet() || !messages::errored()) { process::exit(0) @@ -275,3 +276,30 @@ fn types(args: &Args) -> Result<bool> { } Ok(count > 0) } + +/// The top-level entry point for --pcre2-version. +fn pcre2_version(args: &Args) -> Result<bool> { + #[cfg(feature = "pcre2")] + fn imp(args: &Args) -> Result<bool> { + use grep::pcre2; + + let mut stdout = args.stdout(); + + let (major, minor) = pcre2::version(); + writeln!(stdout, "PCRE2 {}.{} is available", major, minor)?; + + if cfg!(target_pointer_width = "64") && pcre2::is_jit_available() { + writeln!(stdout, "JIT is available")?; + } + Ok(true) + } + + #[cfg(not(feature = "pcre2"))] + fn imp(args: &Args) -> Result<bool> { + let mut stdout = args.stdout(); + writeln!(stdout, "PCRE2 is not available in this build of ripgrep.")?; + Ok(false) + } + + imp(args) +} |