Skip to content

Commit acfa9c0

Browse files
committed
Use homemade recursive directory copy
1 parent bbe8406 commit acfa9c0

File tree

7 files changed

+41
-32
lines changed

7 files changed

+41
-32
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ minisign-verify = "0.2.4"
110110
tar = "0.4.44"
111111
runas = "1.2.0"
112112
rusqlite = { version = "0.38.0", features = ["bundled"] }
113-
fs_extra = "1.3.0"
114113
walkdir = "2.5.0"
115114
urlencoding = "2.1.3"
116115
windows = { version = "0.62.2", features = ["Win32_Foundation", "Win32_System_Registry", "Win32_System_Com", "Win32_System_Threading", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging", "Wdk_System_SystemServices", "Win32_System_SystemInformation", "Win32_Security_Credentials"] }

crates/backend/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ tar.workspace = true
5757
runas.workspace = true
5858
directories.workspace = true
5959
rusqlite.workspace = true
60-
fs_extra.workspace = true
6160
walkdir.workspace = true
6261
url.workspace = true
6362
crc32fast.workspace = true

crates/backend/src/launcher_import/atlauncher.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -440,13 +440,11 @@ fn import_instances_from_atlauncher(backend: &BackendState, import_job: &ImportF
440440
_ = std::fs::create_dir_all(&to_import.pandora_path);
441441
let target_dot_minecraft = to_import.pandora_path.join(".minecraft");
442442

443-
let copy_options = fs_extra::dir::CopyOptions::default().copy_inside(true);
444-
_ = fs_extra::dir::copy_with_progress(to_import.folder, &target_dot_minecraft, &copy_options, |state| {
445-
tracker.set_total(state.total_bytes as usize);
446-
tracker.set_count(state.copied_bytes as usize);
443+
_ = std::fs::create_dir_all(&target_dot_minecraft);
444+
_ = crate::copy_content_recursive(&to_import.folder, &target_dot_minecraft, false, &|copied, total| {
445+
tracker.set_total(total as usize);
446+
tracker.set_count(copied as usize);
447447
tracker.notify();
448-
449-
fs_extra::dir::TransitProcessResult::ContinueOrAbort
450448
});
451449

452450
// remove old configuration, rename icon path.
@@ -464,7 +462,7 @@ fn import_instances_from_atlauncher(backend: &BackendState, import_job: &ImportF
464462
_ = std::fs::create_dir(&resourcepacks_path);
465463

466464
for mod_file in disabled_mods_folder{
467-
let Ok(entry) = mod_file else{
465+
let Ok(entry) = mod_file else {
468466
continue;
469467
};
470468

crates/backend/src/launcher_import/modrinth.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ pub fn import_instances_from_modrinth(backend: &BackendState, import_job: Import
9898

9999
// Copy .minecraft folder
100100
let target_dot_minecraft = to_import.pandora_path.join(".minecraft");
101-
let copy_options = fs_extra::dir::CopyOptions::default().copy_inside(true);
102-
_ = fs_extra::dir::copy_with_progress(to_import.minecraft_folder, target_dot_minecraft, &copy_options, |state| {
103-
tracker.set_total(state.total_bytes as usize);
104-
tracker.set_count(state.copied_bytes as usize);
101+
102+
_ = std::fs::create_dir_all(&target_dot_minecraft);
103+
_ = crate::copy_content_recursive(&to_import.minecraft_folder, &target_dot_minecraft, false, &|copied, total| {
104+
tracker.set_total(total as usize);
105+
tracker.set_count(copied as usize);
105106
tracker.notify();
106-
fs_extra::dir::TransitProcessResult::ContinueOrAbort
107107
});
108108

109109
// Copy icon

crates/backend/src/launcher_import/multimc.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -456,20 +456,19 @@ fn import_instances_from_multimc(backend: &BackendState, import_job: &ImportFrom
456456
let mmc_dot_minecraft = to_import.folder.join(".minecraft");
457457
let mmc_minecraft = to_import.folder.join("minecraft");
458458
let target_dot_minecraft = to_import.pandora_path.join(".minecraft");
459-
let copy_options = fs_extra::dir::CopyOptions::default().copy_inside(true);
460459
if mmc_minecraft.exists() {
461-
_ = fs_extra::dir::copy_with_progress(mmc_minecraft, target_dot_minecraft, &copy_options, |state| {
462-
tracker.set_total(state.total_bytes as usize);
463-
tracker.set_count(state.copied_bytes as usize);
460+
_ = std::fs::create_dir_all(&target_dot_minecraft);
461+
_ = crate::copy_content_recursive(&mmc_minecraft, &target_dot_minecraft, false, &|copied, total| {
462+
tracker.set_total(total as usize);
463+
tracker.set_count(copied as usize);
464464
tracker.notify();
465-
fs_extra::dir::TransitProcessResult::ContinueOrAbort
466465
});
467466
} else if mmc_dot_minecraft.exists() {
468-
_ = fs_extra::dir::copy_with_progress(mmc_dot_minecraft, target_dot_minecraft, &copy_options, |state| {
469-
tracker.set_total(state.total_bytes as usize);
470-
tracker.set_count(state.copied_bytes as usize);
467+
_ = std::fs::create_dir_all(&target_dot_minecraft);
468+
_ = crate::copy_content_recursive(&mmc_dot_minecraft, &target_dot_minecraft, false, &|copied, total| {
469+
tracker.set_total(total as usize);
470+
tracker.set_count(copied as usize);
471471
tracker.notify();
472-
fs_extra::dir::TransitProcessResult::ContinueOrAbort
473472
});
474473
}
475474

crates/backend/src/lib.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ impl FolderChanges {
198198
}
199199
}
200200

201-
pub fn copy_content_recursive(from: &Path, to: &Path) -> std::io::Result<()> {
201+
pub fn copy_content_recursive(from: &Path, to: &Path, strict: bool, progress: &dyn Fn(u64, u64)) -> std::io::Result<()> {
202202
let from = from.canonicalize()?;
203203
if !from.is_dir() {
204204
return Err(ErrorKind::NotADirectory.into());
@@ -262,38 +262,53 @@ pub fn copy_content_recursive(from: &Path, to: &Path) -> std::io::Result<()> {
262262
}
263263
}
264264
}
265+
(progress)(0, total_bytes);
265266

266267
for directory in directories {
267268
_ = std::fs::create_dir(to.join(directory));
268269
}
269270
let mut copied_bytes = 0;
270271
for (relative, copy_from) in files {
271272
let dest = to.join(relative);
272-
copied_bytes += std::fs::copy(copy_from, dest)?;
273+
match std::fs::copy(copy_from, dest) {
274+
Ok(bytes) => copied_bytes += bytes,
275+
Err(err) => if strict {
276+
return Err(err);
277+
},
278+
}
279+
(progress)(copied_bytes, total_bytes);
273280
}
274-
if copied_bytes != total_bytes {
281+
if strict && copied_bytes != total_bytes {
275282
return Err(Error::new(ErrorKind::Other,
276283
format!("Expected copy size did not match. Expected to copy {total_bytes} bytes, copied {copied_bytes} instead")));
277284
}
278285
for (relative, internal) in internal_symlinks {
279286
let dest = to.join(relative);
280287
let target = to.join(internal);
281-
symlink_dir_or_file(&target, &dest)?;
288+
if let Err(err) = symlink_dir_or_file(&target, &dest) && strict {
289+
return Err(err);
290+
}
282291
}
283292
for (relative, target) in external_symlinks {
284293
let dest = to.join(relative);
285-
symlink_dir_or_file(&target, &dest)?;
294+
if let Err(err) = symlink_dir_or_file(&target, &dest) && strict {
295+
return Err(err);
296+
}
286297
}
287298
#[cfg(windows)]
288299
for (relative, internal) in internal_junctions {
289300
let dest = to.join(relative);
290301
let target = to.join(internal);
291-
junction::create(&target, &dest)?;
302+
if let Err(err) = junction::create(&target, &dest) && strict {
303+
return Err(err);
304+
}
292305
}
293306
#[cfg(windows)]
294307
for (relative, target) in external_junctions {
295308
let dest = to.join(relative);
296-
junction::create(&target, &dest)?;
309+
if let Err(err) = junction::create(&target, &dest) && strict {
310+
return Err(err);
311+
}
297312
}
298313
Ok(())
299314
}
@@ -335,7 +350,7 @@ pub fn rename_with_fallback_across_devices(from: &Path, to: &Path) -> std::io::R
335350
_ = std::fs::remove_file(from);
336351
} else if from.is_dir() {
337352
std::fs::create_dir(to)?;
338-
if let Err(err) = copy_content_recursive(from, to) {
353+
if let Err(err) = copy_content_recursive(from, to, true, &|_, _| {}) {
339354
_ = std::fs::remove_dir_all(to);
340355
return Err(err);
341356
} else {

0 commit comments

Comments
 (0)