diff options
author | Lukas Kalbertodt <lukas.kalbertodt@gmail.com> | 2019-07-20 19:49:34 +0300 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2019-07-20 20:37:00 +0300 |
commit | 7e0754a8985eb7c54655e8fa2936081a6608f736 (patch) | |
tree | af3f2d406c24a507215077a0d7480ff8c2fb647a | |
parent | e09ce1cc517b4e82e3c6a53f46c9f79368322fc9 (diff) |
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
-rw-r--r-- | src/lib.rs | 5 | ||||
-rw-r--r-- | src/tests/recursive.rs | 20 |
2 files changed, 21 insertions, 4 deletions
@@ -724,10 +724,7 @@ impl IntoIter { /// [`filter_entry`]: #method.filter_entry pub fn skip_current_dir(&mut self) { if !self.stack_list.is_empty() { - self.stack_list.pop(); - } - if !self.stack_path.is_empty() { - self.stack_path.pop(); + self.pop(); } } diff --git a/src/tests/recursive.rs b/src/tests/recursive.rs index 27d1590..7d3435c 100644 --- a/src/tests/recursive.rs +++ b/src/tests/recursive.rs @@ -990,3 +990,23 @@ fn same_file_system() { ]; 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(); +} |