Skip to content

Commit 6639464

Browse files
authored
Display official license in the warning & add a task to 'hide' it (#760)
1 parent d77ec93 commit 6639464

File tree

3 files changed

+173
-21
lines changed

3 files changed

+173
-21
lines changed

src/common/java/net/minecraftforge/gradle/common/util/MojangLicenseHelper.java

Lines changed: 129 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,141 @@
2020

2121
package net.minecraftforge.gradle.common.util;
2222

23+
import java.io.File;
24+
import java.io.IOException;
25+
import java.nio.file.Files;
26+
import java.nio.file.Path;
27+
import java.util.Objects;
28+
import java.util.Optional;
29+
import java.util.function.Predicate;
30+
import java.util.regex.Pattern;
31+
import java.util.stream.Collectors;
32+
import javax.annotation.Nullable;
33+
2334
import org.gradle.api.Project;
2435

2536
public class MojangLicenseHelper {
26-
//TODO: Add a task that people can run to quiet this warning.
27-
//Also output the specific text from the targeted MC version.
37+
38+
public static final String HIDE_LICENSE = "hideOfficialWarningUntilChanged";
39+
public static final String SHOW_LICENSE = "reshowOfficialWarning";
40+
41+
/**
42+
* @see #displayWarning(Project, String, String)
43+
*/
44+
@Deprecated
2845
public static void displayWarning(Project project, String channel) {
46+
displayWarning(project, channel, null);
47+
}
48+
49+
public static void displayWarning(Project project, String channel, @Nullable String version, @Nullable String updateChannel, @Nullable String updateVersion) {
50+
displayWarning(project, channel, version);
51+
52+
if (updateChannel == null || Objects.equals(channel, updateChannel)) return;
53+
54+
displayWarning(project, updateChannel, updateVersion);
55+
}
56+
57+
public static void displayWarning(Project project, String channel, @Nullable String version) {
2958
if ("official".equals(channel)) {
30-
String warning = "WARNING: "
31-
+ "This project is configured to use the official obfuscation mappings provided by Mojang. "
32-
+ "These mapping fall under their associated license, you should be fully aware of this license. "
33-
+ "For the latest license text, refer to the mapping file itself, or the reference copy here: "
34-
+ "https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md";
59+
Optional<String> license = version != null ? getOfficialLicense(project, version) : Optional.empty();
60+
Optional<String> licenseHash = license.map(HashFunction.SHA1::hash);
61+
62+
if (license.isPresent() && isHidden(project, licenseHash.get())) return;
63+
64+
String warning = getWarning(license.orElse(null));
65+
3566
project.getLogger().warn(warning);
67+
license.map(s -> "WARNING: " + s).ifPresent(project.getLogger()::warn);
68+
}
69+
}
70+
71+
public static void hide(Project project, String channel, String version) {
72+
if (!"official".equals(channel)) return;
73+
74+
String hash = getOfficialLicense(project, version)
75+
.map(HashFunction.SHA1::hash)
76+
.orElseThrow(() -> new IllegalStateException("Could not get Mojang license text for " + version));
77+
78+
Path accepted = getLicensePath(project, hash);
79+
80+
if (Files.exists(accepted)) return;
81+
82+
try {
83+
Utils.createEmpty(accepted.toFile());
84+
85+
String warning = "WARNING: These warnings will not be shown again until the license changes "
86+
+ "or the task `{TASK}` is run.";
87+
88+
project.getLogger().warn(warning.replace("{TASK}", SHOW_LICENSE));
89+
} catch (IOException exception) {
90+
project.getLogger().error("Could not accept Mojang license", exception);
91+
}
92+
}
93+
94+
public static void show(Project project, String channel, String version) {
95+
if (!"official".equals(channel)) return;
96+
97+
String hash = getOfficialLicense(project, version)
98+
.map(HashFunction.SHA1::hash)
99+
.orElseThrow(() -> new IllegalStateException("Could not get Mojang license text for " + version));
100+
101+
Path accepted = getLicensePath(project, hash);
102+
103+
Utils.delete(accepted.toFile());
104+
}
105+
106+
private static String getWarning(String license) {
107+
String warning = "WARNING: "
108+
+ "This project is configured to use the official obfuscation mappings provided by Mojang. "
109+
+ "These mapping fall under their associated license, you should be fully aware of this license. "
110+
+ "For the latest license text, refer {REFER}, or the reference copy here: "
111+
+ "https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md"
112+
+ ", You can hide this warning by running the `{TASK}` task";
113+
114+
return warning
115+
.replace("{REFER}", license != null ? "below" : "to the mapping file itself")
116+
.replace("{TASK}", HIDE_LICENSE);
117+
}
118+
119+
private static boolean isHidden(Project project, String hash) {
120+
return Files.exists(getLicensePath(project, hash));
121+
}
122+
123+
private static Optional<String> getOfficialLicense(Project project, String version) {
124+
String minecraftVersion = getMinecraftVersion(version);
125+
String artifact = "net.minecraft:client:" + minecraftVersion + ":mappings@txt";
126+
127+
File client = MavenArtifactDownloader.generate(project, artifact, true);
128+
129+
if (client == null) return Optional.empty();
130+
131+
try {
132+
return Optional.of(
133+
Files.lines(client.toPath())
134+
.filter(line -> line.startsWith("#")) // Only Comments
135+
.map(l -> l.substring(1).trim()) // Remove initial #
136+
.collect(Collectors.joining("\n")) // Join via \n
137+
);
138+
} catch (IOException e) {
139+
e.printStackTrace();
36140
}
141+
142+
return Optional.empty();
143+
}
144+
145+
private static Path getLicensePath(Project project, String hash) {
146+
return new File(Utils.getCache(project, "licenses"), hash + ".marker").toPath();
147+
}
148+
149+
private static final Predicate<String> MCP_CONFIG_TIMESTAMP = Pattern.compile("\\d{8}\\.\\d{6}").asPredicate();
150+
151+
private static String getMinecraftVersion(String version) {
152+
int idx = version.lastIndexOf('-');
153+
154+
if (idx != -1 && MCP_CONFIG_TIMESTAMP.test(version.substring(idx + 1))) {
155+
version = version.substring(0, idx);
156+
}
157+
158+
return version;
37159
}
38160
}

src/patcher/java/net/minecraftforge/gradle/patcher/PatcherPlugin.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ public void apply(@Nonnull Project project) {
127127
TaskProvider<Jar> userdevJar = project.getTasks().register("userdevJar", Jar.class);
128128
TaskProvider<TaskGenerateUserdevConfig> userdevConfig = project.getTasks().register("userdevConfig", TaskGenerateUserdevConfig.class, project);
129129
TaskProvider<DefaultTask> release = project.getTasks().register("release", DefaultTask.class);
130+
TaskProvider<DefaultTask> hideLicense = project.getTasks().register(MojangLicenseHelper.HIDE_LICENSE, DefaultTask.class);
131+
TaskProvider<DefaultTask> showLicense = project.getTasks().register(MojangLicenseHelper.SHOW_LICENSE, DefaultTask.class);
130132

131133
//Add Known repos
132134
project.getRepositories().maven(e -> {
@@ -146,6 +148,18 @@ public void apply(@Nonnull Project project) {
146148
e.metadataSources(MetadataSources::artifact);
147149
});
148150

151+
hideLicense.configure(task -> {
152+
task.doLast(_task -> {
153+
MojangLicenseHelper.hide(project, extension.getMappingChannel(), extension.getMappingVersion());
154+
});
155+
});
156+
157+
showLicense.configure(task -> {
158+
task.doLast(_task -> {
159+
MojangLicenseHelper.show(project, extension.getMappingChannel(), extension.getMappingVersion());
160+
});
161+
});
162+
149163
release.configure(task -> {
150164
task.dependsOn(sourcesJar, universalJar, userdevJar);
151165
});
@@ -301,13 +315,13 @@ public void apply(@Nonnull Project project) {
301315
});
302316

303317
final boolean doingUpdate = project.hasProperty("UPDATE_MAPPINGS");
318+
final String updateVersion = doingUpdate ? (String)project.property("UPDATE_MAPPINGS") : null;
319+
final String updateChannel = doingUpdate
320+
? (project.hasProperty("UPDATE_MAPPINGS_CHANNEL") ? (String)project.property("UPDATE_MAPPINGS_CHANNEL") : "snapshot")
321+
: null;
304322
if (doingUpdate) {
305-
String version = (String) project.property("UPDATE_MAPPINGS");
306-
String channel = project.hasProperty("UPDATE_MAPPINGS_CHANNEL") ? (String) project.property("UPDATE_MAPPINGS_CHANNEL") : "snapshot";
307-
MojangLicenseHelper.displayWarning(project, channel);
308-
309323
TaskProvider<DownloadMCPMappingsTask> dlMappingsNew = project.getTasks().register("downloadMappingsNew", DownloadMCPMappingsTask.class);
310-
dlMappingsNew.get().setMappings(channel + '_' + version);
324+
dlMappingsNew.get().setMappings(updateChannel + '_' + updateVersion);
311325

312326
TaskProvider<TaskApplyMappings> toMCPNew = project.getTasks().register("srg2mcpNew", TaskApplyMappings.class);
313327
toMCPNew.configure(task -> {
@@ -370,7 +384,7 @@ public void apply(@Nonnull Project project) {
370384
PatcherPlugin patcher = extension.parent.getPlugins().findPlugin(PatcherPlugin.class);
371385

372386
if (mcp != null) {
373-
MojangLicenseHelper.displayWarning(p, extension.getMappingChannel());
387+
MojangLicenseHelper.displayWarning(p, extension.getMappingChannel(), extension.getMappingVersion(), updateChannel, updateVersion);
374388
SetupMCPTask setupMCP = (SetupMCPTask) tasks.getByName("setupMCP");
375389

376390
if (procConfig != null) {

src/userdev/java/net/minecraftforge/gradle/userdev/UserDevPlugin.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,20 @@ public void apply(@Nonnull Project project) {
126126
TaskProvider<DownloadMCMeta> downloadMCMeta = project.getTasks().register("downloadMCMeta", DownloadMCMeta.class);
127127
TaskProvider<ExtractNatives> extractNatives = project.getTasks().register("extractNatives", ExtractNatives.class);
128128
TaskProvider<DownloadAssets> downloadAssets = project.getTasks().register("downloadAssets", DownloadAssets.class);
129+
TaskProvider<DefaultTask> hideLicense = project.getTasks().register(MojangLicenseHelper.HIDE_LICENSE, DefaultTask.class);
130+
TaskProvider<DefaultTask> showLicense = project.getTasks().register(MojangLicenseHelper.SHOW_LICENSE, DefaultTask.class);
131+
132+
hideLicense.configure(task -> {
133+
task.doLast(_task -> {
134+
MojangLicenseHelper.hide(project, extension.getMappingChannel(), extension.getMappingVersion());
135+
});
136+
});
137+
138+
showLicense.configure(task -> {
139+
task.doLast(_task -> {
140+
MojangLicenseHelper.show(project, extension.getMappingChannel(), extension.getMappingVersion());
141+
});
142+
});
129143

130144
extractSrg.configure(task -> {
131145
task.dependsOn(downloadMcpConfig);
@@ -158,12 +172,13 @@ public void apply(@Nonnull Project project) {
158172
task.setMeta(downloadMCMeta.get().getOutput());
159173
});
160174

161-
if (project.hasProperty("UPDATE_MAPPINGS")) {
162-
String version = (String)project.property("UPDATE_MAPPINGS");
163-
String channel = project.hasProperty("UPDATE_MAPPINGS_CHANNEL") ? (String)project.property("UPDATE_MAPPINGS_CHANNEL") : "snapshot";
164-
175+
final boolean doingUpdate = project.hasProperty("UPDATE_MAPPINGS");
176+
final String updateVersion = doingUpdate ? (String)project.property("UPDATE_MAPPINGS") : null;
177+
final String updateChannel = doingUpdate
178+
? (project.hasProperty("UPDATE_MAPPINGS_CHANNEL") ? (String)project.property("UPDATE_MAPPINGS_CHANNEL") : "snapshot")
179+
: null;
180+
if (doingUpdate) {
165181
logger.lifecycle("This process uses Srg2Source for java source file renaming. Please forward relevant bug reports to https://github.com/MinecraftForge/Srg2Source/issues.");
166-
MojangLicenseHelper.displayWarning(project, channel);
167182

168183
JavaCompile javaCompile = (JavaCompile) project.getTasks().getByName("compileJava");
169184
JavaPluginConvention javaConv = (JavaPluginConvention) project.getConvention().getPlugins().get("java");
@@ -188,7 +203,7 @@ public void apply(@Nonnull Project project) {
188203
});
189204

190205
dlMappingsNew.configure(task -> {
191-
task.setMappings(channel + "_" + version);
206+
task.setMappings(updateChannel + "_" + updateVersion);
192207
task.setOutput(project.file("build/mappings_new.zip"));
193208
});
194209

@@ -209,8 +224,6 @@ public void apply(@Nonnull Project project) {
209224
}
210225

211226
project.afterEvaluate(p -> {
212-
MojangLicenseHelper.displayWarning(p, extension.getMappingChannel());
213-
214227
MinecraftUserRepo mcrepo = null;
215228
DeobfuscatingRepo deobfrepo = null;
216229

@@ -260,6 +273,9 @@ public void apply(@Nonnull Project project) {
260273
.add(MCPRepo.create(project))
261274
.add(MinecraftRepo.create(project)) //Provides vanilla extra/slim/data jars. These don't care about OBF names.
262275
.attach(project);
276+
277+
MojangLicenseHelper.displayWarning(p, extension.getMappingChannel(), extension.getMappingVersion(), updateChannel, updateVersion);
278+
263279
project.getRepositories().maven(e -> {
264280
e.setUrl(Utils.MOJANG_MAVEN);
265281
e.metadataSources(MetadataSources::artifact);

0 commit comments

Comments
 (0)