From 7e301bdede6b31e752c82390d219d1a363a6d504 Mon Sep 17 00:00:00 2001 From: GeckoEidechse Date: Tue, 18 Jul 2023 01:29:50 +0200 Subject: feat: Add ability to delete a Thunderstore package --- src-tauri/src/mod_management/mod.rs | 46 +++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'src-tauri/src') diff --git a/src-tauri/src/mod_management/mod.rs b/src-tauri/src/mod_management/mod.rs index 2ac26ede..864f5448 100644 --- a/src-tauri/src/mod_management/mod.rs +++ b/src-tauri/src/mod_management/mod.rs @@ -548,11 +548,57 @@ pub fn delete_northstar_mod(game_install: GameInstall, nsmod_name: String) -> Re Err(format!("Mod {nsmod_name} not found to be installed")) } +/// Deletes a given Thunderstore package +fn delete_package_folder(ts_package_directory: &str) -> Result<(), String> { + let ns_mod_dir_path = std::path::Path::new(&ts_package_directory); + + // Safety check: Check whether `manifest.json` exists and exit early if not + // If it does not exist, we might not be dealing with a Thunderstore package + let mod_json_path = ns_mod_dir_path.join("manifest.json"); + if !mod_json_path.exists() { + // If it doesn't exist, return an error + return Err(format!("manifest.json does not exist in {}", ts_package_directory)); + } + + match std::fs::remove_dir_all(ts_package_directory) { + Ok(()) => Ok(()), + Err(err) => Err(format!("Failed deleting package: {err}")), + } +} + /// Deletes all NorthstarMods related to a Thunderstore mod #[tauri::command] pub fn delete_thunderstore_mod( game_install: GameInstall, thunderstore_mod_string: String, ) -> Result<(), String> { + // Check packages + let packages_folder = format!("{}/R2Northstar/packages", game_install.game_path); + if std::path::Path::new(&packages_folder).exists() { + println!("Directory {} exists. Listing subdirectories...", packages_folder); + for entry in fs::read_dir(packages_folder).unwrap() { + let entry = entry.unwrap(); + + // Check if it's a folder and skip if otherwise + if !entry.file_type().unwrap().is_dir() { + log::warn!("Skipping \"{}\", not a file", entry.path().display()); + continue; + } + + let entry_path = entry.path(); + let package_folder_ts_string = entry_path.file_name().unwrap().to_string_lossy(); + dbg!(package_folder_ts_string.clone()); + + if package_folder_ts_string != thunderstore_mod_string { + // Not the mod folder we are looking for, try the next one\ + continue; + } + + // All checks passed, this is the matching mod + return delete_package_folder(&entry.path().display().to_string()); + } + } + + // Try legacy mod installs as fallback legacy::delete_thunderstore_mod(game_install, thunderstore_mod_string) } -- cgit v1.2.3 From 0fc68de30150746721be31728e84f86434086bc7 Mon Sep 17 00:00:00 2001 From: GeckoEidechse Date: Tue, 18 Jul 2023 01:31:20 +0200 Subject: fix: Formatting --- src-tauri/src/mod_management/mod.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src-tauri/src') diff --git a/src-tauri/src/mod_management/mod.rs b/src-tauri/src/mod_management/mod.rs index 864f5448..d0ce3476 100644 --- a/src-tauri/src/mod_management/mod.rs +++ b/src-tauri/src/mod_management/mod.rs @@ -557,7 +557,10 @@ fn delete_package_folder(ts_package_directory: &str) -> Result<(), String> { let mod_json_path = ns_mod_dir_path.join("manifest.json"); if !mod_json_path.exists() { // If it doesn't exist, return an error - return Err(format!("manifest.json does not exist in {}", ts_package_directory)); + return Err(format!( + "manifest.json does not exist in {}", + ts_package_directory + )); } match std::fs::remove_dir_all(ts_package_directory) { @@ -575,14 +578,17 @@ pub fn delete_thunderstore_mod( // Check packages let packages_folder = format!("{}/R2Northstar/packages", game_install.game_path); if std::path::Path::new(&packages_folder).exists() { - println!("Directory {} exists. Listing subdirectories...", packages_folder); + println!( + "Directory {} exists. Listing subdirectories...", + packages_folder + ); for entry in fs::read_dir(packages_folder).unwrap() { let entry = entry.unwrap(); - + // Check if it's a folder and skip if otherwise if !entry.file_type().unwrap().is_dir() { log::warn!("Skipping \"{}\", not a file", entry.path().display()); - continue; + continue; } let entry_path = entry.path(); @@ -593,7 +599,7 @@ pub fn delete_thunderstore_mod( // Not the mod folder we are looking for, try the next one\ continue; } - + // All checks passed, this is the matching mod return delete_package_folder(&entry.path().display().to_string()); } -- cgit v1.2.3