From bf97fb11eb98fc559f6b958a54d34085e9ce18c2 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 2 May 2020 08:24:56 -0400 Subject: [PATCH] externalpluginmanager: ensure no duplicates are saved to config. externalpluginmanager: add verbose debug logging. --- .../client/plugins/ExternalPluginManager.java | 66 ++++++++++++++++++- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java index 2f62888910..58ae48d894 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java @@ -506,6 +506,7 @@ public class ExternalPluginManager { if (!tryLoadNewFormat()) { + log.debug("Load new format failed."); loadOldFormat(); } @@ -517,11 +518,14 @@ public class ExternalPluginManager { try { + duplicateCheck(); + log.debug("Trying to load new format: {}", openOSRSConfig.getExternalRepositories()); for (String keyval : openOSRSConfig.getExternalRepositories().split(";")) { String[] split = keyval.split("\\|"); if (split.length != 2) { + log.debug("Split length invalid."); repositories.clear(); return false; } @@ -548,6 +552,7 @@ public class ExternalPluginManager } catch (ArrayIndexOutOfBoundsException | MalformedURLException e) { + log.error("Error in new format", e); repositories.clear(); return false; } @@ -558,14 +563,18 @@ public class ExternalPluginManager { try { + log.debug("Loading old format."); repositories.clear(); for (String keyval : openOSRSConfig.getExternalRepositories().split(";")) { + log.debug("KeyVal: {}", keyval); String id = keyval.substring(0, keyval.lastIndexOf(":https")); String url = keyval.substring(keyval.lastIndexOf("https")); - repositories.add(new DefaultUpdateRepository(id, new URL(url))); + DefaultUpdateRepository defaultRepo = new DefaultUpdateRepository(id, new URL(url)); + repositories.add(defaultRepo); + log.debug("Added Repo: {}", defaultRepo.getUrl()); } } catch (MalformedURLException e) @@ -620,10 +629,60 @@ public class ExternalPluginManager config.append(";"); } config.deleteCharAt(config.lastIndexOf(";")); - openOSRSConfig.setExternalRepositories(config.toString()); } + + /** + * This method is a fail safe to ensure that no duplicate + * repositories end up getting saved to the config. + *

+ * Configs that had duplicate repos prior to this should + * be updated and set correctly. + */ + private void duplicateCheck() + { + String[] split = openOSRSConfig.getExternalRepositories().split(";"); + + if (split.length <= 0) + { + return; + } + + Set strings = new HashSet<>(); + boolean duplicates = false; + + for (String s : split) + { + if (strings.contains(s)) + { + log.error("Duplicate Repo: {}", s); + duplicates = true; + continue; + } + strings.add(s); + } + + if (duplicates) + { + StringBuilder sb = new StringBuilder(); + + for (String string : strings) + { + sb.append(string); + sb.append(";"); + } + + sb.deleteCharAt(sb.lastIndexOf(";")); + String duplicateFix = sb.toString(); + + log.info("Duplicate Repos detected, setting them to: {}", duplicateFix); + openOSRSConfig.setExternalRepositories(duplicateFix); + return; + } + log.info("No duplicates found."); + } + private void scanAndInstantiate(List plugins, boolean init, boolean initConfig) { RuneLiteSplashScreen.stage(.66, "Loading external plugins"); @@ -877,7 +936,8 @@ public class ExternalPluginManager AtomicReference version = new AtomicReference<>(""); updateManager.getRepositories().forEach(repository -> - repository.getPlugins().forEach((key, value) -> { + repository.getPlugins().forEach((key, value) -> + { if (key.equals(pluginId)) { support.set(value.projectUrl);