Skip to content

Commit b855f5e

Browse files
committed
Add build info command
1 parent eb38590 commit b855f5e

File tree

7 files changed

+143
-1
lines changed

7 files changed

+143
-1
lines changed

build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import dev.xpple.seedmapper.buildscript.CreateJavaBindingsTask
2+
import dev.xpple.seedmapper.buildscript.GenerateBuildInfoTask
23

34
plugins {
45
id 'fabric-loom' version "${fabric_loom_version}"
@@ -58,6 +59,10 @@ dependencies {
5859
tasks.register('createJavaBindings', CreateJavaBindingsTask) {}
5960
compileJava.dependsOn('createJavaBindings')
6061

62+
tasks.register('generateBuildInfo', GenerateBuildInfoTask) {
63+
outputFile = new File(temporaryDir, "build_info.json")
64+
}
65+
6166
processResources {
6267
def props = [version: project.mod_version, loader_version: project.fabric_loader_version]
6368
inputs.properties props
@@ -74,6 +79,8 @@ processResources {
7479
from("src/main/c/LICENSE") {
7580
rename {"${it}_cubiomes"}
7681
}
82+
83+
from generateBuildInfo
7784
}
7885

7986
tasks.withType(JavaCompile).configureEach {

buildSrc/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ plugins {
55
repositories {
66
mavenCentral()
77
}
8+
9+
dependencies {
10+
implementation("com.google.code.gson:gson:2.11.0")
11+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package dev.xpple.seedmapper.buildscript;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.JsonObject;
5+
import org.gradle.api.DefaultTask;
6+
import org.gradle.api.file.RegularFileProperty;
7+
import org.gradle.api.tasks.OutputFile;
8+
import org.gradle.api.tasks.TaskAction;
9+
import org.gradle.process.ExecOperations;
10+
11+
import javax.inject.Inject;
12+
import java.io.BufferedWriter;
13+
import java.io.ByteArrayOutputStream;
14+
import java.io.IOException;
15+
import java.nio.charset.StandardCharsets;
16+
import java.nio.file.Files;
17+
18+
public abstract class GenerateBuildInfoTask extends DefaultTask {
19+
20+
private static final Gson GSON = new Gson();
21+
22+
@OutputFile
23+
public abstract RegularFileProperty getOutputFile();
24+
25+
@Inject
26+
protected abstract ExecOperations getExecOperations();
27+
28+
{
29+
// never reuse previous outputs
30+
this.getOutputs().upToDateWhen(_ -> false);
31+
}
32+
33+
@TaskAction
34+
protected void run() {
35+
String version = this.getProject().getVersion().toString();
36+
String branch = this.executeCommand("git", "branch", "--show-current");
37+
String shortCommitHash = this.executeCommand("git", "rev-parse", "--short", "HEAD");
38+
String commitHash = this.executeCommand("git", "rev-parse", "HEAD");
39+
40+
JsonObject object = new JsonObject();
41+
object.addProperty("version", version);
42+
object.addProperty("branch", branch);
43+
object.addProperty("shortCommitHash", shortCommitHash);
44+
object.addProperty("commitHash", commitHash);
45+
46+
try (BufferedWriter writer = Files.newBufferedWriter(this.getOutputFile().getAsFile().get().toPath())) {
47+
GSON.toJson(object, writer);
48+
} catch (IOException e) {
49+
throw new RuntimeException(e);
50+
}
51+
}
52+
53+
private String executeCommand(Object... args) {
54+
ByteArrayOutputStream outputBytes = new ByteArrayOutputStream();
55+
this.getExecOperations().exec(execSpec -> {
56+
execSpec.setStandardOutput(outputBytes);
57+
execSpec.commandLine(args);
58+
}).rethrowFailure();
59+
return outputBytes.toString(StandardCharsets.UTF_8).trim();
60+
}
61+
}

src/main/java/dev/xpple/seedmapper/SeedMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.mojang.brigadier.CommandDispatcher;
44
import dev.xpple.betterconfig.api.ModConfigBuilder;
55
import dev.xpple.seedmapper.command.arguments.SeedResolutionArgument;
6+
import dev.xpple.seedmapper.command.commands.BuildInfoCommand;
67
import dev.xpple.seedmapper.command.commands.CheckSeedCommand;
78
import dev.xpple.seedmapper.command.commands.LocateCommand;
89
import dev.xpple.seedmapper.command.commands.SourceCommand;
@@ -55,5 +56,6 @@ private static void registerCommands(CommandDispatcher<FabricClientCommandSource
5556
LocateCommand.register(dispatcher);
5657
SourceCommand.register(dispatcher);
5758
CheckSeedCommand.register(dispatcher);
59+
BuildInfoCommand.register(dispatcher);
5860
}
5961
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.xpple.seedmapper.command.commands;
2+
3+
import com.mojang.brigadier.Command;
4+
import com.mojang.brigadier.CommandDispatcher;
5+
import dev.xpple.seedmapper.util.BuildInfo;
6+
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
7+
import net.minecraft.network.chat.Component;
8+
9+
import static dev.xpple.seedmapper.util.ChatBuilder.*;
10+
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.*;
11+
12+
public class BuildInfoCommand {
13+
public static void register(CommandDispatcher<FabricClientCommandSource> dispatcher) {
14+
dispatcher.register(literal("sm:buildinfo")
15+
.executes(ctx -> buildInfo(ctx.getSource())));
16+
}
17+
18+
private static int buildInfo(FabricClientCommandSource source) {
19+
source.sendFeedback(Component.translatable("command.buildInfo.success", accent(BuildInfo.VERSION), BuildInfo.BRANCH, BuildInfo.SHORT_COMMIT_HASH));
20+
return Command.SINGLE_SUCCESS;
21+
}
22+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package dev.xpple.seedmapper.util;
2+
3+
import com.google.gson.JsonObject;
4+
import com.google.gson.JsonParser;
5+
import com.mojang.logging.LogUtils;
6+
import net.fabricmc.loader.api.FabricLoader;
7+
import org.slf4j.Logger;
8+
9+
import java.io.BufferedReader;
10+
import java.io.IOException;
11+
import java.nio.file.Files;
12+
13+
public final class BuildInfo {
14+
private BuildInfo() {
15+
}
16+
17+
private static final Logger LOGGER = LogUtils.getLogger();
18+
19+
public static final String VERSION;
20+
public static final String BRANCH;
21+
public static final String SHORT_COMMIT_HASH;
22+
public static final String COMMIT_HASH;
23+
24+
static {
25+
String version, branch, shortCommitHash, commitHash;
26+
version = branch = shortCommitHash = commitHash = "unknown";
27+
try (BufferedReader reader = Files.newBufferedReader(FabricLoader.getInstance()
28+
.getModContainer("seedmapper").orElseThrow()
29+
.findPath("build_info.json").orElseThrow())
30+
) {
31+
JsonObject object = JsonParser.parseReader(reader).getAsJsonObject();
32+
version = object.get("version").getAsString();
33+
branch = object.get("branch").getAsString();
34+
shortCommitHash = object.get("shortCommitHash").getAsString();
35+
commitHash = object.get("commitHash").getAsString();
36+
} catch (RuntimeException | IOException e) {
37+
LOGGER.error("Error while reading build_info.json", e);
38+
}
39+
VERSION = version;
40+
BRANCH = branch;
41+
SHORT_COMMIT_HASH = shortCommitHash;
42+
COMMIT_HASH = commitHash;
43+
}
44+
}

src/main/resources/assets/seedmapper/lang/en_us.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,7 @@
5656
"command.locate.feature.slimeChunk.foundAt": "Slime chunk found at %s (chunk %s).",
5757
"command.locate.feature.slimeChunk.copy": "Click to copy coordinates of this slime chunk",
5858
"command.locate.feature.slimeChunk.copyChunk": "Click to copy chunk coordinates of this slime chunk",
59-
"command.locate.spawn.success": "Spawn point estimated to be at %s."
59+
"command.locate.spawn.success": "Spawn point estimated to be at %s.",
60+
61+
"command.buildInfo.success": "Running SeedMapper on version %s (%s@{%s})."
6062
}

0 commit comments

Comments
 (0)