From 242e100febe433c8044056294568d635c6689fcf Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Mon, 20 Jul 2026 14:47:26 +0800 Subject: [PATCH] fix: stale .whl cache when .whl changes, added option to delete cache and reload --- src/slic3r/GUI/PluginsDialog.cpp | 40 ++++++++++++++++++++++++++++---- src/slic3r/GUI/PluginsDialog.hpp | 2 +- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/PluginsDialog.cpp b/src/slic3r/GUI/PluginsDialog.cpp index 3011c35ce3..3485f686fa 100644 --- a/src/slic3r/GUI/PluginsDialog.cpp +++ b/src/slic3r/GUI/PluginsDialog.cpp @@ -300,7 +300,12 @@ PluginAvailableActions evaluate_action_policy(const PluginDialogItem& item) add_action("open_folder", "Show in folder", has_local); - add_action("reinstall_plugin", "Reinstall"); + if (is_cloud) { + add_action("reinstall_plugin", "Reinstall"); + } else { + add_action("reload_plugin", "Reload"); + add_action("clear_cache_reload_plugin", "Delete cache and reload"); + } return available_actions; } @@ -739,11 +744,13 @@ void PluginsDialog::handle_plugin_menu_action(const std::string& plugin_key, con unsubscribe_cloud_plugin(row_data); } else if (action == "delete_mine_plugin") { delete_mine_local_and_cloud_plugin(plugin_key); + } else if (action == "reload_plugin") { + reload_local_plugin(plugin_key, /*clear_cache=*/false); + } else if (action == "clear_cache_reload_plugin") { + reload_local_plugin(plugin_key, /*clear_cache=*/true); } else if (action == "reinstall_plugin") { if (row_data.is_cloud_plugin()) reinstall_cloud_plugin(row_data); - else - reinstall_local_plugin(plugin_key); } } @@ -1123,7 +1130,7 @@ void PluginsDialog::unsubscribe_cloud_plugin(const PluginDescriptor& plugin) _L("Unsubscribing plugin"), _L("Deleting local files and unsubscribing plugin...")); } -void PluginsDialog::reinstall_local_plugin(const std::string& plugin_key) +void PluginsDialog::reload_local_plugin(const std::string& plugin_key, bool clear_cache) { if (plugin_key.empty()) return; @@ -1132,11 +1139,34 @@ void PluginsDialog::reinstall_local_plugin(const std::string& plugin_key) std::pair reload_result{false, ""}; try { reload_result = run_with_dialog_wait( - [plugin_key, was_loaded]() -> std::pair { + [plugin_key, was_loaded, clear_cache]() -> std::pair { PluginManager& manager = PluginManager::instance(); + + boost::filesystem::path cache_dir; + if (clear_cache) { + PluginDescriptor descriptor; + if (!manager.try_get_plugin_descriptor(plugin_key, descriptor)) + return {false, "Plugin not found."}; + + boost::filesystem::path resolved_root; + std::string resolve_error; + if (!resolve_allowed_plugin_root(descriptor, {get_orca_plugins_dir()}, + "Refusing to clear a plugin cache outside the local plugin directory.", + resolved_root, resolve_error)) + return {false, resolve_error}; + cache_dir = resolved_root / "__whl_extracted__"; + } + if (!manager.unload_plugin(plugin_key)) return {false, "Failed to unload plugin."}; + if (clear_cache) { + boost::system::error_code ec; + boost::filesystem::remove_all(cache_dir, ec); + if (ec) + return {false, "Failed to clear plugin cache: " + ec.message()}; + } + manager.load_plugin(plugin_key, false); std::string error; if (!manager.wait_for_plugin_load(plugin_key, std::chrono::minutes(5), error) || !manager.is_plugin_loaded(plugin_key)) diff --git a/src/slic3r/GUI/PluginsDialog.hpp b/src/slic3r/GUI/PluginsDialog.hpp index de0f44985d..b921801166 100644 --- a/src/slic3r/GUI/PluginsDialog.hpp +++ b/src/slic3r/GUI/PluginsDialog.hpp @@ -96,7 +96,7 @@ private: void open_plugin_folder(const Slic3r::PluginDescriptor& plugin); void delete_local_plugin(const Slic3r::PluginDescriptor& plugin); void unsubscribe_cloud_plugin(const Slic3r::PluginDescriptor& plugin); - void reinstall_local_plugin(const std::string& plugin_key); + void reload_local_plugin(const std::string& plugin_key, bool clear_cache); void reinstall_cloud_plugin(const Slic3r::PluginDescriptor& plugin); void delete_mine_local_and_cloud_plugin(const std::string& plugin_key);