From c3aea6e305d1f0125d2f22d4500c2f9b0c124a33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net>
Date: Sun, 25 Apr 2021 21:06:07 +0100
Subject: [PATCH] forge-server: Fix issues caused by the installer's
 reproducibility

This seems to mostly be due to mcpatcher patches being not quite
bit-for-bit reproducible. Oh well, at least this derivation should
work now.
---
 pkgs/minecraft/forge-server.nix | 35 +++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/pkgs/minecraft/forge-server.nix b/pkgs/minecraft/forge-server.nix
index 9bb2cdd..f94515a 100644
--- a/pkgs/minecraft/forge-server.nix
+++ b/pkgs/minecraft/forge-server.nix
@@ -13,34 +13,55 @@ let
 
   unpackCmd = "mkdir -p src; cp $curSrc src/forge-${version}-installer.jar";
 
+  nativeBuildInputs = [ jre_headless ];
+
   # Somewhat evil pre-install step to run through the network
   # dependency resolution forge needs. This is also common for gradle
   # projects, so I think this is ok-ish here, though ideally I'd
   # identify all the dependencies and package them as well.
   deps = stdenv.mkDerivation {
     name = "${name}-deps";
-    inherit src unpackCmd;
+    inherit src unpackCmd nativeBuildInputs;
 
-    nativeBuildInputs = [ jre_headless ];
     buildPhase = ''
       java -jar forge-${version}-installer.jar --installServer installation
     '';
     installPhase = ''
       mkdir -p $out
-      cp -r installation/forge-${version}.jar installation/libraries $out
+
+      # The installer will patch the Minecraft server jar in some
+      # fashion, and include it in "libraries". This'd be fine, if the
+      # patch was bit-for-bit reproducible. Sadly it is not, so we
+      # defer this to the *real* package build.
+      rm -r installation/libraries/net/minecraft/
+
+      # The forge installer also insists on re-creating this file.
+      rm installation/libraries/de/oceanlabs/mcp/mcp_config/*/mcp_config-*-mappings.txt
+
+      cp -r installation/* $out
     '';
 
     outputHashAlgo = "sha256";
     outputHashMode = "recursive";
-    outputHash = "lV4UxmSdv/I+HwvnT8CLcHpSKyDvKnldA5/Lw1GsJ/M=";
+    outputHash = "ZRU9ytoF1BXRQ4hx2ehPgqan6vX4l2yomzNDOOWdm0Q=";
   };
 
 in stdenv.mkDerivation rec {
-  inherit name version src unpackCmd;
+  inherit name version src unpackCmd nativeBuildInputs;
+
+  buildPhase = ''
+    mkdir -p installation
+
+    # Take the input deps and patch the Minecraft server jar into our
+    # libraries to create the package.
+    cp -rv ${deps}/* installation/
+    java -jar forge-${version}-installer.jar --offline --installServer installation/
+  '';
 
   installPhase = ''
     mkdir -p $out/{bin,lib/forge}
-    cp -rv ${deps}/* $out/lib/forge/
+
+    cp -r installation/{forge-${version}.jar,libraries} $out/lib/forge/
 
     cat > $out/bin/forge-server << EOF
     #!${runtimeShell}
@@ -81,8 +102,6 @@ in stdenv.mkDerivation rec {
     chmod +x $out/bin/forge-server
   '';
 
-  phases = "installPhase";
-
   meta = with lib; {
     description = "Forge Minecraft Server";
     homepage = "https://files.minecraftforge.net/";