mirror of
https://github.com/BurntSushi/walkdir.git
synced 2025-09-28 14:10:31 +00:00
bug: fix use of skip_current_dir
The method sometimes destroyed an internal invariant by not decreasing `oldest_opened`. That then leads to panics in `push`. We fix this by calling the canonical `pop` function, which is what should have happened from the beginning. This includes a regression test that fails without this fix. Fixes #118, Closes #124
This commit is contained in:
parent
e09ce1cc51
commit
7e0754a898
@ -724,10 +724,7 @@ impl IntoIter {
|
|||||||
/// [`filter_entry`]: #method.filter_entry
|
/// [`filter_entry`]: #method.filter_entry
|
||||||
pub fn skip_current_dir(&mut self) {
|
pub fn skip_current_dir(&mut self) {
|
||||||
if !self.stack_list.is_empty() {
|
if !self.stack_list.is_empty() {
|
||||||
self.stack_list.pop();
|
self.pop();
|
||||||
}
|
|
||||||
if !self.stack_path.is_empty() {
|
|
||||||
self.stack_path.pop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -990,3 +990,23 @@ fn same_file_system() {
|
|||||||
];
|
];
|
||||||
assert_eq!(expected, r.sorted_paths());
|
assert_eq!(expected, r.sorted_paths());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests that skip_current_dir doesn't destroy internal invariants.
|
||||||
|
//
|
||||||
|
// See: https://github.com/BurntSushi/walkdir/issues/118
|
||||||
|
#[test]
|
||||||
|
fn regression_skip_current_dir() {
|
||||||
|
let dir = Dir::tmp();
|
||||||
|
dir.mkdirp("foo/a/b");
|
||||||
|
dir.mkdirp("foo/1/2");
|
||||||
|
|
||||||
|
let mut wd = WalkDir::new(dir.path()).max_open(1).into_iter();
|
||||||
|
wd.next();
|
||||||
|
wd.next();
|
||||||
|
wd.next();
|
||||||
|
wd.next();
|
||||||
|
|
||||||
|
wd.skip_current_dir();
|
||||||
|
wd.skip_current_dir();
|
||||||
|
wd.next();
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user