mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-06-09 14:07:45 +02:00
parent
7a3fd1f23f
commit
3e78fce3a3
25
src/main.rs
25
src/main.rs
@ -22,7 +22,7 @@ extern crate winapi;
|
|||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{self, Write};
|
use std::io;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::result;
|
use std::result;
|
||||||
@ -157,31 +157,28 @@ fn run_one_thread(args: Arc<Args>) -> Result<u64> {
|
|||||||
match_count: 0,
|
match_count: 0,
|
||||||
};
|
};
|
||||||
let paths = args.paths();
|
let paths = args.paths();
|
||||||
let filesep = args.file_separator();
|
|
||||||
let mut term = args.stdout();
|
let mut term = args.stdout();
|
||||||
|
|
||||||
let mut paths_searched: u64 = 0;
|
let mut paths_searched: u64 = 0;
|
||||||
for p in paths {
|
for p in paths {
|
||||||
if p == Path::new("-") {
|
if p == Path::new("-") {
|
||||||
if worker.match_count > 0 {
|
|
||||||
if let Some(ref sep) = filesep {
|
|
||||||
let _ = term.write_all(sep);
|
|
||||||
let _ = term.write_all(b"\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
paths_searched += 1;
|
paths_searched += 1;
|
||||||
let mut printer = args.printer(&mut term);
|
let mut printer = args.printer(&mut term);
|
||||||
|
if worker.match_count > 0 {
|
||||||
|
if let Some(sep) = args.file_separator() {
|
||||||
|
printer = printer.file_separator(sep);
|
||||||
|
}
|
||||||
|
}
|
||||||
worker.do_work(&mut printer, WorkReady::Stdin);
|
worker.do_work(&mut printer, WorkReady::Stdin);
|
||||||
} else {
|
} else {
|
||||||
for ent in try!(args.walker(p)) {
|
for ent in try!(args.walker(p)) {
|
||||||
if worker.match_count > 0 {
|
|
||||||
if let Some(ref sep) = filesep {
|
|
||||||
let _ = term.write_all(sep);
|
|
||||||
let _ = term.write_all(b"\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
paths_searched += 1;
|
paths_searched += 1;
|
||||||
let mut printer = args.printer(&mut term);
|
let mut printer = args.printer(&mut term);
|
||||||
|
if worker.match_count > 0 {
|
||||||
|
if let Some(sep) = args.file_separator() {
|
||||||
|
printer = printer.file_separator(sep);
|
||||||
|
}
|
||||||
|
}
|
||||||
let file = match File::open(ent.path()) {
|
let file = match File::open(ent.path()) {
|
||||||
Ok(file) => file,
|
Ok(file) => file,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -48,8 +48,6 @@ impl Out {
|
|||||||
|
|
||||||
/// If set, the separator is printed between matches from different files.
|
/// If set, the separator is printed between matches from different files.
|
||||||
/// By default, no separator is printed.
|
/// By default, no separator is printed.
|
||||||
///
|
|
||||||
/// If sep is empty, then no file separator is printed.
|
|
||||||
pub fn file_separator(mut self, sep: Vec<u8>) -> Out {
|
pub fn file_separator(mut self, sep: Vec<u8>) -> Out {
|
||||||
self.file_separator = Some(sep);
|
self.file_separator = Some(sep);
|
||||||
self
|
self
|
||||||
|
@ -25,6 +25,8 @@ pub struct Printer<W> {
|
|||||||
/// printed via the match directly, but occasionally we need to insert them
|
/// printed via the match directly, but occasionally we need to insert them
|
||||||
/// ourselves (for example, to print a context separator).
|
/// ourselves (for example, to print a context separator).
|
||||||
eol: u8,
|
eol: u8,
|
||||||
|
/// A file separator to show before any matches are printed.
|
||||||
|
file_separator: Option<Vec<u8>>,
|
||||||
/// Whether to show file name as a heading or not.
|
/// Whether to show file name as a heading or not.
|
||||||
///
|
///
|
||||||
/// N.B. If with_filename is false, then this setting has no effect.
|
/// N.B. If with_filename is false, then this setting has no effect.
|
||||||
@ -51,6 +53,7 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
column: false,
|
column: false,
|
||||||
context_separator: "--".to_string().into_bytes(),
|
context_separator: "--".to_string().into_bytes(),
|
||||||
eol: b'\n',
|
eol: b'\n',
|
||||||
|
file_separator: None,
|
||||||
heading: false,
|
heading: false,
|
||||||
line_per_match: false,
|
line_per_match: false,
|
||||||
quiet: false,
|
quiet: false,
|
||||||
@ -79,6 +82,13 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If set, the separator is printed before any matches. By default, no
|
||||||
|
/// separator is printed.
|
||||||
|
pub fn file_separator(mut self, sep: Vec<u8>) -> Printer<W> {
|
||||||
|
self.file_separator = Some(sep);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Whether to show file name as a heading or not.
|
/// Whether to show file name as a heading or not.
|
||||||
///
|
///
|
||||||
/// N.B. If with_filename is false, then this setting has no effect.
|
/// N.B. If with_filename is false, then this setting has no effect.
|
||||||
@ -230,6 +240,7 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
column: Option<u64>,
|
column: Option<u64>,
|
||||||
) {
|
) {
|
||||||
if self.heading && self.with_filename && !self.has_printed {
|
if self.heading && self.with_filename && !self.has_printed {
|
||||||
|
self.write_file_sep();
|
||||||
self.write_heading(path.as_ref());
|
self.write_heading(path.as_ref());
|
||||||
} else if !self.heading && self.with_filename {
|
} else if !self.heading && self.with_filename {
|
||||||
self.write_path(path.as_ref());
|
self.write_path(path.as_ref());
|
||||||
@ -284,6 +295,7 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
line_number: Option<u64>,
|
line_number: Option<u64>,
|
||||||
) {
|
) {
|
||||||
if self.heading && self.with_filename && !self.has_printed {
|
if self.heading && self.with_filename && !self.has_printed {
|
||||||
|
self.write_file_sep();
|
||||||
self.write_heading(path.as_ref());
|
self.write_heading(path.as_ref());
|
||||||
} else if !self.heading && self.with_filename {
|
} else if !self.heading && self.with_filename {
|
||||||
self.write_path(path.as_ref());
|
self.write_path(path.as_ref());
|
||||||
@ -355,4 +367,15 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
let eol = self.eol;
|
let eol = self.eol;
|
||||||
self.write(&[eol]);
|
self.write(&[eol]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn write_file_sep(&mut self) {
|
||||||
|
if self.quiet {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if let Some(ref sep) = self.file_separator {
|
||||||
|
self.has_printed = true;
|
||||||
|
let _ = self.wtr.write_all(sep);
|
||||||
|
let _ = self.wtr.write_all(b"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,13 @@ fn path(unix: &str) -> String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn sort_lines(lines: &str) -> String {
|
||||||
|
let mut lines: Vec<String> =
|
||||||
|
lines.trim().lines().map(|s| s.to_owned()).collect();
|
||||||
|
lines.sort();
|
||||||
|
format!("{}\n", lines.join("\n"))
|
||||||
|
}
|
||||||
|
|
||||||
sherlock!(single_file, |wd: WorkDir, mut cmd| {
|
sherlock!(single_file, |wd: WorkDir, mut cmd| {
|
||||||
let lines: String = wd.stdout(&mut cmd);
|
let lines: String = wd.stdout(&mut cmd);
|
||||||
let expected = "\
|
let expected = "\
|
||||||
@ -716,6 +723,18 @@ clean!(regression_93, r"(\d{1,3}\.){3}\d{1,3}", ".",
|
|||||||
assert_eq!(lines, "foo:192.168.1.1\n");
|
assert_eq!(lines, "foo:192.168.1.1\n");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// See: https://github.com/BurntSushi/ripgrep/issues/99
|
||||||
|
clean!(regression_99, "test", ".",
|
||||||
|
|wd: WorkDir, mut cmd: Command| {
|
||||||
|
wd.create("foo1", "test");
|
||||||
|
wd.create("foo2", "zzz");
|
||||||
|
wd.create("bar", "test");
|
||||||
|
cmd.arg("-j1").arg("--heading");
|
||||||
|
|
||||||
|
let lines: String = wd.stdout(&mut cmd);
|
||||||
|
assert_eq!(sort_lines(&lines), sort_lines("bar\ntest\n\nfoo1\ntest\n"));
|
||||||
|
});
|
||||||
|
|
||||||
// See: https://github.com/BurntSushi/ripgrep/issues/105
|
// See: https://github.com/BurntSushi/ripgrep/issues/105
|
||||||
clean!(regression_105_part1, "test", ".", |wd: WorkDir, mut cmd: Command| {
|
clean!(regression_105_part1, "test", ".", |wd: WorkDir, mut cmd: Command| {
|
||||||
wd.create("foo", "zztest");
|
wd.create("foo", "zztest");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user