Skip to content

Commit

Permalink
cli: rejigger --version to include PCRE2 info
Browse files Browse the repository at this point in the history
This adds info about whether PCRE2 is available or not to the output of
--version. Essentially, --version now subsumes --pcre2-version, although
we do retain the former because it (usefully) emits an exit code based
on whether PCRE2 is available or not.

Closes #2645
  • Loading branch information
BurntSushi committed Nov 22, 2023
1 parent 204a79f commit 2a2671a
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 25 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ Feature enhancements:
The `--debug` flag now indicates whether stdin or `./` is being searched.
* [FEATURE #2643](https://github.com/BurntSushi/ripgrep/issues/2643):
Make `-d` a short flag for `--max-depth`.
* [FEATURE #2645](https://github.com/BurntSushi/ripgrep/issues/2645):
The `--version` output will now also contain PCRE2 availability information.

Bug fixes:

Expand Down
32 changes: 32 additions & 0 deletions crates/core/flags/doc/version.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,48 @@ pub(crate) fn generate_long() -> String {

let mut out = String::new();
writeln!(out, "{}", generate_short()).unwrap();
writeln!(out).unwrap();
writeln!(out, "features:{}", features().join(",")).unwrap();
if !compile.is_empty() {
writeln!(out, "simd(compile):{}", compile.join(",")).unwrap();
}
if !runtime.is_empty() {
writeln!(out, "simd(runtime):{}", runtime.join(",")).unwrap();
}
let (pcre2_version, _) = generate_pcre2();
writeln!(out, "\n{pcre2_version}").unwrap();
out
}

/// Generates multi-line version string with PCRE2 information.
///
/// This also returns whether PCRE2 is actually available in this build of
/// ripgrep.
pub(crate) fn generate_pcre2() -> (String, bool) {
let mut out = String::new();

#[cfg(feature = "pcre2")]
{
use grep::pcre2;

let (major, minor) = pcre2::version();
write!(out, "PCRE2 {}.{} is available", major, minor).unwrap();
if cfg!(target_pointer_width = "64") && pcre2::is_jit_available() {
writeln!(out, " (JIT is available)").unwrap();
} else {
writeln!(out, " (JIT is unavailable)").unwrap();
}
(out, true)
}

#[cfg(not(feature = "pcre2"))]
{
writeln!(out, "PCRE2 is not available in this build of ripgrep.")
.unwrap();
(out, false)
}
}

/// Returns the relevant SIMD features supported by the CPU at runtime.
///
/// This is kind of a dirty violation of abstraction, since it assumes
Expand Down
1 change: 1 addition & 0 deletions crates/core/flags/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ pub(crate) use crate::flags::{
man::generate as generate_man_page,
version::{
generate_long as generate_version_long,
generate_pcre2 as generate_version_pcre2,
generate_short as generate_version_short,
},
},
Expand Down
34 changes: 9 additions & 25 deletions crates/core/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,40 +383,24 @@ fn generate(mode: crate::flags::GenerateMode) -> anyhow::Result<ExitCode> {
fn special(mode: crate::flags::SpecialMode) -> anyhow::Result<ExitCode> {
use crate::flags::SpecialMode;

let mut exit = ExitCode::from(0);
let output = match mode {
SpecialMode::HelpShort => flags::generate_help_short(),
SpecialMode::HelpLong => flags::generate_help_long(),
SpecialMode::VersionShort => flags::generate_version_short(),
SpecialMode::VersionLong => flags::generate_version_long(),
// --pcre2-version is a little special because it emits an error
// exit code if this build of ripgrep doesn't support PCRE2.
SpecialMode::VersionPCRE2 => return version_pcre2(),
SpecialMode::VersionPCRE2 => {
let (output, available) = flags::generate_version_pcre2();
if !available {
exit = ExitCode::from(1);
}
output
}
};
writeln!(std::io::stdout(), "{}", output.trim_end())?;
Ok(ExitCode::from(0))
}

/// The top-level entry point for `--pcre2-version`.
fn version_pcre2() -> anyhow::Result<ExitCode> {
let mut stdout = std::io::stdout().lock();

#[cfg(feature = "pcre2")]
{
use grep::pcre2;

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(ExitCode::from(0))
}

#[cfg(not(feature = "pcre2"))]
{
writeln!(stdout, "PCRE2 is not available in this build of ripgrep.")?;
Ok(ExitCode::from(1))
}
Ok(exit)
}

/// Prints a heuristic error messages when nothing is searched.
Expand Down

0 comments on commit 2a2671a

Please sign in to comment.