summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2016-09-26 19:21:17 -0400
committerAndrew Gallant <jamslam@gmail.com>2016-09-26 19:21:17 -0400
commit7a3fd1f23fe7a4d679fb1fb7d13884a653e5d4f5 (patch)
tree22e9bf417c21f52ba39590825b49d02b01b72855 /src
parentd30640344090fc3ffde6d58e0c5a4c928fb00990 (diff)
Add a --null flag.
This flag causes a NUL byte to follow any file path in ripgrep's output. Closes #89.
Diffstat (limited to 'src')
-rw-r--r--src/args.rs10
-rw-r--r--src/printer.rs41
2 files changed, 46 insertions, 5 deletions
diff --git a/src/args.rs b/src/args.rs
index 8af34a30..2a825e29 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -155,6 +155,12 @@ Less common options:
Don't respect version control ignore files (e.g., .gitignore).
Note that .ignore files will continue to be respected.
+ --null
+ Whenever a file name is printed, follow it with a NUL byte.
+ This includes printing filenames before matches, and when printing
+ a list of matching files such as with --count, --files-with-matches
+ and --files.
+
-p, --pretty
Alias for --color=always --heading -n.
@@ -224,6 +230,7 @@ pub struct RawArgs {
flag_no_line_number: bool,
flag_no_mmap: bool,
flag_no_filename: bool,
+ flag_null: bool,
flag_pretty: bool,
flag_quiet: bool,
flag_regexp: Vec<String>,
@@ -269,6 +276,7 @@ pub struct Args {
no_ignore: bool,
no_ignore_parent: bool,
no_ignore_vcs: bool,
+ null: bool,
quiet: bool,
replace: Option<Vec<u8>>,
text: bool,
@@ -399,6 +407,7 @@ impl RawArgs {
no_ignore_vcs:
// --no-ignore implies --no-ignore-vcs
self.flag_no_ignore_vcs || no_ignore,
+ null: self.flag_null,
quiet: self.flag_quiet,
replace: self.flag_replace.clone().map(|s| s.into_bytes()),
text: text,
@@ -553,6 +562,7 @@ impl Args {
.heading(self.heading)
.line_per_match(self.line_per_match)
.quiet(self.quiet)
+ .null(self.null)
.with_filename(self.with_filename);
if let Some(ref rep) = self.replace {
p = p.replace(rep.clone());
diff --git a/src/printer.rs b/src/printer.rs
index 0645b7e4..07c96754 100644
--- a/src/printer.rs
+++ b/src/printer.rs
@@ -33,6 +33,9 @@ pub struct Printer<W> {
line_per_match: bool,
/// Whether to suppress all output.
quiet: bool,
+ /// Whether to print NUL bytes after a file path instead of new lines
+ /// or `:`.
+ null: bool,
/// A string to use as a replacement of each match in a matching line.
replace: Option<Vec<u8>>,
/// Whether to prefix each match with the corresponding file name.
@@ -51,6 +54,7 @@ impl<W: Terminal + Send> Printer<W> {
heading: false,
line_per_match: false,
quiet: false,
+ null: false,
replace: None,
with_filename: false,
}
@@ -89,6 +93,13 @@ impl<W: Terminal + Send> Printer<W> {
self
}
+ /// Whether to cause NUL bytes to follow file paths instead of other
+ /// visual separators (like `:`, `-` and `\n`).
+ pub fn null(mut self, yes: bool) -> Printer<W> {
+ self.null = yes;
+ self
+ }
+
/// When set, all output is suppressed.
pub fn quiet(mut self, yes: bool) -> Printer<W> {
self.quiet = yes;
@@ -146,14 +157,22 @@ impl<W: Terminal + Send> Printer<W> {
pub fn path<P: AsRef<Path>>(&mut self, path: P) {
let path = strip_prefix("./", path.as_ref()).unwrap_or(path.as_ref());
self.write_path(path);
- self.write_eol();
+ if self.null {
+ self.write(b"\x00");
+ } else {
+ self.write_eol();
+ }
}
/// Prints the given path and a count of the number of matches found.
pub fn path_count<P: AsRef<Path>>(&mut self, path: P, count: u64) {
if self.with_filename {
self.write_path(path);
- self.write(b":");
+ if self.null {
+ self.write(b"\x00");
+ } else {
+ self.write(b":");
+ }
}
self.write(count.to_string().as_bytes());
self.write_eol();
@@ -214,7 +233,11 @@ impl<W: Terminal + Send> Printer<W> {
self.write_heading(path.as_ref());
} else if !self.heading && self.with_filename {
self.write_path(path.as_ref());
- self.write(b":");
+ if self.null {
+ self.write(b"\x00");
+ } else {
+ self.write(b":");
+ }
}
if let Some(line_number) = line_number {
self.line_number(line_number, b':');
@@ -264,7 +287,11 @@ impl<W: Terminal + Send> Printer<W> {
self.write_heading(path.as_ref());
} else if !self.heading && self.with_filename {
self.write_path(path.as_ref());
- self.write(b"-");
+ if self.null {
+ self.write(b"\x00");
+ } else {
+ self.write(b"-");
+ }
}
if let Some(line_number) = line_number {
self.line_number(line_number, b'-');
@@ -281,7 +308,11 @@ impl<W: Terminal + Send> Printer<W> {
let _ = self.wtr.attr(Attr::Bold);
}
self.write_path(path.as_ref());
- self.write_eol();
+ if self.null {
+ self.write(b"\x00");
+ } else {
+ self.write_eol();
+ }
if self.wtr.supports_color() {
let _ = self.wtr.reset();
}