summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2021-05-29 07:34:14 -0400
committerAndrew Gallant <jamslam@gmail.com>2021-05-29 07:37:28 -0400
commit581a35e568c3acd32461d276a4cfe746524e17cd (patch)
treeef3de275dfeb8a0f93db684157d03dadcd6c5386 /tests
parentba965962fe2fc3513aeeaa99665f09099d92045d (diff)
impl: fix --multiline anchored match bug
This fixes a bug where using \A or (?-m)^ in combination with -U/--multiline would permit matches that aren't anchored to the beginning of the file. The underlying cause was an optimization that occurred when mmaps couldn't be used. Namely, ripgrep tries to still read the input incrementally if it knows the pattern can't match through a new line. But the detection logic was flawed, since it didn't account for line anchors. This commit fixes that. Fixes #1878, Fixes #1879
Diffstat (limited to 'tests')
-rw-r--r--tests/regression.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/tests/regression.rs b/tests/regression.rs
index 2935a43e..9aba2746 100644
--- a/tests/regression.rs
+++ b/tests/regression.rs
@@ -882,3 +882,26 @@ test:3:5:foo quux
";
eqnice!(expected, cmd.stdout());
});
+
+rgtest!(r1878, |dir: Dir, _: TestCommand| {
+ dir.create("test", "a\nbaz\nabc\n");
+
+ // Since ripgrep enables (?m) by default, '^' will match at the beginning
+ // of a line, even when -U/--multiline is used.
+ let args = &["-U", "--no-mmap", r"^baz", "test"];
+ eqnice!("baz\n", dir.command().args(args).stdout());
+ let args = &["-U", "--mmap", r"^baz", "test"];
+ eqnice!("baz\n", dir.command().args(args).stdout());
+
+ // But when (?-m) is disabled, or when \A is used, then there should be no
+ // matches that aren't anchored to the beginning of the file.
+ let args = &["-U", "--no-mmap", r"(?-m)^baz", "test"];
+ dir.command().args(args).assert_err();
+ let args = &["-U", "--mmap", r"(?-m)^baz", "test"];
+ dir.command().args(args).assert_err();
+
+ let args = &["-U", "--no-mmap", r"\Abaz", "test"];
+ dir.command().args(args).assert_err();
+ let args = &["-U", "--mmap", r"\Abaz", "test"];
+ dir.command().args(args).assert_err();
+});