aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0379-Update-Folder-Uses-Plugin-Name.patch
blob: ead80ec0fe937b3f258ab7c952940762967973ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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 42da20011544075a9bea63a12ae86f2f21720667..bea2e464861771383f8fcf143fa817340cb8ab1d 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
@@ -400,7 +400,7 @@ public final class SimplePluginManager implements PluginManager {
     public synchronized Plugin loadPlugin(@NotNull File file) throws InvalidPluginException, UnknownDependencyException {
         Validate.notNull(file, "File cannot be null");
 
-        checkUpdate(file);
+        file = checkUpdate(file); // Paper - update the reference in case checkUpdate renamed it
 
         Set<Pattern> filters = fileAssociations.keySet();
         Plugin result = null;
@@ -427,16 +427,50 @@ 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 = updatePluginLoader.getPluginDescription(updateFile).getName();
+                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<Pattern> 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