101 lines
		
	
	
	
		
			4.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
	
		
			4.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: Professor Bloodstone <git@bloodstone.dev>
 | 
						|
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..0000000000000000000000000000000000000000
 | 
						|
--- /dev/null
 | 
						|
+++ b/src/main/java/io/papermc/paper/util/JarManifests.java
 | 
						|
@@ -0,0 +0,0 @@
 | 
						|
+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<ClassLoader, Manifest> 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/org/bukkit/Bukkit.java
 | 
						|
+++ b/src/main/java/org/bukkit/Bukkit.java
 | 
						|
@@ -0,0 +0,0 @@ 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
 | 
						|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java
 | 
						|
+++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java
 | 
						|
@@ -0,0 +0,0 @@ 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
 | 
						|
         );
 |