From e0b1b5bcb19fee70c0dba70515272a0e0fce6fb6 Mon Sep 17 00:00:00 2001 From: Warren Hood Date: Mon, 19 Aug 2024 01:24:36 +0200 Subject: [PATCH] Added option to forcefully remove a mod --- src/main.rs | 12 ++++++++---- src/resolver.rs | 15 ++++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index b0d0ec9..6968579 100644 --- a/src/main.rs +++ b/src/main.rs @@ -74,6 +74,9 @@ enum Commands { Remove { /// Name of the mod to remove from the modpack name: String, + /// Forcefully remove the mod without checking if anything depends on it + #[arg(long, short, action)] + force: bool, }, /// Download the mods in the pack to a specified folder Download { @@ -87,7 +90,7 @@ enum Commands { /// Use exact transitive mod dependency versions #[arg(long, short, action)] locked: bool, - } + }, } #[tokio::main(flavor = "multi_thread")] @@ -194,7 +197,8 @@ async fn main() -> Result<(), Box> { match resolver::PinnedPackMeta::load_from_current_directory(!locked).await { Ok(mut modpack_lock) => { - let remove_result = modpack_lock.remove_mod(&mod_meta.name, &modpack_meta); + let remove_result = + modpack_lock.remove_mod(&mod_meta.name, &modpack_meta, true); if let Err(e) = remove_result { revert_modpack_meta(e); } @@ -215,7 +219,7 @@ async fn main() -> Result<(), Box> { } }; } - Commands::Remove { name } => { + Commands::Remove { name, force } => { let mut modpack_meta = ModpackMeta::load_from_current_directory()?; let old_modpack_meta = modpack_meta.clone(); @@ -232,7 +236,7 @@ async fn main() -> Result<(), Box> { match resolver::PinnedPackMeta::load_from_current_directory(true).await { Ok(mut modpack_lock) => { - let remove_result = modpack_lock.remove_mod(&name, &modpack_meta); + let remove_result = modpack_lock.remove_mod(&name, &modpack_meta, force); if let Err(e) = remove_result { revert_modpack_meta(e); } diff --git a/src/resolver.rs b/src/resolver.rs index 103bf8a..c83f821 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -259,15 +259,20 @@ impl PinnedPackMeta { &mut self, mod_name: &str, pack_metadata: &ModpackMeta, + force: bool, ) -> Result<(), Box> { let dependent_mods = self.get_dependent_mods(mod_name); if dependent_mods.len() > 0 { - return Err(format!( - "Cannot remove mod {}.The following mods depend on it:\n{:#?}", - mod_name, dependent_mods - ) - .into()); + if force { + println!("Forcefully removing mod {} even though it is depended on by the following mods:\n{:#?}", mod_name, dependent_mods); + } else { + return Err(format!( + "Cannot remove mod {}.The following mods depend on it:\n{:#?}", + mod_name, dependent_mods + ) + .into()); + } } let removed_mod = self.mods.remove(mod_name); if let Some(removed_mod) = removed_mod {