add a max-depth option for directory traversal

CR and add integration test
This commit is contained in:
Garrett Squire 2016-09-26 20:56:15 -07:00
parent 3e892a7a80
commit babe80d498
3 changed files with 30 additions and 1 deletions

View File

@ -136,6 +136,10 @@ the raw speed of grep.
-L, --follow -L, --follow
: Follow symlinks. : Follow symlinks.
--maxdepth *NUM*
: Descend at most NUM directories below the command line arguments.
A value of zero searches only the starting-points themselves.
--mmap --mmap
: Search using memory maps when possible. This is enabled by default : Search using memory maps when possible. This is enabled by default
when ripgrep thinks it will be faster. (Note that mmap searching when ripgrep thinks it will be faster. (Note that mmap searching

View File

@ -136,6 +136,10 @@ Less common options:
-L, --follow -L, --follow
Follow symlinks. Follow symlinks.
--maxdepth NUM
Descend at most NUM directories below the command line arguments.
A value of zero only searches the starting-points themselves.
--mmap --mmap
Search using memory maps when possible. This is enabled by default Search using memory maps when possible. This is enabled by default
when ripgrep thinks it will be faster. (Note that mmap searching when ripgrep thinks it will be faster. (Note that mmap searching
@ -222,6 +226,7 @@ pub struct RawArgs {
flag_invert_match: bool, flag_invert_match: bool,
flag_line_number: bool, flag_line_number: bool,
flag_fixed_strings: bool, flag_fixed_strings: bool,
flag_maxdepth: Option<usize>,
flag_mmap: bool, flag_mmap: bool,
flag_no_heading: bool, flag_no_heading: bool,
flag_no_ignore: bool, flag_no_ignore: bool,
@ -272,6 +277,7 @@ pub struct Args {
invert_match: bool, invert_match: bool,
line_number: bool, line_number: bool,
line_per_match: bool, line_per_match: bool,
maxdepth: Option<usize>,
mmap: bool, mmap: bool,
no_ignore: bool, no_ignore: bool,
no_ignore_parent: bool, no_ignore_parent: bool,
@ -399,6 +405,7 @@ impl RawArgs {
invert_match: self.flag_invert_match, invert_match: self.flag_invert_match,
line_number: !self.flag_no_line_number && self.flag_line_number, line_number: !self.flag_no_line_number && self.flag_line_number,
line_per_match: self.flag_vimgrep, line_per_match: self.flag_vimgrep,
maxdepth: self.flag_maxdepth,
mmap: mmap, mmap: mmap,
no_ignore: no_ignore, no_ignore: no_ignore,
no_ignore_parent: no_ignore_parent:
@ -681,7 +688,10 @@ impl Args {
/// Create a new recursive directory iterator at the path given. /// Create a new recursive directory iterator at the path given.
pub fn walker(&self, path: &Path) -> Result<walk::Iter> { pub fn walker(&self, path: &Path) -> Result<walk::Iter> {
let wd = WalkDir::new(path).follow_links(self.follow); let mut wd = WalkDir::new(path).follow_links(self.follow);
if let Some(maxdepth) = self.maxdepth {
wd = wd.max_depth(maxdepth);
}
let mut ig = Ignore::new(); let mut ig = Ignore::new();
// Only register ignore rules if this is a directory. If it's a file, // Only register ignore rules if this is a directory. If it's a file,
// then it was explicitly given by the end user, so we always search // then it was explicitly given by the end user, so we always search

View File

@ -831,6 +831,21 @@ sherlock\x00can extract a clew from a wisp of straw or a flake of cigar ash;
assert_eq!(lines, expected); assert_eq!(lines, expected);
}); });
// See: https://github.com/BurntSushi/ripgrep/issues/109
clean!(max_depth, "far", ".", |wd: WorkDir, mut cmd: Command| {
wd.create_dir("one");
wd.create("one/pass", "far");
wd.create_dir("one/too");
wd.create("one/too/many", "far");
cmd.arg("--maxdepth").arg("2");
let lines: String = wd.stdout(&mut cmd);
let expected = path("one/pass:far\n");
assert_eq!(lines, expected);
});
#[test] #[test]
fn binary_nosearch() { fn binary_nosearch() {
let wd = WorkDir::new("binary_nosearch"); let wd = WorkDir::new("binary_nosearch");