summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Proskuryakov <humbug@deeptown.org>2017-04-20 18:02:52 +0300
committerAndrew Gallant <jamslam@gmail.com>2017-04-21 08:11:55 -0400
commit362abed44a000da3b31e5dd027e16eb4e36e1bed (patch)
treea8eaa8082c2c3c59cdaa330d287e13b75de102ac
parentc50b8b4125dc7f1181944dd92d0aca97c2450421 (diff)
Fix reiteration of the first found match with --only-mathing flag
Fixes #451
-rw-r--r--src/printer.rs27
-rw-r--r--tests/tests.rs45
2 files changed, 54 insertions, 18 deletions
diff --git a/src/printer.rs b/src/printer.rs
index 48492fe8..5aaf1475 100644
--- a/src/printer.rs
+++ b/src/printer.rs
@@ -242,23 +242,13 @@ impl<W: WriteColor> Printer<W> {
line_number: Option<u64>,
) {
if !self.line_per_match && !self.only_matching {
- let column =
- if self.column {
- Some(re.find(&buf[start..end])
- .map(|m| m.start()).unwrap_or(0) as u64)
- } else {
- None
- };
+ let column = re.find(&buf[start..end])
+ .map(|m| m.start()).unwrap_or(0);
return self.write_match(
re, path, buf, start, end, line_number, column);
}
for m in re.find_iter(&buf[start..end]) {
- let column =
- if self.column {
- Some(m.start() as u64)
- } else {
- None
- };
+ let column = m.start();
self.write_match(
re, path.as_ref(), buf, start, end, line_number, column);
}
@@ -272,7 +262,7 @@ impl<W: WriteColor> Printer<W> {
start: usize,
end: usize,
line_number: Option<u64>,
- column: Option<u64>,
+ column: usize,
) {
if self.heading && self.with_filename && !self.has_printed {
self.write_file_sep();
@@ -285,8 +275,8 @@ impl<W: WriteColor> Printer<W> {
if let Some(line_number) = line_number {
self.line_number(line_number, b':');
}
- if let Some(c) = column {
- self.column_number(c + 1, b':');
+ if self.column {
+ self.column_number(column as u64 + 1, b':');
}
if self.replace.is_some() {
let mut count = 0;
@@ -308,8 +298,9 @@ impl<W: WriteColor> Printer<W> {
}
} else {
let line_buf = if self.only_matching {
- let m = re.find(&buf[start..end]).unwrap();
- &buf[start + m.start()..start + m.end()]
+ let start_offset = start + column;
+ let m = re.find(&buf[start_offset..end]).unwrap();
+ &buf[start_offset + m.start()..start_offset + m.end()]
} else {
&buf[start..end]
};
diff --git a/tests/tests.rs b/tests/tests.rs
index 38812c4e..95c6e6a5 100644
--- a/tests/tests.rs
+++ b/tests/tests.rs
@@ -1607,6 +1607,51 @@ fn regression_391() {
assert_eq!(lines, "bar.py\n");
}
+// See: https://github.com/BurntSushi/ripgrep/issues/451
+#[test]
+fn regression_451_only_matching_as_in_issue() {
+ let wd = WorkDir::new("regression_451_only_matching");
+ let path = "digits.txt";
+ wd.create(path, "1 2 3\n");
+
+ let mut cmd = wd.command();
+ cmd.arg("[0-9]+").arg(path).arg("--only-matching");
+ let lines: String = wd.stdout(&mut cmd);
+
+ let expected = "\
+1
+2
+3
+";
+
+ assert_eq!(lines, expected);
+}
+
+// See: https://github.com/BurntSushi/ripgrep/issues/451
+#[test]
+fn regression_451_only_matching() {
+ let wd = WorkDir::new("regression_451_only_matching");
+ let path = "digits.txt";
+ wd.create(path, "1 2 3\n123\n");
+
+ let mut cmd = wd.command();
+ cmd.arg("[0-9]").arg(path)
+ .arg("--only-matching")
+ .arg("--column");
+ let lines: String = wd.stdout(&mut cmd);
+
+ let expected = "\
+1:1:1
+1:3:2
+1:5:3
+2:1:1
+2:2:2
+2:3:3
+";
+
+ assert_eq!(lines, expected);
+}
+
#[test]
fn type_list() {
let wd = WorkDir::new("type_list");