From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Xemorr <31805746+Xemorr@users.noreply.github.com> Date: Fri, 1 Apr 2022 19:57:40 +0100 Subject: [PATCH] Update Folder Uses Plugin Name diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 45114d587a8f201778adcba16c8a019f9959f472..ed07f5820281b139739f673fa4e25171de81b894 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -395,7 +395,7 @@ public final class SimplePluginManager implements PluginManager { public synchronized Plugin loadPlugin(@NotNull File file) throws InvalidPluginException, UnknownDependencyException { Preconditions.checkArgument(file != null, "File cannot be null"); - checkUpdate(file); + file = checkUpdate(file); // Paper - update the reference in case checkUpdate renamed it Set filters = fileAssociations.keySet(); Plugin result = null; @@ -422,16 +422,56 @@ public final class SimplePluginManager implements PluginManager { return result; } - private void checkUpdate(@NotNull File file) { + // Paper start - Update Folder Uses Plugin Name to replace + /** + * Replaces a plugin with a plugin of the same plugin name in the update folder. + * @param file + * @throws InvalidPluginException + */ + private File checkUpdate(@NotNull File file) throws InvalidPluginException { if (updateDirectory == null || !updateDirectory.isDirectory()) { - return; + return file; + } + PluginLoader pluginLoader = getPluginLoader(file); + try { + String pluginName = pluginLoader.getPluginDescription(file).getName(); + for (File updateFile : updateDirectory.listFiles()) { + if (!updateFile.isFile()) continue; + PluginLoader updatePluginLoader = getPluginLoader(updateFile); + if (updatePluginLoader == null) continue; + String updatePluginName; + try { + updatePluginName = updatePluginLoader.getPluginDescription(updateFile).getName(); + // We failed to load this data for some reason, so, we'll skip over this + } catch (InvalidDescriptionException ex) { + continue; + } + if (!pluginName.equals(updatePluginName)) continue; + if (!FileUtil.copy(updateFile, file)) continue; + File newName = new File(file.getParentFile(), updateFile.getName()); + file.renameTo(newName); + updateFile.delete(); + return newName; + } + } + catch (InvalidDescriptionException e) { + throw new InvalidPluginException(e); } + return file; + } - File updateFile = new File(updateDirectory, file.getName()); - if (updateFile.isFile() && FileUtil.copy(updateFile, file)) { - updateFile.delete(); + @Nullable + private PluginLoader getPluginLoader(File file) { + Set filters = fileAssociations.keySet(); + for (Pattern filter : filters) { + Matcher match = filter.matcher(file.getName()); + if (match.find()) { + return fileAssociations.get(filter); + } } + return null; } + // Paper end /** * Checks if the given plugin is loaded and returns it when applicable