+
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/find/matchers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ pub fn build_top_level_matcher(
if !top_level_matcher.has_side_effects() {
let mut new_and_matcher = logical_matchers::AndMatcherBuilder::new();
new_and_matcher.new_and_condition(top_level_matcher);
new_and_matcher.new_and_condition(printer::Printer::new_box());
new_and_matcher
.new_and_condition(printer::Printer::new_box(printer::PrintDelimiter::Newline));
return Ok(new_and_matcher.build());
}
Ok(top_level_matcher)
Expand Down Expand Up @@ -206,7 +207,8 @@ fn build_matcher_tree(
let mut invert_next_matcher = false;
while i < args.len() {
let possible_submatcher = match args[i] {
"-print" => Some(printer::Printer::new_box()),
"-print" => Some(printer::Printer::new_box(printer::PrintDelimiter::Newline)),
"-print0" => Some(printer::Printer::new_box(printer::PrintDelimiter::Null)),
"-printf" => {
if i >= args.len() - 1 {
return Err(From::from(format!("missing argument to {}", args[i])));
Expand Down
54 changes: 43 additions & 11 deletions src/find/matchers/printer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,46 @@ use walkdir::DirEntry;

use super::{Matcher, MatcherIO};

pub enum PrintDelimiter {
Newline,
Null,
}

impl std::fmt::Display for PrintDelimiter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PrintDelimiter::Newline => writeln!(f),
PrintDelimiter::Null => write!(f, "\0"),
}
}
}

/// This matcher just prints the name of the file to stdout.
pub struct Printer;
pub struct Printer {
delimiter: PrintDelimiter,
}

impl Printer {
pub fn new() -> Printer {
Printer {}
pub fn new(delimiter: PrintDelimiter) -> Printer {
Printer { delimiter }
}

pub fn new_box() -> Box<dyn Matcher> {
Box::new(Printer::new())
pub fn new_box(delimiter: PrintDelimiter) -> Box<dyn Matcher> {
Box::new(Printer::new(delimiter))
}
}

impl Matcher for Printer {
fn matches(&self, file_info: &DirEntry, matcher_io: &mut MatcherIO) -> bool {
writeln!(
matcher_io.deps.get_output().borrow_mut(),
"{}",
file_info.path().to_string_lossy()
let mut out = matcher_io.deps.get_output().borrow_mut();
write!(
out,
"{}{}",
file_info.path().to_string_lossy(),
self.delimiter
)
.unwrap();
out.flush().unwrap();
true
}

Expand All @@ -47,15 +66,28 @@ mod tests {
use crate::find::tests::FakeDependencies;

#[test]
fn prints() {
fn prints_newline() {
let abbbc = get_dir_entry_for("./test_data/simple", "abbbc");

let matcher = Printer::new();
let matcher = Printer::new(PrintDelimiter::Newline);
let deps = FakeDependencies::new();
assert!(matcher.matches(&abbbc, &mut deps.new_matcher_io()));
assert_eq!(
fix_up_slashes("./test_data/simple/abbbc\n"),
deps.get_output_as_string()
);
}

#[test]
fn prints_null() {
let abbbc = get_dir_entry_for("./test_data/simple", "abbbc");

let matcher = Printer::new(PrintDelimiter::Null);
let deps = FakeDependencies::new();
assert!(matcher.matches(&abbbc, &mut deps.new_matcher_io()));
assert_eq!(
fix_up_slashes("./test_data/simple/abbbc\0"),
deps.get_output_as_string()
);
}
}
1 change: 1 addition & 0 deletions src/find/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ If no path is supplied then the current working directory is used by default.

Early alpha implementation. Currently the only expressions supported are
-print
-print0
-printf
-name case-sensitive_filename_pattern
-iname case-insensitive_filename_pattern
Expand Down
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载