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..2a49f4198b07b3ecdc320c330c58eab2f15c5c74 --- /dev/null +++ b/src/main/java/io/papermc/paper/util/JarManifests.java @@ -0,0 +1,36 @@ +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; + +@ApiStatus.Internal +public final class JarManifests { + private JarManifests() { + } + + private static final Map MANIFESTS = Collections.synchronizedMap(new WeakHashMap<>()); + + public static @NotNull 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) { + throw new IllegalStateException("Could not find class file for loaded class: " + clazz.getName()); + } + 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) { + throw new RuntimeException("Failed to locate or read manifest", ex); + } + }); + } +} diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java index 0521781a48d326c0a4a01b920188e9ce00b51ef0..7bbeed0c0514d5da243e205a78f82116b464acd1 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -51,6 +51,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 @@ -100,7 +101,30 @@ 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 java.util.jar.Manifest manifest; + if (java.lang.reflect.Proxy.isProxyClass(Bukkit.getServer().getClass())) { // TestServer + manifest = new java.util.jar.Manifest(); + } else { + manifest = JarManifests.manifest(Bukkit.getServer().getClass()); + } + final String gitBranch = manifest.getMainAttributes().getValue("Git-Branch"); + final String gitCommit = 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 4c2ddc722a9dc4011906ad9530b13fa9be1d3ff9..57a21495843f3a144cd73473cdc8781d6129b7ca 100644 --- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java +++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java @@ -241,7 +241,7 @@ public class VersionCommand extends BukkitCommand { private void setVersionMessage(final @NotNull Component msg) { lastCheck = System.currentTimeMillis(); final Component message = net.kyori.adventure.text.TextComponent.ofChildren( - Component.text("This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")", net.kyori.adventure.text.format.NamedTextColor.WHITE), + Component.text(Bukkit.getVersionMessage(), net.kyori.adventure.text.format.NamedTextColor.WHITE), Component.newline(), msg );