cli: fix bug where last byte was stripped

In an effort to strip line terminators, we assumed their existence. But
a pattern file may not end with a line terminator, so we shouldn't
unconditionally strip them.

We fix this by moving to bstr's line handling, which does this for us
automatically.
This commit is contained in:
Andrew Gallant 2019-04-19 07:10:24 -04:00
parent a6222939f9
commit e7829c05d3
No known key found for this signature in database
GPG Key ID: B2E3A4923F8B0D44
3 changed files with 33 additions and 16 deletions

View File

@ -1,3 +1,13 @@
TBD
===
TODO.
Bug fixes:
* [BUG #1259](https://github.com/BurntSushi/ripgrep/issues/1259):
Fix bug where the last byte of a `-f file` was stripped if it wasn't a `\n`.
11.0.1 (2019-04-16) 11.0.1 (2019-04-16)
=================== ===================
ripgrep 11.0.1 is a new patch release that fixes a search regression introduced ripgrep 11.0.1 is a new patch release that fixes a search regression introduced

View File

@ -2,10 +2,12 @@ use std::error;
use std::ffi::OsStr; use std::ffi::OsStr;
use std::fmt; use std::fmt;
use std::fs::File; use std::fs::File;
use std::io::{self, BufRead}; use std::io;
use std::path::Path; use std::path::Path;
use std::str; use std::str;
use bstr::io::BufReadExt;
use escape::{escape, escape_os}; use escape::{escape, escape_os};
/// An error that occurs when a pattern could not be converted to valid UTF-8. /// An error that occurs when a pattern could not be converted to valid UTF-8.
@ -156,28 +158,22 @@ pub fn patterns_from_stdin() -> io::Result<Vec<String>> {
/// ``` /// ```
pub fn patterns_from_reader<R: io::Read>(rdr: R) -> io::Result<Vec<String>> { pub fn patterns_from_reader<R: io::Read>(rdr: R) -> io::Result<Vec<String>> {
let mut patterns = vec![]; let mut patterns = vec![];
let mut bufrdr = io::BufReader::new(rdr);
let mut line = vec![];
let mut line_number = 0; let mut line_number = 0;
while { io::BufReader::new(rdr).for_byte_line(|line| {
line.clear();
line_number += 1; line_number += 1;
bufrdr.read_until(b'\n', &mut line)? > 0 match pattern_from_bytes(line.as_bytes()) {
} { Ok(pattern) => {
line.pop().unwrap(); // remove trailing '\n' patterns.push(pattern.to_string());
if line.last() == Some(&b'\r') { Ok(true)
line.pop().unwrap(); }
}
match pattern_from_bytes(&line) {
Ok(pattern) => patterns.push(pattern.to_string()),
Err(err) => { Err(err) => {
return Err(io::Error::new( Err(io::Error::new(
io::ErrorKind::Other, io::ErrorKind::Other,
format!("{}: {}", line_number, err), format!("{}: {}", line_number, err),
)); ))
} }
} }
} })?;
Ok(patterns) Ok(patterns)
} }

View File

@ -705,3 +705,14 @@ rgtest!(r1203_reverse_suffix_literal, |dir: Dir, _: TestCommand| {
let mut cmd = dir.command(); let mut cmd = dir.command();
eqnice!("153.230000\n", cmd.arg(r"\d\d\d000").arg("test").stdout()); eqnice!("153.230000\n", cmd.arg(r"\d\d\d000").arg("test").stdout());
}); });
// See: https://github.com/BurntSushi/ripgrep/issues/1259
rgtest!(r1259_drop_last_byte_nonl, |dir: Dir, mut cmd: TestCommand| {
dir.create("patterns-nonl", "[foo]");
dir.create("patterns-nl", "[foo]\n");
dir.create("test", "fz");
eqnice!("fz\n", cmd.arg("-f").arg("patterns-nonl").arg("test").stdout());
cmd = dir.command();
eqnice!("fz\n", cmd.arg("-f").arg("patterns-nl").arg("test").stdout());
});