From 2421266df01f34607093d51c125a474fbaae3c9a Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sun, 25 Oct 2020 21:54:15 -0600 Subject: [PATCH 1/2] package: include plugin update times --- .../runelite/pluginhub/packager/Plugin.java | 33 +++++++++++++++++++ .../pluginhub/packager/PluginTest.java | 8 ++++- .../uploader/ExternalPluginManifest.java | 3 ++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java b/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java index ae21fa090..3e4b6b545 100644 --- a/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java +++ b/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java @@ -33,11 +33,13 @@ import com.google.common.hash.Hashing; import com.google.common.io.ByteStreams; import com.google.common.io.MoreFiles; import com.google.common.io.RecursiveDeleteOption; +import java.io.BufferedReader; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.MalformedURLException; @@ -108,6 +110,8 @@ public class Plugin implements Closeable } } + private final File pluginCommitDescriptor; + @Getter private final String internalName; @@ -140,6 +144,7 @@ public class Plugin implements Closeable public Plugin(File pluginCommitDescriptor) throws IOException, DisabledPluginException, PluginBuildException { + this.pluginCommitDescriptor = pluginCommitDescriptor; internalName = pluginCommitDescriptor.getName(); if (!PLUGIN_INTERNAL_NAME_TEST.matcher(internalName).matches()) { @@ -552,6 +557,34 @@ public class Plugin implements Closeable writeLog("warning: unused props in runelite-plugin.properties: {}\n", props.keySet()); } } + + realPluginChecks(); + } + + // Tests don't run this as the example plugin will fail these on purpose + protected void realPluginChecks() throws IOException, PluginBuildException + { + { + Process gitlog = new ProcessBuilder("git", "log", "--follow", "--format=%ct", "--", pluginCommitDescriptor.getAbsolutePath()) + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.appendTo(logFile)) + .directory(pluginCommitDescriptor.getParentFile()) + .start(); + + try (BufferedReader br = new BufferedReader(new InputStreamReader(gitlog.getInputStream()))) + { + String line = br.readLine(); + manifest.setLastUpdatedAt(Long.parseLong(line)); + + String lastLine = line; + for (; (line = br.readLine()) != null; ) + { + lastLine = line; + } + manifest.setCreatedAt(Long.parseLong(lastLine)); + } + waitAndCheck(gitlog, "git log ", 30, TimeUnit.SECONDS); + } } public void upload(UploadConfiguration uploadConfig) throws IOException diff --git a/package/package/src/test/java/net/runelite/pluginhub/packager/PluginTest.java b/package/package/src/test/java/net/runelite/pluginhub/packager/PluginTest.java index 0ba278b4e..c036b00c2 100644 --- a/package/package/src/test/java/net/runelite/pluginhub/packager/PluginTest.java +++ b/package/package/src/test/java/net/runelite/pluginhub/packager/PluginTest.java @@ -115,7 +115,13 @@ public class PluginTest try { Files.asCharSink(f, StandardCharsets.UTF_8).write(desc); - return new Plugin(f); + return new Plugin(f) + { + @Override + protected void realPluginChecks() + { + } + }; } finally { diff --git a/package/upload/src/main/java/net/runelite/pluginhub/uploader/ExternalPluginManifest.java b/package/upload/src/main/java/net/runelite/pluginhub/uploader/ExternalPluginManifest.java index e78b354c5..ce0c2cb79 100644 --- a/package/upload/src/main/java/net/runelite/pluginhub/uploader/ExternalPluginManifest.java +++ b/package/upload/src/main/java/net/runelite/pluginhub/uploader/ExternalPluginManifest.java @@ -38,6 +38,9 @@ public class ExternalPluginManifest private int size; private String[] plugins; + private long createdAt; + private long lastUpdatedAt; + private String displayName; private String version; private String author; From 343b3e8e85a0839ec8a0363bfcac4e59a1998e9a Mon Sep 17 00:00:00 2001 From: Max Weber Date: Mon, 26 Oct 2020 12:30:39 -0600 Subject: [PATCH 2/2] package: require license files --- .../net/runelite/pluginhub/packager/Plugin.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java b/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java index 3e4b6b545..ae7154516 100644 --- a/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java +++ b/package/package/src/main/java/net/runelite/pluginhub/packager/Plugin.java @@ -585,6 +585,20 @@ public class Plugin implements Closeable } waitAndCheck(gitlog, "git log ", 30, TimeUnit.SECONDS); } + + if (!new File(repositoryDirectory, "LICENSE").exists()) + { + if (manifest.getLastUpdatedAt() < 1604534400) + { + writeLog("Missing LICENSE file. This will become fatal in the future\n"); + } + else + { + throw PluginBuildException.of(this, "Missing LICENSE file") + .withHelp("All plugins must be licensed under a license that allows us to freely distribute the plugin jar standalone.\n" + + "We recommend the BSD 2 Clause license."); + } + } } public void upload(UploadConfiguration uploadConfig) throws IOException