From 8a08176638c3dd6ad142b60372c202f4775c17d8 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 23 Jun 2017 19:30:30 +0200 Subject: [PATCH] Plugin updater refactor --- .../core/UpdatePluginCommand.java | 3 +- .../java/buttondevteam/lib/PluginUpdater.java | 163 ++++++++++++++++++ .../java/buttondevteam/lib/TBMCCoreAPI.java | 127 +------------- 3 files changed, 166 insertions(+), 127 deletions(-) create mode 100644 src/main/java/buttondevteam/lib/PluginUpdater.java diff --git a/src/main/java/buttondevteam/core/UpdatePluginCommand.java b/src/main/java/buttondevteam/core/UpdatePluginCommand.java index 06f5787..9d6bcda 100644 --- a/src/main/java/buttondevteam/core/UpdatePluginCommand.java +++ b/src/main/java/buttondevteam/core/UpdatePluginCommand.java @@ -3,6 +3,7 @@ package buttondevteam.core; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; +import buttondevteam.lib.PluginUpdater; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.TBMCCommandBase; @@ -14,7 +15,7 @@ public class UpdatePluginCommand extends TBMCCommandBase { if (args.length == 0) { sender.sendMessage("Downloading plugin names..."); boolean first = true; - for (String plugin : TBMCCoreAPI.GetPluginNames()) { + for (String plugin : PluginUpdater.GetPluginNames()) { if (first) { sender.sendMessage("§6---- Plugin names ----"); first = false; diff --git a/src/main/java/buttondevteam/lib/PluginUpdater.java b/src/main/java/buttondevteam/lib/PluginUpdater.java new file mode 100644 index 0000000..fdf8198 --- /dev/null +++ b/src/main/java/buttondevteam/lib/PluginUpdater.java @@ -0,0 +1,163 @@ +package buttondevteam.lib; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.apache.commons.io.FileUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +public class PluginUpdater { + private PluginUpdater() { + } + + public static boolean UpdatePlugin(String name, CommandSender sender, String branch) { + info(sender, "Checking plugin name..."); + List plugins = GetPluginNames(); + String correctname = null; + for (String plugin : plugins) { + if (plugin.equalsIgnoreCase(name)) { + correctname = plugin; // Fixes capitalization + break; + } + } + if (correctname == null) { + error(sender, "Can't find plugin: " + name); + return false; + } + info(sender, "Checking branch name..."); + if (!TBMCCoreAPI.IsTestServer() && !branch.equalsIgnoreCase("master")) { + error(sender, "The server is in production mode, updating only allowed from master!"); + return false; + } + Optional correctbranch = GetPluginBranches(correctname).stream().filter(b -> b.equalsIgnoreCase(branch)) + .findAny(); + if (!correctbranch.isPresent()) { + error(sender, "Can't find branch \"" + branch + "\" for plugin \"" + correctname + "\""); + return false; + } + if (!isMaven(correctname, correctbranch.get())) { + error(sender, "The plugin doesn't appear to have a pom.xml. Make sure it's a Maven project."); + return false; + } + info(sender, "Updating TBMC plugin: " + correctname + " from " + correctbranch.get()); + URL url; + final boolean isWindows = System.getProperty("os.name").contains("Windows"); + File result = new File("plugins/" + correctname + (isWindows ? ".jar" : ".jar_tmp")); + File finalresult = new File("plugins/" + correctname + ".jar"); + try { + url = new URL("https://jitpack.io/com/github/TBMCPlugins/" + + (correctname.equals("ButtonCore") ? "ButtonCore/ButtonCore" : correctname) + "/" + + correctbranch.get() + "-SNAPSHOT/" + correctname + "-" + correctbranch.get() + "-SNAPSHOT.jar"); // ButtonCore exception required since it hosts Towny as well + FileUtils.copyURLToFile(url, result); + if (!result.exists() || result.length() < 25) { + result.delete(); + error(sender, "The downloaded JAR for " + correctname + " from " + correctbranch.get() + + " is too small (smnaller than 25 bytes). Am I downloading from the right place?"); + return false; + } else { + if (!isWindows) + Files.move(result.toPath(), finalresult.toPath(), StandardCopyOption.REPLACE_EXISTING); + info(sender, "Updating plugin " + correctname + " from " + correctbranch.get() + " done!"); + return true; + } + } catch (FileNotFoundException e) { + error(sender, + "Can't find JAR for " + correctname + " from " + correctbranch.get() + + ", the build probably failed. Build log (scroll to bottom):" + "\n" + + "https://jitpack.io/com/github/TBMCPlugins/" + correctname + "/" + correctbranch.get() + + "-SNAPSHOT/build.log\nIf you'd like to rebuild the same commit, go to:\nhttps://jitpack.io/#TBMCPlugins/" + + correctname + "\nAnd delete the newest build."); + } catch (IOException e) { + error(sender, "IO error while updating " + correctname + "\n" + e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + error(sender, "Unknown error while updating " + correctname + ": " + e); + } + return false; + } + + /** + * Checks if pom.xml is present for the project. + * + * @param pluginname + * Does not have to match case + * @param branch + * Does not have to match case + */ + public static boolean isMaven(String pluginname, String branch) { + try { + return !TBMCCoreAPI + .DownloadString( + "https://raw.githubusercontent.com/TBMCPlugins/" + pluginname + "/" + branch + "/pom.xml") + .equals("404: Not Found\n"); + } catch (IOException e1) { + return false; + } + } + + private static void error(CommandSender sender, String message) { + if (!sender.equals(Bukkit.getConsoleSender())) + Bukkit.getLogger().warning(message); + sender.sendMessage("§c" + message); + } + + private static void info(CommandSender sender, String message) { + if (!sender.equals(Bukkit.getConsoleSender())) + Bukkit.getLogger().info(message); + sender.sendMessage("§b" + message); + } + + /** + * Retrieves all the repository names from the GitHub organization. + * + * @return A list of names + */ + public static List GetPluginNames() { + List ret = new ArrayList<>(); + try { + String resp = TBMCCoreAPI.DownloadString("https://api.github.com/orgs/TBMCPlugins/repos"); + JsonArray arr = new JsonParser().parse(resp).getAsJsonArray(); + for (JsonElement obj : arr) { + JsonObject jobj = obj.getAsJsonObject(); + ret.add(jobj.get("name").getAsString()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return ret; + } + + /** + * Retrieves all the branches from the plugin repository. + * + * @return A list of names + */ + public static List GetPluginBranches(String plugin) { + List ret = new ArrayList<>(); + try { + String resp = TBMCCoreAPI + .DownloadString("https://api.github.com/repos/TBMCPlugins/" + plugin + "/branches"); + JsonArray arr = new JsonParser().parse(resp).getAsJsonArray(); + for (JsonElement obj : arr) { + JsonObject jobj = obj.getAsJsonObject(); + ret.add(jobj.get("name").getAsString()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return ret; + } +} diff --git a/src/main/java/buttondevteam/lib/TBMCCoreAPI.java b/src/main/java/buttondevteam/lib/TBMCCoreAPI.java index 217443c..f1c0441 100644 --- a/src/main/java/buttondevteam/lib/TBMCCoreAPI.java +++ b/src/main/java/buttondevteam/lib/TBMCCoreAPI.java @@ -2,12 +2,9 @@ package buttondevteam.lib; import java.io.*; import java.net.*; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; import java.util.*; import java.util.Map.Entry; -import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -15,8 +12,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; -import com.google.gson.*; - import buttondevteam.core.MainPlugin; import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.potato.DebugPotato; @@ -57,127 +52,7 @@ public class TBMCCoreAPI { * @return Success or not */ public static boolean UpdatePlugin(String name, CommandSender sender, String branch) { - info(sender, "Checking plugin name..."); - List plugins = GetPluginNames(); - String correctname = null; - for (String plugin : plugins) { - if (plugin.equalsIgnoreCase(name)) { - correctname = plugin; // Fixes capitalization - break; - } - } - if (correctname == null) { - error(sender, "Can't find plugin: " + name); - return false; - } - info(sender, "Checking branch name..."); - if (!TBMCCoreAPI.IsTestServer() && !branch.equalsIgnoreCase("master")) { - error(sender, "The server is in production mode, updating only allowed from master!"); - return false; - } - Optional correctbranch = GetPluginBranches(correctname).stream().filter(b -> b.equalsIgnoreCase(branch)) - .findAny(); - if (!correctbranch.isPresent()) { - error(sender, "Can't find branch \"" + branch + "\" for plugin \"" + correctname + "\""); - return false; - } - try { - if (DownloadString("https://raw.githubusercontent.com/TBMCPlugins/" + correctname + "/" - + correctbranch.get() + "/pom.xml").equals("404: Not Found\n")) { - error(sender, "The plugin doesn't appear to have a pom.xml. Make sure it's a Maven project."); - return false; - } - } catch (IOException e1) { - error(sender, "The plugin doesn't appear to have a pom.xml. Make sure it's a Maven project.\n" + e1); - return false; - } - info(sender, "Updating TBMC plugin: " + correctname + " from " + correctbranch.get()); - URL url; - final boolean isWindows = System.getProperty("os.name").contains("Windows"); - File result = new File("plugins/" + correctname + (isWindows ? ".jar" : ".jar_tmp")); - File finalresult = new File("plugins/" + correctname + ".jar"); - try { - url = new URL("https://jitpack.io/com/github/TBMCPlugins/" - + (correctname.equals("ButtonCore") ? "ButtonCore/ButtonCore" : correctname) + "/" - + correctbranch.get() + "-SNAPSHOT/" + correctname + "-" + correctbranch.get() + "-SNAPSHOT.jar"); // ButtonCore exception required since it hosts Towny as well - FileUtils.copyURLToFile(url, result); - if (!result.exists() || result.length() < 25) { - result.delete(); - error(sender, "The downloaded JAR for " + correctname + " from " + correctbranch.get() - + " is too small (smnaller than 25 bytes). Am I downloading from the right place?"); - return false; - } else { - if (!isWindows) - Files.move(result.toPath(), finalresult.toPath(), StandardCopyOption.REPLACE_EXISTING); - info(sender, "Updating plugin " + correctname + " from " + correctbranch.get() + " done!"); - return true; - } - } catch (FileNotFoundException e) { - error(sender, - "Can't find JAR for " + correctname + " from " + correctbranch.get() - + ", the build probably failed. Build log (scroll to bottom):" + "\n" - + "https://jitpack.io/com/github/TBMCPlugins/" + correctname + "/" + correctbranch.get() - + "-SNAPSHOT/build.log\nIf you'd like to rebuild the same commit, go to:\nhttps://jitpack.io/#TBMCPlugins/" - + correctname + "\nAnd delete the newest build."); - } catch (IOException e) { - error(sender, "IO error while updating " + correctname + "\n" + e.getMessage()); - } catch (Exception e) { - e.printStackTrace(); - error(sender, "Unknown error while updating " + correctname + ": " + e); - } - return false; - } - - private static void error(CommandSender sender, String message) { - if (!sender.equals(Bukkit.getConsoleSender())) - Bukkit.getLogger().warning(message); - sender.sendMessage("§c" + message); - } - - private static void info(CommandSender sender, String message) { - if (!sender.equals(Bukkit.getConsoleSender())) - Bukkit.getLogger().info(message); - sender.sendMessage("§b" + message); - } - - /** - * Retrieves all the repository names from the GitHub organization. - * - * @return A list of names - */ - public static List GetPluginNames() { - List ret = new ArrayList<>(); - try { - String resp = DownloadString("https://api.github.com/orgs/TBMCPlugins/repos"); - JsonArray arr = new JsonParser().parse(resp).getAsJsonArray(); - for (JsonElement obj : arr) { - JsonObject jobj = obj.getAsJsonObject(); - ret.add(jobj.get("name").getAsString()); - } - } catch (Exception e) { - e.printStackTrace(); - } - return ret; - } - - /** - * Retrieves all the branches from the plugin repository. - * - * @return A list of names - */ - public static List GetPluginBranches(String plugin) { - List ret = new ArrayList<>(); - try { - String resp = DownloadString("https://api.github.com/repos/TBMCPlugins/" + plugin + "/branches"); - JsonArray arr = new JsonParser().parse(resp).getAsJsonArray(); - for (JsonElement obj : arr) { - JsonObject jobj = obj.getAsJsonObject(); - ret.add(jobj.get("name").getAsString()); - } - } catch (Exception e) { - e.printStackTrace(); - } - return ret; + return PluginUpdater.UpdatePlugin(name, sender, branch); } public static String DownloadString(String urlstr) throws MalformedURLException, IOException {