Skip to content

Commit 7c51fa6

Browse files
committed
fix: Prevent recursive copy
1 parent 16f05f7 commit 7c51fa6

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ keywords = ["copy", "recursive", "filesystem", "file"]
1414
default = ["jwalk"]
1515

1616
[dependencies]
17-
walkdir = "2.3"
17+
walkdir = "2.4"
1818
log = "0.4"
1919
# rayon = "1.4.0"
2020
jwalk = { version = "0.8", optional = true }
2121

2222
[dev-dependencies]
2323
unzip = "0.1"
2424
reqwest = { version = "0.11", features = ["blocking"] }
25-
env_logger = "0.10"
25+
env_logger = "0.11"
2626
criterion = "0.5"
2727

2828
[[bench]]

src/lib.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,11 @@ impl CopyBuilder {
245245
abs_dest.display()
246246
);
247247

248-
'files: for entry in WalkDir::new(&abs_source).into_iter().filter_map(|e| e.ok()) {
248+
'files: for entry in WalkDir::new(&abs_source)
249+
.into_iter()
250+
.filter_entry(|e| e.path() != abs_dest)
251+
.filter_map(|e| e.ok())
252+
{
249253
let rel_dest = entry.path().strip_prefix(&abs_source).map_err(|e| {
250254
Error::new(ErrorKind::Other, format!("Could not strip prefix: {:?}", e))
251255
})?;

src/tests.rs

+20
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,26 @@ fn copy_basic() {
4747
std::fs::remove_dir_all("dest").unwrap();
4848
}
4949

50+
51+
#[test]
52+
fn copy_subdir() {
53+
std::env::set_var("RUST_LOG", "debug");
54+
let _ = env_logger::try_init();
55+
create_dir_all("source/subdir").unwrap();
56+
create_dir_all("source/this_should_copy").unwrap();
57+
File::create("source/this_should_copy/file.doc").unwrap();
58+
File::create("source/a.jpg").unwrap();
59+
File::create("source/b.jpg").unwrap();
60+
File::create("source/d.txt").unwrap();
61+
62+
CopyBuilder::new("source", "source/subdir")
63+
.run()
64+
.unwrap();
65+
66+
// std::fs::remove_dir_all("source").unwrap();
67+
}
68+
69+
5070
#[test]
5171
fn copy_exclude() {
5272
std::env::set_var("RUST_LOG", "DEBUG");

0 commit comments

Comments
 (0)