From b7a08af91904b2de1adba04a59dabb5b081a0774 Mon Sep 17 00:00:00 2001
From: asie <kontakt@asie.pl>
Date: Sat, 27 Apr 2019 08:32:30 +0200
Subject: [PATCH] add better registry error logging

---
 .../mixin/registry/MixinIdRegistry.java       | 42 +++++++++++++++----
 1 file changed, 35 insertions(+), 7 deletions(-)

diff --git a/fabric-registry-sync/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java b/fabric-registry-sync/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
index b495147fd..e6e46d8a0 100644
--- a/fabric-registry-sync/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
+++ b/fabric-registry-sync/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
@@ -94,16 +94,44 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab
 		switch (mode) {
 			case AUTHORITATIVE:
 				break;
-			case REMOTE:
-				if (!registry.getIds().containsAll(remoteIndexedEntries.keySet())) {
-					throw new RemapException("Received ID map contains IDs unknown to the receiver!");
+			case REMOTE: {
+				List<String> strings = new ArrayList<>();
+				for (Identifier remoteId : remoteIndexedEntries.keySet()) {
+					if (!registry.getIds().contains(remoteId)) {
+						strings.add(" - " + remoteId);
+					}
 				}
-				break;
-			case EXACT:
+
+				if (!strings.isEmpty()) {
+					StringBuilder builder = new StringBuilder("Received ID map contains IDs unknown to the receiver!");
+					for (String s : strings) {
+						builder.append('\n').append(s);
+					}
+					throw new RemapException(builder.toString());
+				}
+			} break;
+			case EXACT: {
 				if (!registry.getIds().equals(remoteIndexedEntries.keySet())) {
-					throw new RemapException("Local and remote ID sets do not match!");
+					List<String> strings = new ArrayList<>();
+					for (Identifier remoteId : remoteIndexedEntries.keySet()) {
+						if (!registry.getIds().contains(remoteId)) {
+							strings.add(" - " + remoteId + " (missing on local)");
+						}
+					}
+
+					for (Identifier localId : registry.getIds()) {
+						if (!remoteIndexedEntries.keySet().contains(localId)) {
+							strings.add(" - " + localId + " (missing on remote)");
+						}
+					}
+
+					StringBuilder builder = new StringBuilder("Local and remote ID sets do not match!");
+					for (String s : strings) {
+						builder.append('\n').append(s);
+					}
+					throw new RemapException(builder.toString());
 				}
-				break;
+			} break;
 		}
 
 		// Make a copy of the previous maps.