From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Professor Bloodstone Date: Sun, 20 Jun 2021 01:48:31 +0200 Subject: [PATCH] Add Git information to version command/on startup diff --git a/src/main/java/io/papermc/paper/util/JarManifests.java b/src/main/java/io/papermc/paper/util/JarManifests.java new file mode 100644 index 0000000000000000000000000000000000000000..909617079db61b675cc7b60b44ef96b306076343 --- /dev/null +++ b/src/main/java/io/papermc/paper/util/JarManifests.java @@ -0,0 +1,37 @@ +package io.papermc.paper.util; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Collections; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.jar.Manifest; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Internal +public final class JarManifests { + private JarManifests() { + } + + private static final Map MANIFESTS = Collections.synchronizedMap(new WeakHashMap<>()); + + public static @Nullable Manifest manifest(final @NotNull Class clazz) { + return MANIFESTS.computeIfAbsent(clazz.getClassLoader(), classLoader -> { + final String classLocation = "/" + clazz.getName().replace(".", "/") + ".class"; + final URL resource = clazz.getResource(classLocation); + if (resource == null) { + return null; + } + final String classFilePath = resource.toString().replace("\\", "/"); + final String archivePath = classFilePath.substring(0, classFilePath.length() - classLocation.length()); + try (final InputStream stream = new URL(archivePath + "/META-INF/MANIFEST.MF").openStream()) { + return new Manifest(stream); + } catch (final IOException ex) { + return null; + } + }); + } +} diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java index 7113f38eac400bc86a427972e501b0ca5653dae6..733b537d4236e5cb06efc188183ad876db31c0ff 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -55,6 +55,7 @@ import org.bukkit.util.CachedServerIcon; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import io.papermc.paper.util.JarManifests; // Paper /** * Represents the Bukkit core, for version and Server singleton handling @@ -104,7 +105,25 @@ public final class Bukkit { } Bukkit.server = server; - server.getLogger().info("This server is running " + getName() + " version " + getVersion() + " (Implementing API version " + getBukkitVersion() + ")"); + // Paper start - add git information + server.getLogger().info(getVersionMessage()); + } + /** + * Gets message describing the version server is running. + * + * @return message describing the version server is running + */ + @NotNull + public static String getVersionMessage() { + final var manifest = JarManifests.manifest(Bukkit.getServer().getClass()); + final String gitBranch = manifest == null ? null : manifest.getMainAttributes().getValue("Git-Branch"); + final String gitCommit = manifest == null ? null : manifest.getMainAttributes().getValue("Git-Commit"); + String branchMsg = " on " + gitBranch; + if ("master".equals(gitBranch) || "main".equals(gitBranch)) { + branchMsg = ""; // Don't show branch on main/master + } + return "This server is running " + getName() + " version " + getVersion() + " (Implementing API version " + getBukkitVersion() + ") (Git: " + gitCommit + branchMsg + ")"; + // Paper end } /** diff --git a/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/src/main/java/org/bukkit/command/defaults/VersionCommand.java index b50f614806f4634960d383e8a33f094c2f46935f..e40f017f87d6b6b4770501b106c76dc69ec69abb 100644 --- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java +++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java @@ -240,7 +240,7 @@ public class VersionCommand extends BukkitCommand { private void setVersionMessage(final @NotNull net.kyori.adventure.text.Component msg) { lastCheck = System.currentTimeMillis(); final net.kyori.adventure.text.Component message = net.kyori.adventure.text.TextComponent.ofChildren( - net.kyori.adventure.text.Component.text("This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")", net.kyori.adventure.text.format.NamedTextColor.WHITE), + net.kyori.adventure.text.Component.text(Bukkit.getVersionMessage(), net.kyori.adventure.text.format.NamedTextColor.WHITE), net.kyori.adventure.text.Component.newline(), msg );