diff --git a/data/modfolder_ignore_existing.7z b/data/modfolder_ignore_existing.7z new file mode 100644 index 0000000..fc912d0 Binary files /dev/null and b/data/modfolder_ignore_existing.7z differ diff --git a/include/btu/modmanager/mod_folder.hpp b/include/btu/modmanager/mod_folder.hpp index 88c8166..ffd7c2d 100644 --- a/include/btu/modmanager/mod_folder.hpp +++ b/include/btu/modmanager/mod_folder.hpp @@ -82,7 +82,7 @@ class ModFolder using enum ModFolderIteratorBase::ArchiveTooLargeAction; using enum ModFolderIteratorBase::ArchiveTooLargeState; - explicit ModFolder(Path directory, bsa::Settings bsa_settings); + explicit ModFolder(Path directory, bsa::Settings bsa_settings, bool ignore_existing_archives = false); /// Get the size of the folder, including files in archives. /// Utility function, equivalent to iterate() and counting the files. @@ -102,6 +102,7 @@ class ModFolder private: Path dir_; bsa::Settings bsa_settings_; + bool ignore_existing_archives_; common::ThreadPool thread_pool_; }; } // namespace btu::modmanager diff --git a/src/modmanager/mod_folder.cpp b/src/modmanager/mod_folder.cpp index bb831ad..3a1b0fa 100644 --- a/src/modmanager/mod_folder.cpp +++ b/src/modmanager/mod_folder.cpp @@ -16,9 +16,10 @@ namespace btu::modmanager { -ModFolder::ModFolder(Path directory, bsa::Settings bsa_settings) +ModFolder::ModFolder(Path directory, bsa::Settings bsa_settings, bool ignore_existing_archives) : dir_(std::move(directory)) , bsa_settings_(BTU_MOV(bsa_settings)) + , ignore_existing_archives_(ignore_existing_archives) , thread_pool_(common::make_thread_pool()) { } @@ -274,6 +275,9 @@ void ModFolder::transform(ModFolderTransformer &transformer) noexcept if (transformer.stop_requested()) return; + if (is_arch(file_path) && ignore_existing_archives_) + continue; + futs.push_back(thread_pool_.submit_task([this, &file_path, &is_arch, &transformer] { if (is_arch(file_path)) [[unlikely]] transform_archive_file(file_path, transformer, bsa_settings_, thread_pool_); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fa8ae79..a55fb11 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -67,6 +67,7 @@ acquire_test("decompress") acquire_test("esp") acquire_test("make_transparent_alpha") acquire_test("modfolder_transform") +acquire_test("modfolder_ignore_existing") acquire_test("optimize") acquire_test("nif_optimize") acquire_test("resize") diff --git a/tests/modmanager/mod_folder.cpp b/tests/modmanager/mod_folder.cpp index 4048a0f..0218065 100644 --- a/tests/modmanager/mod_folder.cpp +++ b/tests/modmanager/mod_folder.cpp @@ -85,6 +85,21 @@ TEST_CASE("ModFolder transform", "[src]") CHECK(btu::common::compare_directories(dir / "output", dir / "expected")); } +TEST_CASE("ModFolder ignore existing", "[src]") +{ + const Path dir = "modfolder_ignore_existing"; + // operate on copy + btu::fs::remove_all(dir / "output"); + btu::fs::copy(dir / "input", dir / "output"); + + auto mf = btu::modmanager::ModFolder(dir / "output", btu::bsa::Settings::get(btu::Game::SSE), true); + + Transformer transformer; + mf.transform(transformer); + + CHECK(btu::common::compare_directories(dir / "output", dir / "expected")); +} + TEST_CASE("ModFolder size", "[src]") { const Path dir = "modfolder";