diff options
author | Balaji Sivaraman <balaji@balajisivaraman.com> | 2018-01-01 21:54:46 +0530 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2018-01-01 11:24:46 -0500 |
commit | 14779ed0ea5d28aaa6c04dff3be77989f9fd2836 (patch) | |
tree | b71bd233b0a8592e1a645afad62e411b469b8bec | |
parent | b6177f0459044a7e3fb882ecda9c80e44e4d95de (diff) |
ux: suggest --fixed-strings flag
If a regex syntax error occurs, then ripgrep will suggest
using the --fixed-strings flag.
Fixes #727
-rw-r--r-- | src/args.rs | 13 | ||||
-rw-r--r-- | tests/tests.rs | 10 |
2 files changed, 21 insertions, 2 deletions
diff --git a/src/args.rs b/src/args.rs index 77cf8cc0..f0f93ccb 100644 --- a/src/args.rs +++ b/src/args.rs @@ -11,7 +11,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use clap; use encoding_rs::Encoding; use env_logger; -use grep::{Grep, GrepBuilder}; +use grep::{Grep, GrepBuilder, Error as GrepError}; use log; use num_cpus; use regex; @@ -783,7 +783,16 @@ impl<'a> ArgMatches<'a> { if let Some(limit) = self.regex_size_limit()? { gb = gb.size_limit(limit); } - gb.build().map_err(From::from) + gb.build().map_err(|err| { + match err { + GrepError::Regex(err) => { + let s = format!("{}\n(Hint: Try the --fixed-strings flag \ + to search for a literal string.)", err.to_string()); + From::from(s) + }, + err => From::from(err) + } + }) } /// Builds the set of glob overrides from the command line flags. diff --git a/tests/tests.rs b/tests/tests.rs index 152eca30..4bd852cd 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1599,6 +1599,16 @@ sherlock!(feature_419_zero_as_shortcut_for_null, "Sherlock", ".", assert_eq!(lines, "sherlock\x002\n"); }); +// See: https://github.com/BurntSushi/ripgrep/issues/709 +clean!(suggest_fixed_strings_for_invalid_regex, "foo(", ".", +|wd: WorkDir, mut cmd: Command| { + wd.assert_non_empty_stderr(&mut cmd); + + let output = cmd.output().unwrap(); + let err = String::from_utf8_lossy(&output.stderr); + assert_eq!(err.contains("--fixed-strings"), true); +}); + #[test] fn binary_nosearch() { let wd = WorkDir::new("binary_nosearch"); |