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..cfd5fa044f58c8a5493f8efc08280b22c401a1da --- /dev/null +++ b/src/main/java/io/papermc/paper/util/JarManifests.java @@ -0,0 +1,32 @@ +package io.papermc.paper.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.jar.Manifest; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public final class JarManifests { + private JarManifests() { + } + + private static final Map MANIFESTS = Collections.synchronizedMap(new WeakHashMap<>()); + + public static Manifest manifest(final ClassLoader loader) { + return MANIFESTS.computeIfAbsent(loader, classLoader -> { + final @Nullable InputStream stream = classLoader.getResourceAsStream("META-INF/MANIFEST.MF"); + if (stream == null) { + throw new IllegalArgumentException("Provided ClassLoader does not have a manifest file in the correct location!"); + } + try (stream) { + return new Manifest(stream); + } catch (final IOException ex) { + throw new RuntimeException("Failed to read manifest."); + } + }); + } +} diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java index 0521781a48d326c0a4a01b920188e9ce00b51ef0..7868a54eec71f7b31d7fabf3288eb2dc62649e92 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,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().getClassLoader()); + 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 );