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 94646b37c77fcb18fc4030306c431684e7e9a5cc..9db611841b73fed8dc8a71f4d7fdef95af3cf89d 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -396,7 +396,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; @@ -423,16 +423,61 @@ 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; + try { + java.nio.file.Files.copy(updateFile.toPath(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + } catch (java.io.IOException exception) { + server.getLogger().log(Level.SEVERE, "Could not copy '" + updateFile.getPath() + "' to '" + file.getPath() + "' in update plugin process", exception); + 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