Skip to content

Commit 99a1b10

Browse files
committed
Add support for complex rules in version.json
Fixes older versions where windows/linux used a bumped version of a library while macos used an old version
1 parent 6ce3379 commit 99a1b10

File tree

7 files changed

+84
-77
lines changed

7 files changed

+84
-77
lines changed

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ dependencyResolutionManagement {
3030
library 'utils-download', 'net.minecraftforge', 'download-utils' version '0.3.1'
3131
library 'utils-files', 'net.minecraftforge', 'file-utils' version '0.3.1'
3232
library 'utils-hash', 'net.minecraftforge', 'hash-utils' version '0.1.9'
33-
library 'utils-data', 'net.minecraftforge', 'json-data-utils' version '0.2.3'
33+
library 'utils-data', 'net.minecraftforge', 'json-data-utils' version '0.3.0'
3434
library 'utils-logging', 'net.minecraftforge', 'log-utils' version '0.3.1'
3535
bundle 'utils', ['utils-download', 'utils-files', 'utils-hash', 'utils-data', 'utils-logging']
3636

src/main/java/net/minecraftforge/mcmaven/impl/repo/Repo.java

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.minecraftforge.mcmaven.impl.util.POMBuilder;
1515
import net.minecraftforge.mcmaven.impl.util.Task;
1616
import net.minecraftforge.mcmaven.impl.util.Util;
17+
import net.minecraftforge.util.data.OS;
1718
import net.minecraftforge.util.data.json.JsonData;
1819
import net.minecraftforge.util.file.FileUtils;
1920
import net.minecraftforge.util.hash.HashStore;
@@ -24,8 +25,14 @@
2425
import java.io.IOException;
2526
import java.nio.charset.StandardCharsets;
2627
import java.util.ArrayList;
28+
import java.util.Arrays;
29+
import java.util.Collection;
30+
import java.util.Collections;
31+
import java.util.EnumMap;
32+
import java.util.EnumSet;
2733
import java.util.HashMap;
2834
import java.util.List;
35+
import java.util.Objects;
2936
import java.util.function.Consumer;
3037
import java.util.function.Supplier;
3138

@@ -102,23 +109,27 @@ protected Supplier<GradleModule.Variant[]> simpleVariant(String name, Mappings m
102109
// Classes needs a variant for each OS type so that we can have different natives
103110
protected GradleModule.Variant[] classVariants(Mappings mappings, MCPSide side, Artifact... extraDeps) {
104111
var all = new ArrayList<Artifact>();
105-
var natives = new HashMap<GradleAttributes.OperatingSystemFamily, List<Artifact>>();
112+
var natives = new EnumMap<GradleAttributes.OperatingSystemFamily, List<Artifact>>(GradleAttributes.OperatingSystemFamily.class);
113+
natives.put(GradleAttributes.OperatingSystemFamily.WINDOWS, new ArrayList<>());
114+
natives.put(GradleAttributes.OperatingSystemFamily.MACOS, new ArrayList<>());
115+
natives.put(GradleAttributes.OperatingSystemFamily.LINUX, new ArrayList<>());
106116

107-
for (var artifact : side.getMCLibraries()) {
108-
var variant = GradleAttributes.OperatingSystemFamily.from(artifact.getOs());
109-
if (variant == null)
110-
all.add(artifact);
111-
else
112-
natives.computeIfAbsent(variant, k -> new ArrayList<>()).add(artifact);
113-
}
117+
Consumer<Artifact> addToVariants = artifact -> {
118+
if (artifact == null) return;
114119

115-
for (var artifact : side.getMCPConfigLibraries())
116-
all.add(artifact);
120+
if (GradleAttributes.OperatingSystemFamily.allowsAll(artifact)) {
121+
all.add(artifact);
122+
} else {
123+
for (var os : artifact.getOs()) {
124+
GradleAttributes.OperatingSystemFamily variant = GradleAttributes.OperatingSystemFamily.from(os);
125+
natives.get(variant).add(artifact);
126+
}
127+
}
128+
};
117129

118-
for (var extra : extraDeps) {
119-
if (extra != null)
120-
all.add(extra);
121-
}
130+
side.getMCLibraries().forEach(addToVariants);
131+
side.getMCPConfigLibraries().forEach(addToVariants);
132+
Arrays.asList(extraDeps).forEach(addToVariants);
122133

123134
var java = Util.replace(
124135
JsonData.minecraftVersion(side.getMCP().getMinecraftTasks().versionJson.get()),
@@ -147,12 +158,14 @@ protected GradleModule.Variant[] classVariants(Mappings mappings, MCPSide side,
147158
// Launching the game wouldn't work because of that. If we need a common variant, it would need to include everything
148159
// But since FG7 will never not have the OS attribute, it wouldn't be used anyways.
149160
//variants.add(GradleModule.Variant.of("classes", common));
150-
for (var e : natives.entrySet()) {
151-
var variant = GradleModule.Variant.of("classes-" + e.getKey().getValue(), common);
152-
variant.attribute(e.getKey());
153-
variant.deps(e.getValue());
154-
variants.add(variant);
155-
}
161+
natives.forEach((os, deps) -> {
162+
variants.add(
163+
GradleModule.Variant
164+
.of("classes-" + os.getValue(), common)
165+
.attribute(os)
166+
.deps(deps)
167+
);
168+
});
156169

157170
return variants.toArray(new GradleModule.Variant[0]);
158171
}

src/main/java/net/minecraftforge/mcmaven/impl/repo/forge/ForgeRepo.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.minecraftforge.mcmaven.impl.util.ComparableVersion;
1717
import net.minecraftforge.mcmaven.impl.util.Constants;
1818
import net.minecraftforge.mcmaven.impl.GlobalOptions;
19+
import net.minecraftforge.mcmaven.impl.util.GradleAttributes;
1920
import net.minecraftforge.mcmaven.impl.util.POMBuilder;
2021
import net.minecraftforge.mcmaven.impl.util.Task;
2122
import net.minecraftforge.mcmaven.impl.util.Util;
@@ -244,7 +245,7 @@ private static Task pom(File build, Patcher patcher, String version, Artifact cl
244245
if (mappings != null)
245246
dependencies.add(mappings);
246247

247-
patcher.forAllLibraries(dependencies::add, Artifact::hasNoOs);
248+
patcher.forAllLibraries(dependencies::add, GradleAttributes.OperatingSystemFamily::allowsAll);
248249
});
249250

250251
FileUtils.ensureParent(output);

src/main/java/net/minecraftforge/mcmaven/impl/repo/mcpconfig/MCPConfigRepo.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.minecraftforge.mcmaven.impl.cache.Cache;
1212
import net.minecraftforge.mcmaven.impl.mappings.Mappings;
1313
import net.minecraftforge.mcmaven.impl.util.Artifact;
14+
import net.minecraftforge.mcmaven.impl.util.GradleAttributes;
1415
import net.minecraftforge.mcmaven.impl.util.POMBuilder;
1516
import net.minecraftforge.mcmaven.impl.util.Task;
1617
import net.minecraftforge.mcmaven.impl.util.Util;
@@ -235,7 +236,7 @@ private static Task pom(File build, String side, MCPSide mcpSide, String version
235236
GlobalOptions.assertNotCacheOnly();
236237

237238
var builder = new POMBuilder("net.minecraft", side, version).preferGradleModule().dependencies(dependencies -> {
238-
mcpSide.forAllLibraries(dependencies::add, Artifact::hasNoOs);
239+
mcpSide.forAllLibraries(dependencies::add, GradleAttributes.OperatingSystemFamily::allowsAll);
239240
});
240241

241242
FileUtils.ensureParent(output);

src/main/java/net/minecraftforge/mcmaven/impl/repo/mcpconfig/MCPTaskFactory.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -618,9 +618,7 @@ private File listLibraries(Task jsonTask, File output) {
618618

619619
buf.append("-e=").append(target.getAbsolutePath()).append('\n');
620620

621-
var artifact = Artifact.from(lib.coord);
622-
if (lib.os != null && lib.os != OS.UNKNOWN)
623-
artifact = artifact.withOS(lib.os);
621+
var artifact = Artifact.from(lib.coord).withOS(lib.os);
624622

625623
downloadedLibs.add(new Lib(artifact, target));
626624
cache.add(lib.coord, target);

src/main/java/net/minecraftforge/mcmaven/impl/util/Artifact.java

Lines changed: 29 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.io.File;
1111
import java.io.Serial;
1212
import java.io.Serializable;
13+
import java.util.Arrays;
14+
import java.util.EnumSet;
1315
import java.util.Locale;
1416
import java.util.Objects;
1517
import java.util.regex.Pattern;
@@ -27,8 +29,7 @@ public class Artifact implements Comparable<Artifact>, Serializable {
2729
private final @Nullable String version;
2830
private final @Nullable String classifier;
2931
private final String ext;
30-
private final OS os;
31-
private final Arch arch;
32+
private final EnumSet<OS> os;
3233

3334
// Cached after building the first time we're asked
3435
// Transient field so these aren't serialized
@@ -58,7 +59,7 @@ public static Artifact from(String descriptor) {
5859
* @return The created artifact
5960
*/
6061
public static Artifact from(String group, String name, String version) {
61-
return new Artifact(group, name, version, null, null, OS.UNKNOWN, Arch.UNKNOWN);
62+
return new Artifact(group, name, version, null, null, OS.UNKNOWN);
6263
}
6364

6465
/**
@@ -71,7 +72,7 @@ public static Artifact from(String group, String name, String version) {
7172
* @return The created artifact
7273
*/
7374
public static Artifact from(String group, String name, String version, @Nullable String classifier) {
74-
return new Artifact(group, name, version, classifier, null, OS.UNKNOWN, Arch.UNKNOWN);
75+
return new Artifact(group, name, version, classifier, null, OS.UNKNOWN);
7576
}
7677

7778
/**
@@ -85,7 +86,7 @@ public static Artifact from(String group, String name, String version, @Nullable
8586
* @return The created artifact
8687
*/
8788
public static Artifact from(String group, String name, String version, @Nullable String classifier, @Nullable String ext) {
88-
return new Artifact(group, name, version, classifier, ext, OS.UNKNOWN, Arch.UNKNOWN);
89+
return new Artifact(group, name, version, classifier, ext, OS.UNKNOWN);
8990
}
9091

9192
private Artifact(String descriptor) {
@@ -106,44 +107,24 @@ private Artifact(String descriptor) {
106107

107108
this.version = pts.length > 2 ? pts[2] : null;
108109
this.classifier = pts.length > 3 ? pts[3] : null;
109-
this.os = this.classifier != null ? findOS(this.classifier) : OS.UNKNOWN;
110-
this.arch = this.classifier != null ? findArch(this.classifier) : Arch.UNKNOWN;
110+
this.os = EnumSet.noneOf(OS.class);
111111
}
112112

113-
private Artifact(String group, String name, String version, @Nullable String classifier, @Nullable String ext, OS os, Arch arch) {
113+
private Artifact(String group, String name, String version, @Nullable String classifier, @Nullable String ext, OS os) {
114+
this(group, name, version, classifier, ext, os, new OS[0]);
115+
}
116+
117+
private Artifact(String group, String name, String version, @Nullable String classifier, @Nullable String ext, OS osFirst, OS... osRest) {
118+
this(group, name, version, classifier, ext, EnumSet.of(osFirst, osRest));
119+
}
120+
121+
private Artifact(String group, String name, String version, @Nullable String classifier, @Nullable String ext, EnumSet<OS> os) {
114122
this.group = group;
115123
this.name = name;
116124
this.version = version;
117125
this.classifier = classifier;
118126
this.ext = Objects.requireNonNullElse(ext, "jar");
119-
this.os = os == OS.UNKNOWN && classifier != null ? findOS(classifier) : os;
120-
this.arch = arch == Arch.UNKNOWN && classifier != null ? findArch(classifier) : arch;
121-
}
122-
123-
private static OS findOS(String classifier) {
124-
for (var s : classifier.split("-")) {
125-
if (s.isBlank()) continue;
126-
127-
var osCandidate = OS.byName(s);
128-
if (osCandidate != OS.UNKNOWN) {
129-
return osCandidate;
130-
}
131-
}
132-
133-
return OS.UNKNOWN;
134-
}
135-
136-
private static Arch findArch(String classifier) {
137-
for (var s : classifier.split("-")) {
138-
if (s.isBlank()) continue;
139-
140-
var archCandidate = Arch.byName(s);
141-
if (archCandidate != Arch.UNKNOWN) {
142-
return archCandidate;
143-
}
144-
}
145-
146-
return Arch.UNKNOWN;
127+
this.os = os;
147128
}
148129

149130
/**
@@ -215,18 +196,13 @@ public String getExtension() {
215196
return ext;
216197
}
217198

218-
/** @return The os of this artifact (defaults to {@link OS#UNKNOWN}) */
219-
public OS getOs() {
199+
public EnumSet<OS> getOs() {
220200
return os;
221201
}
222202

223-
public boolean hasNoOs() {
224-
return this.os == OS.UNKNOWN;
225-
}
226-
227-
/** @return The arch of this artifact (defaults to {@link Arch#UNKNOWN}) */
228-
public Arch getArch() {
229-
return arch;
203+
/** @return The os of this artifact (defaults to {@link OS#UNKNOWN}) */
204+
public boolean allowsOS(OS os) {
205+
return this.os.isEmpty() || this.os.contains(os);
230206
}
231207

232208
/** @return The file name of this artifact */
@@ -259,23 +235,25 @@ public boolean isSnapshot() {
259235
* @return The new artifact
260236
*/
261237
public Artifact withVersion(String version) {
262-
return new Artifact(group, name, version, classifier, ext, os, arch);
238+
return new Artifact(group, name, version, classifier, ext, os);
263239
}
264240

265241
public Artifact withClassifier(String classifier) {
266-
return new Artifact(group, name, version, classifier, ext, os, arch);
242+
return new Artifact(group, name, version, classifier, ext, os);
267243
}
268244

269245
public Artifact withExtension(String ext) {
270-
return new Artifact(group, name, version, classifier, ext, os, arch);
246+
return new Artifact(group, name, version, classifier, ext, os);
271247
}
272248

273249
public Artifact withOS(OS os) {
274-
return new Artifact(group, name, version, classifier, ext, os, arch);
250+
var osSet = EnumSet.copyOf(this.os);
251+
osSet.add(os);
252+
return new Artifact(group, name, version, classifier, ext, osSet);
275253
}
276254

277-
public Artifact withArch(Arch arch) {
278-
return new Artifact(group, name, version, classifier, ext, os, arch);
255+
public Artifact withOS(EnumSet<OS> os) {
256+
return new Artifact(group, name, version, classifier, ext, os);
279257
}
280258

281259
@Override

src/main/java/net/minecraftforge/mcmaven/impl/util/GradleAttributes.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,21 @@ public String getValue() {
3232
case null, default -> null;
3333
};
3434
}
35+
36+
public OS toOS() {
37+
return switch (this) {
38+
case WINDOWS -> OS.WINDOWS;
39+
case MACOS -> OS.MACOS;
40+
case LINUX -> OS.LINUX;
41+
};
42+
}
43+
44+
public static boolean allowsAll(Artifact artifact) {
45+
for (var os : OperatingSystemFamily.values()) {
46+
if (!artifact.allowsOS(os.toOS())) return false;
47+
}
48+
49+
return true;
50+
}
3551
}
3652
}

0 commit comments

Comments
 (0)