From 66b247bbd81b7067e699b7c2b2da1e7a7988dd48 Mon Sep 17 00:00:00 2001 From: zeng-github01 <95841646+zeng-github01@users.noreply.github.com> Date: Fri, 1 May 2026 02:29:33 +0800 Subject: [PATCH 1/2] Update Gradle to 4.10 --- gradle/wrapper/gradle-wrapper.jar | Bin 50514 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 78 ++++++++++-------- gradlew.bat | 14 +--- .../minecraftforge/gradle/ZipFileTree.java | 11 +++ .../gradle/common/BasePlugin.java | 2 +- .../gradle/common/Constants.java | 2 +- .../gradle/user/UserBasePlugin.java | 61 +++++--------- 8 files changed, 80 insertions(+), 91 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 667288ad6c2b3b87c990ece1267e56f0bcbf3622..f6b961fd5a86aa5fbfe90f707c3138408be7c718 100644 GIT binary patch delta 47173 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 QNOR~y#*1B$r%+J;55jK8!2kdN delta 43282 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 Vzj>9y!Lh^sEV1F>CM$2g{U7mMXlMWc diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3499e0b85..115e6ac0a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue Oct 29 18:00:54 CDT 2013 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https://github.com/gradle/gradle-distributions/releases/download/v1.8.0/gradle-1.8-bin.zip diff --git a/gradlew b/gradlew index 91a7e269e..cccdd3d51 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,20 +6,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -154,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282aa..f9553162f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/src/main/java/net/minecraftforge/gradle/ZipFileTree.java b/src/main/java/net/minecraftforge/gradle/ZipFileTree.java index c3ab7e3be..19f0ff5e5 100644 --- a/src/main/java/net/minecraftforge/gradle/ZipFileTree.java +++ b/src/main/java/net/minecraftforge/gradle/ZipFileTree.java @@ -36,6 +36,7 @@ import org.gradle.api.file.FileVisitDetails; import org.gradle.api.file.FileVisitor; import org.gradle.api.file.RelativePath; +import org.gradle.api.internal.file.FileSystemSubset; import org.gradle.api.internal.file.collections.MinimalFileTree; import org.gradle.util.DeprecationLogger; import org.gradle.util.GFileUtils; @@ -109,6 +110,16 @@ public void visit(FileVisitor visitor) } } + @Override + public void registerWatchPoints(FileSystemSubset.Builder builder) { + + } + + @Override + public void visitTreeOrBackingFile(FileVisitor fileVisitor) { + + } + private class DetailsImpl implements FileVisitDetails { private final ZipEntry entry; diff --git a/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java b/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java index e68879d17..3c182083e 100644 --- a/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java +++ b/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java @@ -63,7 +63,7 @@ public final void apply(Project arg) @Override public void execute(Project proj) { - addMavenRepo(proj, "forge", "http://files.minecraftforge.net/maven"); + addMavenRepo(proj, "forge", "https://files.minecraftforge.net/maven"); proj.getRepositories().mavenCentral(); addMavenRepo(proj, "minecraft", Constants.LIBRARY_URL); } diff --git a/src/main/java/net/minecraftforge/gradle/common/Constants.java b/src/main/java/net/minecraftforge/gradle/common/Constants.java index 552a77611..97ff3014a 100644 --- a/src/main/java/net/minecraftforge/gradle/common/Constants.java +++ b/src/main/java/net/minecraftforge/gradle/common/Constants.java @@ -65,7 +65,7 @@ public String toString() public static final String MCP_URL = "http://files.minecraftforge.net/fernflower_temporary.zip"; public static final String ASSETS_URL = "http://resources.download.minecraft.net"; public static final String LIBRARY_URL = "https://libraries.minecraft.net/"; - public static final String ASSETS_INDEX_URL = "https://s3.amazonaws.com/Minecraft.Download/indexes/{ASSET_INDEX}.json"; + public static final String ASSETS_INDEX_URL = "http://s3.amazonaws.com/Minecraft.Download/indexes/{ASSET_INDEX}.json"; public static final String LOG = ".gradle/gradle.log"; public static final String ASSETS_INDEX = "legacy"; diff --git a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java index 29c118af6..f36c20442 100644 --- a/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java +++ b/src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java @@ -58,14 +58,9 @@ import net.minecraftforge.gradle.tasks.user.SourceCopyTask; import net.minecraftforge.gradle.tasks.user.reobf.ArtifactSpec; import net.minecraftforge.gradle.tasks.user.reobf.ReobfTask; +import org.gradle.api.*; -import org.gradle.api.Action; -import org.gradle.api.DefaultTask; -import org.gradle.api.Project; -import org.gradle.api.Task; -import org.gradle.api.XmlProvider; import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.Configuration.State; import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.execution.TaskExecutionGraph; import org.gradle.api.internal.plugins.DslObject; @@ -78,7 +73,6 @@ import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.javadoc.Javadoc; import org.gradle.api.tasks.scala.ScalaCompile; -import org.gradle.listener.ActionBroadcast; import org.gradle.plugins.ide.eclipse.model.Classpath; import org.gradle.plugins.ide.eclipse.model.ClasspathEntry; import org.gradle.plugins.ide.eclipse.model.EclipseModel; @@ -409,19 +403,14 @@ protected void configureEclipse() eclipseConv.getClasspath().setDownloadJavadoc(true); eclipseConv.getClasspath().setDownloadSources(true); - ((ActionBroadcast) eclipseConv.getClasspath().getFile().getWhenMerged()).add(new Action() - { + eclipseConv.getClasspath().getFile().whenMerged(new Action() { @Override - public void execute(Classpath classpath) - { + public void execute(Classpath classpath) { String natives = delayedString(NATIVES_DIR).call().replace('\\', '/'); - for (ClasspathEntry e : classpath.getEntries()) - { - if (e instanceof Library) - { + for (ClasspathEntry e : classpath.getEntries()) { + if (e instanceof Library) { Library lib = (Library) e; - if (lib.getPath().contains("lwjg") || lib.getPath().contains("jinput")) - { + if (lib.getPath().contains("lwjg") || lib.getPath().contains("jinput")) { lib.setNativeLibraryLocation(natives); } } @@ -829,20 +818,14 @@ public void afterEvaluate() // link sources and javadocs eclipse EclipseModel eclipseConv = (EclipseModel) project.getExtensions().getByName("eclipse"); - ((ActionBroadcast) eclipseConv.getClasspath().getFile().getWhenMerged()).add(new Action() - { - FileReferenceFactory factory = new FileReferenceFactory(); - + eclipseConv.getClasspath().getFile().whenMerged(new Action() { + final FileReferenceFactory factory = new FileReferenceFactory(); @Override - public void execute(Classpath classpath) - { - for (ClasspathEntry e : classpath.getEntries()) - { - if (e instanceof Library) - { + public void execute(Classpath classpath) { + for (ClasspathEntry e : classpath.getEntries()) { + if (e instanceof Library) { Library lib = (Library) e; - if (lib.getLibrary().getFile().equals(deobfOut)) - { + if (lib.getLibrary().getFile().equals(deobfOut)) { lib.setJavadocPath(factory.fromFile(project.getConfigurations().getByName(CONFIG_API_JAVADOCS).getSingleFile())); lib.setSourcePath(factory.fromFile(project.getConfigurations().getByName(CONFIG_API_SRC).getSingleFile())); } @@ -853,20 +836,14 @@ public void execute(Classpath classpath) // link sources and javadocs ntellij idea IdeaModel ideaConv = (IdeaModel) project.getExtensions().getByName("idea"); - ((ActionBroadcast) ideaConv.getModule().getIml().getWhenMerged()).add(new Action() { - + ideaConv.getModule().getIml().whenMerged(new Action() { PathFactory factory = new PathFactory(); - @Override - public void execute(Module module) - { - for (Dependency d : module.getDependencies()) - { - if (d instanceof SingleEntryModuleLibrary) - { + public void execute(Module module) { + for (Dependency d : module.getDependencies()) { + if (d instanceof SingleEntryModuleLibrary) { SingleEntryModuleLibrary lib = (SingleEntryModuleLibrary) d; - if (lib.getLibraryFile().equals(deobfOut)) - { + if (lib.getLibraryFile().equals(deobfOut)) { lib.getJavadoc().add(factory.path("jar://" + project.getConfigurations().getByName(CONFIG_API_JAVADOCS).getSingleFile().getAbsolutePath().replace('\\', '/') + "!/")); lib.getSources().add(factory.path("jar://" + project.getConfigurations().getByName(CONFIG_API_SRC).getSingleFile().getAbsolutePath().replace('\\', '/') + "!/")); } @@ -945,7 +922,7 @@ private void readAndApplyJson(File file, String depConfig, String nativeConfig, DependencyHandler handler = project.getDependencies(); // actual dependencies - if (project.getConfigurations().getByName(depConfig).getState() == State.UNRESOLVED) + if (project.getConfigurations().getByName(depConfig).getState() == Configuration.State.UNRESOLVED) { for (net.minecraftforge.gradle.common.version.Library lib : version.getLibraries()) { @@ -957,7 +934,7 @@ private void readAndApplyJson(File file, String depConfig, String nativeConfig, log.info("RESOLVED: " + depConfig); // the natives - if (project.getConfigurations().getByName(nativeConfig).getState() == State.UNRESOLVED) + if (project.getConfigurations().getByName(nativeConfig).getState() == Configuration.State.UNRESOLVED) { for (net.minecraftforge.gradle.common.version.Library lib : version.getLibraries()) { From 50b129df91eb989bfb47f6030356c9ceb5d41cf8 Mon Sep 17 00:00:00 2001 From: zeng-github01 <95841646+zeng-github01@users.noreply.github.com> Date: Sat, 2 May 2026 00:53:06 +0800 Subject: [PATCH 2/2] Fix getAssetsIndex task --- .../net/minecraftforge/gradle/FileUtils.java | 31 ++++ .../gradle/common/BasePlugin.java | 149 ++++++++++++--- .../gradle/common/Constants.java | 169 ++++++++---------- .../gradle/common/version/Version.java | 3 + .../common/version/json/JsonFactory.java | 8 + .../gradle/json/MCVersionManifest.java | 32 ++++ .../gradle/json/version/Downloads.java | 14 ++ .../gradle/json/version/VersionToString.java | 7 + .../gradle/tasks/GenSrgTask.java | 6 + .../tasks/abstractutil/EtagDownloadTask.java | 137 ++++++++++++++ .../gradle/tasks/dev/ObfuscateTask.java | 3 +- 11 files changed, 436 insertions(+), 123 deletions(-) create mode 100644 src/main/java/net/minecraftforge/gradle/FileUtils.java create mode 100644 src/main/java/net/minecraftforge/gradle/json/MCVersionManifest.java create mode 100644 src/main/java/net/minecraftforge/gradle/json/version/Downloads.java create mode 100644 src/main/java/net/minecraftforge/gradle/json/version/VersionToString.java create mode 100644 src/main/java/net/minecraftforge/gradle/tasks/abstractutil/EtagDownloadTask.java diff --git a/src/main/java/net/minecraftforge/gradle/FileUtils.java b/src/main/java/net/minecraftforge/gradle/FileUtils.java new file mode 100644 index 000000000..cbae3c53b --- /dev/null +++ b/src/main/java/net/minecraftforge/gradle/FileUtils.java @@ -0,0 +1,31 @@ +package net.minecraftforge.gradle; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Objects; + +public class FileUtils { + public static String readString(File file) throws IOException { + return readString(file, StandardCharsets.UTF_8); + } + + public static String readString(File file, Charset charset) throws IOException { + return new String(Files.readAllBytes(file.toPath()), charset); + } + + public static void updateDate(File file) throws IOException { + if (!file.createNewFile() && !file.setLastModified(System.currentTimeMillis())) { + throw new IOException("Unable to update modification time of " + file); + } + } + + public static String getFileExtension(String fullName) { + Objects.requireNonNull(fullName); + String fileName = new File(fullName).getName(); + int dotIndex = fileName.lastIndexOf('.'); + return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1); + } +} diff --git a/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java b/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java index 3c182083e..c7879d295 100644 --- a/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java +++ b/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java @@ -4,7 +4,11 @@ import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.HashMap; +import java.util.List; +import java.util.function.Function; import net.minecraftforge.gradle.FileLogListenner; import net.minecraftforge.gradle.common.version.AssetIndex; @@ -14,10 +18,13 @@ import net.minecraftforge.gradle.delayed.DelayedFile; import net.minecraftforge.gradle.delayed.DelayedFileTree; import net.minecraftforge.gradle.delayed.DelayedString; +import net.minecraftforge.gradle.json.MCVersionManifest; +import net.minecraftforge.gradle.json.version.VersionToString; import net.minecraftforge.gradle.tasks.DownloadAssetsTask; import net.minecraftforge.gradle.tasks.ObtainFernFlowerTask; import net.minecraftforge.gradle.tasks.abstractutil.DownloadTask; +import net.minecraftforge.gradle.tasks.abstractutil.EtagDownloadTask; import org.gradle.api.Action; import org.gradle.api.DefaultTask; import org.gradle.api.Plugin; @@ -129,16 +136,108 @@ private void makeObtainTasks() // download tasks DownloadTask task; + EtagDownloadTask etagDlTask; + etagDlTask = makeTask("getVersionJsonIndex", EtagDownloadTask.class); + { + etagDlTask.setUri(delayedString(Constants.MC_JSON_INDEX_URL)); + etagDlTask.setFile(delayedFile(Constants.VERSION_JSON_INDEX)); + etagDlTask.setDieWithError(false); + } + + etagDlTask = makeTask("getVersionJson", EtagDownloadTask.class); + { + class GetVersionJsonUrl extends DelayedString { + public GetVersionJsonUrl() { + super(BasePlugin.this.project, ""); + } + + @Override + public String call() { + try { + MCVersionManifest manifest = JsonFactory.loadMCVersionManifest(delayedFile(Constants.VERSION_JSON_INDEX).call()); + MCVersionManifest.Version version = manifest.findVersion(delayedString("{MC_VERSION}").call()); + return version.url; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + etagDlTask.dependsOn("getVersionJsonIndex"); + etagDlTask.getInputs().file(delayedFile(Constants.VERSION_JSON_INDEX)); + etagDlTask.setUri(new GetVersionJsonUrl()); + etagDlTask.setFile(delayedFile(Constants.VERSION_JSON_INDEX)); + etagDlTask.setDieWithError(false); + //TODO: this is not necessary? + etagDlTask.doLast(new Action() { // normalizes to linux endings + @Override + public void execute(Task task) { + try { + File json = delayedFile(Constants.VERSION_JSON_INDEX).call(); + if (!json.exists()) + return; + + List lines = Files.readAllLines(json.toPath()); + StringBuilder buf = new StringBuilder(); + for (String line : lines) { + buf.append(line).append('\n'); + } + Files.write(json.toPath(), buf.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + } + + class GetDataFromJson extends DelayedString { + private final VersionToString function; + + public GetDataFromJson(VersionToString function) { + super(BasePlugin.this.project, ""); + this.function = function; + } + + @Override + public String call() { + try { + Version manifest = JsonFactory.loadVersion(delayedFile(Constants.VERSION_JSON_INDEX).call()); + return function.apply(manifest); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + task = makeTask("downloadClient", DownloadTask.class); { + task.getInputs().file(delayedFile(Constants.VERSION_JSON_INDEX)); + task.dependsOn("getVersionJson"); + task.setOutput(delayedFile(Constants.JAR_CLIENT_FRESH)); - task.setUrl(delayedString(Constants.MC_JAR_URL)); + task.setUrl(new GetDataFromJson(new VersionToString() { + @Override + public String apply(Version json) { + return json.downloads.client.url; + } + })); + + } task = makeTask("downloadServer", DownloadTask.class); { + task.getInputs().file(delayedFile(Constants.VERSION_JSON_INDEX)); + task.dependsOn("getVersionJson"); + task.setOutput(delayedFile(Constants.JAR_SERVER_FRESH)); - task.setUrl(delayedString(Constants.MC_SERVER_URL)); + task.setUrl(new GetDataFromJson(new VersionToString() { + @Override + public String apply(Version json) { + return json.downloads.server.url; + } + })); + + } ObtainFernFlowerTask mcpTask = makeTask("downloadMcpTools", ObtainFernFlowerTask.class); @@ -146,31 +245,35 @@ private void makeObtainTasks() mcpTask.setMcpUrl(delayedString(Constants.MCP_URL)); mcpTask.setFfJar(delayedFile(Constants.FERNFLOWER)); } - - DownloadTask getAssetsIndex = makeTask("getAssetsIndex", DownloadTask.class); + + etagDlTask = makeTask("getAssetsIndex", EtagDownloadTask.class); { - getAssetsIndex.setUrl(delayedString(Constants.ASSETS_INDEX_URL)); - getAssetsIndex.setOutput(delayedFile(Constants.ASSETS + "/indexes/{ASSET_INDEX}.json")); - getAssetsIndex.setDoesCache(false); + task.getInputs().file(delayedFile(Constants.VERSION_JSON_INDEX)); + task.dependsOn("getVersionJson"); - getAssetsIndex.doLast(new Action() { - public void execute(Task task) - { - try - { + etagDlTask.setUrl(new GetDataFromJson(new VersionToString() { + @Override + public String apply(Version json) { + return json.assetIndex.url; + } + })); + + + etagDlTask.setFile(delayedFile(Constants.ASSETS + "/indexes/{ASSET_INDEX}.json")); + etagDlTask.setDieWithError(false); + + etagDlTask.doLast(new Action() { + @Override + public void execute(Task task1) { + try { parseAssetIndex(); + } catch (JsonSyntaxException e) { + throw new RuntimeException(e); + } catch (JsonIOException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); } - catch (Exception e) - { - Throwables.propagate(e); - } - } - }); - - getAssetsIndex.getOutputs().upToDateWhen(new Closure(this, null) { - public Boolean call(Object... obj) - { - return false; } }); } diff --git a/src/main/java/net/minecraftforge/gradle/common/Constants.java b/src/main/java/net/minecraftforge/gradle/common/Constants.java index 97ff3014a..444dd50a3 100644 --- a/src/main/java/net/minecraftforge/gradle/common/Constants.java +++ b/src/main/java/net/minecraftforge/gradle/common/Constants.java @@ -22,137 +22,126 @@ import com.google.common.base.Joiner; -public class Constants -{ +public class Constants { // OS - public static enum OperatingSystem - { + public static enum OperatingSystem { WINDOWS, OSX, LINUX; - public String toString() - { + public String toString() { return StringUtils.lower(name()); } } // OS - public static enum SystemArch - { + public static enum SystemArch { BIT_32, BIT_64; - public String toString() - { + public String toString() { return StringUtils.lower(name()).replace("bit_", ""); } } - public static final OperatingSystem OPERATING_SYSTEM = getOs(); - public static final SystemArch SYSTEM_ARCH = getArch(); + public static final OperatingSystem OPERATING_SYSTEM = getOs(); + public static final SystemArch SYSTEM_ARCH = getArch(); + public static final String HASH_FUNC = "MD5"; + public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"; // extension nam - public static final String EXT_NAME_MC = "minecraft"; + public static final String EXT_NAME_MC = "minecraft"; public static final String EXT_NAME_JENKINS = "jenkins"; // json parser public static final JdomParser PARSER = new JdomParser(); @SuppressWarnings("serial") - public static final Closure CALL_FALSE = new Closure(null){ public Boolean call(Object o){ return false; }}; + public static final Closure CALL_FALSE = new Closure(null) { + public Boolean call(Object o) { + return false; + } + }; // urls - public static final String MC_JAR_URL = "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/{MC_VERSION}.jar"; - public static final String MC_SERVER_URL = "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar"; - public static final String MCP_URL = "http://files.minecraftforge.net/fernflower_temporary.zip"; - public static final String ASSETS_URL = "http://resources.download.minecraft.net"; - public static final String LIBRARY_URL = "https://libraries.minecraft.net/"; - public static final String ASSETS_INDEX_URL = "http://s3.amazonaws.com/Minecraft.Download/indexes/{ASSET_INDEX}.json"; + public static final String MC_JAR_URL = "https://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/{MC_VERSION}.jar"; + public static final String MC_SERVER_URL = "https://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar"; + public static final String MC_JSON_INDEX_URL = "https://piston-meta.mojang.com/mc/game/version_manifest.json"; + public static final String MCP_URL = "https://files.minecraftforge.net/fernflower_temporary.zip"; + public static final String ASSETS_URL = "https://resources.download.minecraft.net"; + public static final String LIBRARY_URL = "https://libraries.minecraft.net/"; + public static final String ASSETS_INDEX_URL = "https://s3.amazonaws.com/Minecraft.Download/indexes/{ASSET_INDEX}.json"; - public static final String LOG = ".gradle/gradle.log"; - public static final String ASSETS_INDEX = "legacy"; + public static final String LOG = ".gradle/gradle.log"; + public static final String ASSETS_INDEX = "legacy"; // things in the cache dir. public static final String JAR_CLIENT_FRESH = "{CACHE_DIR}/minecraft/net/minecraft/minecraft/{MC_VERSION}/minecraft-{MC_VERSION}.jar"; public static final String JAR_SERVER_FRESH = "{CACHE_DIR}/minecraft/net/minecraft/minecraft_server/{MC_VERSION}/minecraft_server-{MC_VERSION}.jar"; - public static final String JAR_MERGED = "{CACHE_DIR}/minecraft/net/minecraft/minecraft_merged/{MC_VERSION}/minecraft_merged-{MC_VERSION}.jar"; - public static final String FERNFLOWER = "{CACHE_DIR}/minecraft/fernflower.jar"; - public static final String EXCEPTOR = "{CACHE_DIR}/minecraft/exceptor.jar"; - public static final String ASSETS = "{CACHE_DIR}/minecraft/assets"; - - public static final String DEOBF_JAR = "{BUILD_DIR}/deobfuscated.jar"; - public static final String DEOBF_BIN_JAR = "{BUILD_DIR}/deobfuscated-bin.jar"; - public static final String DECOMP_JAR = "{BUILD_DIR}/decompiled.jar"; - public static final String DECOMP_FMLED = "{BUILD_DIR}/decompiled-fmled.jar"; - public static final String DECOMP_FMLINJECTED = "{BUILD_DIR}/decompiled-fmlinjected.jar"; + public static final String JAR_MERGED = "{CACHE_DIR}/minecraft/net/minecraft/minecraft_merged/{MC_VERSION}/minecraft_merged-{MC_VERSION}.jar"; + public static final String FERNFLOWER = "{CACHE_DIR}/minecraft/fernflower.jar"; + public static final String EXCEPTOR = "{CACHE_DIR}/minecraft/exceptor.jar"; + public static final String ASSETS = "{CACHE_DIR}/minecraft/assets"; + public static final String JSONS_DIR = ASSETS + "/indexes"; + public static final String VERSION_JSON_INDEX = JSONS_DIR + "/{ASSET_INDEX}.json"; + + public static final String DEOBF_JAR = "{BUILD_DIR}/deobfuscated.jar"; + public static final String DEOBF_BIN_JAR = "{BUILD_DIR}/deobfuscated-bin.jar"; + public static final String DECOMP_JAR = "{BUILD_DIR}/decompiled.jar"; + public static final String DECOMP_FMLED = "{BUILD_DIR}/decompiled-fmled.jar"; + public static final String DECOMP_FMLINJECTED = "{BUILD_DIR}/decompiled-fmlinjected.jar"; public static final String DECOMP_FORGEJAVADOCCED = "{BUILD_DIR}/decompiled-forged.jar"; - public static final String DECOMP_FORGED = "{BUILD_DIR}/decompiled-forged-nojd.jar"; - public static final String DECOMP_FORGEINJECTED = "{BUILD_DIR}/decompiled-forgeinjected.jar"; - public static final String DECOMP_REMAPPED = "{BUILD_DIR}/decompiled-remapped.jar"; + public static final String DECOMP_FORGED = "{BUILD_DIR}/decompiled-forged-nojd.jar"; + public static final String DECOMP_FORGEINJECTED = "{BUILD_DIR}/decompiled-forgeinjected.jar"; + public static final String DECOMP_REMAPPED = "{BUILD_DIR}/decompiled-remapped.jar"; // util public static final String NEWLINE = System.getProperty("line.separator"); - private static final OutputStream NULL_OUT = new OutputStream() - { - public void write(int b) throws IOException{} + private static final OutputStream NULL_OUT = new OutputStream() { + public void write(int b) throws IOException { + } }; // helper methods - public static File cacheFile(Project project, String... otherFiles) - { + public static File cacheFile(Project project, String... otherFiles) { return Constants.file(project.getGradle().getGradleUserHomeDir(), otherFiles); } - public static File file(File file, String... otherFiles) - { + public static File file(File file, String... otherFiles) { String othersJoined = Joiner.on('/').join(otherFiles); return new File(file, othersJoined); } - public static File file(String... otherFiles) - { + public static File file(String... otherFiles) { String othersJoined = Joiner.on('/').join(otherFiles); return new File(othersJoined); } - public static List getClassPath() - { + public static List getClassPath() { URL[] urls = ((URLClassLoader) DevExtension.class.getClassLoader()).getURLs(); ArrayList list = new ArrayList(); - for (URL url : urls) - { + for (URL url : urls) { list.add(url.getPath()); } return list; } - private static OperatingSystem getOs() - { + private static OperatingSystem getOs() { String name = StringUtils.lower(System.getProperty("os.name")); - if (name.contains("windows")) - { + if (name.contains("windows")) { return OperatingSystem.WINDOWS; - } - else if (name.contains("mac") || name.contains("osx")) - { + } else if (name.contains("mac") || name.contains("osx")) { return OperatingSystem.OSX; - } - else if (name.contains("linux") || name.contains("unix")) - { + } else if (name.contains("linux") || name.contains("unix")) { return OperatingSystem.LINUX; - } - else - { + } else { return null; } } - public static File getMinecraftDirectory() - { + public static File getMinecraftDirectory() { String userDir = System.getProperty("user.home"); - switch (OPERATING_SYSTEM) - { + switch (OPERATING_SYSTEM) { case LINUX: return new File(userDir, ".minecraft/"); case WINDOWS: @@ -164,30 +153,23 @@ public static File getMinecraftDirectory() default: return new File(userDir, "minecraft/"); } - } + } - private static SystemArch getArch() - { + private static SystemArch getArch() { String name = StringUtils.lower(System.getProperty("os.arch")); - if (name.contains("64")) - { + if (name.contains("64")) { return SystemArch.BIT_64; - } - else - { + } else { return SystemArch.BIT_32; } } - public static String hash(File file) - { + public static String hash(File file) { return hash(file, "MD5"); } - public static String hash(File file, String function) - { - try - { + public static String hash(File file, String function) { + try { InputStream fis = new FileInputStream(file); @@ -195,11 +177,9 @@ public static String hash(File file, String function) MessageDigest complete = MessageDigest.getInstance(function); int numRead; - do - { + do { numRead = fis.read(buffer); - if (numRead > 0) - { + if (numRead > 0) { complete.update(buffer, 0, numRead); } } while (numRead != -1); @@ -209,37 +189,29 @@ public static String hash(File file, String function) String result = ""; - for (int i = 0; i < hash.length; i++) - { + for (int i = 0; i < hash.length; i++) { result += Integer.toString((hash[i] & 0xff) + 0x100, 16).substring(1); } return result; - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } return null; } - public static String hash(String str) - { - try - { + public static String hash(String str) { + try { MessageDigest complete = MessageDigest.getInstance("MD5"); byte[] hash = complete.digest(str.getBytes()); String result = ""; - for (int i = 0; i < hash.length; i++) - { + for (int i = 0; i < hash.length; i++) { result += Integer.toString((hash[i] & 0xff) + 0x100, 16).substring(1); } return result; - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } @@ -249,8 +221,7 @@ public static String hash(String str) /** * DON'T FORGET TO CLOSE */ - public static OutputStream getNullStream() - { + public static OutputStream getNullStream() { return NULL_OUT; } } diff --git a/src/main/java/net/minecraftforge/gradle/common/version/Version.java b/src/main/java/net/minecraftforge/gradle/common/version/Version.java index 41121bff7..1bb06f141 100644 --- a/src/main/java/net/minecraftforge/gradle/common/version/Version.java +++ b/src/main/java/net/minecraftforge/gradle/common/version/Version.java @@ -5,6 +5,7 @@ import java.util.List; import net.minecraftforge.gradle.common.Constants; +import net.minecraftforge.gradle.json.version.Downloads; public class Version { @@ -19,6 +20,8 @@ public class Version public String incompatibilityReason; private String assets; public List rules; + public Downloads downloads; + public Downloads.DownloadFileInfo assetIndex; private List _libraries; diff --git a/src/main/java/net/minecraftforge/gradle/common/version/json/JsonFactory.java b/src/main/java/net/minecraftforge/gradle/common/version/json/JsonFactory.java index a0dcff630..b9485a77c 100644 --- a/src/main/java/net/minecraftforge/gradle/common/version/json/JsonFactory.java +++ b/src/main/java/net/minecraftforge/gradle/common/version/json/JsonFactory.java @@ -13,6 +13,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonIOException; import com.google.gson.JsonSyntaxException; +import net.minecraftforge.gradle.json.MCVersionManifest; public class JsonFactory { @@ -43,4 +44,11 @@ public static AssetIndex loadAssetsIndex(File json) throws JsonSyntaxException, reader.close(); return a; } + + public static MCVersionManifest loadMCVersionManifest(File json) throws JsonSyntaxException, JsonIOException, IOException { + FileReader reader = new FileReader(json); + MCVersionManifest a = GSON.fromJson(reader, MCVersionManifest.class); + reader.close(); + return a; + } } diff --git a/src/main/java/net/minecraftforge/gradle/json/MCVersionManifest.java b/src/main/java/net/minecraftforge/gradle/json/MCVersionManifest.java new file mode 100644 index 000000000..7abde652a --- /dev/null +++ b/src/main/java/net/minecraftforge/gradle/json/MCVersionManifest.java @@ -0,0 +1,32 @@ +package net.minecraftforge.gradle.json; + +import java.util.Date; +import java.util.List; + +// format of https://piston-meta.mojang.com/mc/game/version_manifest.json +public class MCVersionManifest { + public LatestInfo latest; + public List versions; + + public Version findVersion(String versionId) { + for (Version v : versions) { + if (versionId.equals(v.id)) { + return v; + } + } + throw new IllegalArgumentException(versionId + " not found"); + } + + public static class LatestInfo { + public String release; + public String snapshot; + } + + public static class Version { + public String id; + public String type; + public String url; + public Date time; + public Date releaseTime; + } +} diff --git a/src/main/java/net/minecraftforge/gradle/json/version/Downloads.java b/src/main/java/net/minecraftforge/gradle/json/version/Downloads.java new file mode 100644 index 000000000..691d2155d --- /dev/null +++ b/src/main/java/net/minecraftforge/gradle/json/version/Downloads.java @@ -0,0 +1,14 @@ +package net.minecraftforge.gradle.json.version; + + +public class Downloads { + public DownloadFileInfo client; + public DownloadFileInfo server; + public DownloadFileInfo windows_server; + + public static class DownloadFileInfo { + public String sha1; + public long size; + public String url; + } +} diff --git a/src/main/java/net/minecraftforge/gradle/json/version/VersionToString.java b/src/main/java/net/minecraftforge/gradle/json/version/VersionToString.java new file mode 100644 index 000000000..afe55b40a --- /dev/null +++ b/src/main/java/net/minecraftforge/gradle/json/version/VersionToString.java @@ -0,0 +1,7 @@ +package net.minecraftforge.gradle.json.version; + +import net.minecraftforge.gradle.common.version.Version; + +public interface VersionToString { + String apply(Version version); +} diff --git a/src/main/java/net/minecraftforge/gradle/tasks/GenSrgTask.java b/src/main/java/net/minecraftforge/gradle/tasks/GenSrgTask.java index 4ae0c39c4..e67ce818e 100644 --- a/src/main/java/net/minecraftforge/gradle/tasks/GenSrgTask.java +++ b/src/main/java/net/minecraftforge/gradle/tasks/GenSrgTask.java @@ -62,6 +62,7 @@ public void doTask() throws IOException File deobfFile = getNotchToMcpSrg(); File reobfFile = getMcpToSrgSrg(); + File notchFile = getMcpToNotchSrg(); // verify files... if (!deobfFile.exists()) @@ -74,6 +75,11 @@ public void doTask() throws IOException reobfFile.getParentFile().mkdirs(); reobfFile.createNewFile(); } + if (!notchFile.exists()) + { + notchFile.getParentFile().mkdirs(); + notchFile.createNewFile(); + } // create streams BufferedReader srgIn = Files.newReader(getInSrg(), Charset.defaultCharset()); diff --git a/src/main/java/net/minecraftforge/gradle/tasks/abstractutil/EtagDownloadTask.java b/src/main/java/net/minecraftforge/gradle/tasks/abstractutil/EtagDownloadTask.java new file mode 100644 index 000000000..61ed8e8ed --- /dev/null +++ b/src/main/java/net/minecraftforge/gradle/tasks/abstractutil/EtagDownloadTask.java @@ -0,0 +1,137 @@ +package net.minecraftforge.gradle.tasks.abstractutil; + +import com.google.common.base.Strings; +import com.google.common.io.ByteStreams; +import groovy.lang.Closure; +import net.minecraftforge.gradle.FileUtils; +import net.minecraftforge.gradle.common.Constants; +import org.gradle.api.DefaultTask; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; + +public class EtagDownloadTask extends DefaultTask { + Object uri; + Object file; + boolean dieWithError; + + @TaskAction + public void doTask() throws IOException, URISyntaxException { + URI uri = getUri(); + File outFile = getFile(); + File etagFile = getProject().file(getFile().getPath() + ".etag"); + + // ensure folder exists + outFile.getParentFile().mkdirs(); + + String etag; + if (etagFile.exists()) { + etag = FileUtils.readString(etagFile); + } else { + etag = ""; + } + + try { + HttpURLConnection con = (HttpURLConnection) uri.toURL().openConnection(); + con.setInstanceFollowRedirects(true); + con.setRequestProperty("User-Agent", Constants.USER_AGENT); + con.setRequestProperty("If-None-Match", etag); + + con.connect(); + + switch (con.getResponseCode()) { + case 404: // file not found.... duh... + error(uri + " 404'ed!"); + break; + case 304: // content is the same. + this.setDidWork(false); + break; + case 200: // worked + + // write file + InputStream stream = con.getInputStream(); + Files.write(outFile.toPath(), ByteStreams.toByteArray(stream)); + stream.close(); + + // write etag + etag = con.getHeaderField("ETag"); + if (!Strings.isNullOrEmpty(etag)) { + Files.write(etagFile.toPath(), etag.getBytes(StandardCharsets.UTF_8)); + } + + break; + default: // another code?? uh.. + error("Unexpected reponse " + con.getResponseCode() + " from " + uri); + break; + } + + con.disconnect(); + } catch (Throwable e) { + // just in case people dont have internet at the moment. + error(e.getLocalizedMessage()); + } + } + + private void error(String error) { + if (dieWithError) { + throw new RuntimeException(error); + } else { + getLogger().error(error); + } + } + + @Deprecated + @Internal + public URL getUrl() throws MalformedURLException { + try { + return getUri().toURL(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + @Deprecated + public void setUrl(Object url) { + this.setUri(url); + } + + @Input + public URI getUri() throws URISyntaxException { + while (uri instanceof Closure) { + uri = ((Closure) uri).call(); + } + + return new URI(uri.toString()); + } + + public void setUri(Object url) { + this.uri = url; + } + + @OutputFile + public File getFile() { + return getProject().file(file); + } + + public void setFile(Object file) { + this.file = file; + } + + @Input + public boolean isDieWithError() { + return dieWithError; + } + + public void setDieWithError(boolean dieWithError) { + this.dieWithError = dieWithError; + } +} + diff --git a/src/main/java/net/minecraftforge/gradle/tasks/dev/ObfuscateTask.java b/src/main/java/net/minecraftforge/gradle/tasks/dev/ObfuscateTask.java index a2397938f..bf80444f2 100644 --- a/src/main/java/net/minecraftforge/gradle/tasks/dev/ObfuscateTask.java +++ b/src/main/java/net/minecraftforge/gradle/tasks/dev/ObfuscateTask.java @@ -89,7 +89,8 @@ private void executeTask(AbstractTask task) { for (Object dep : task.getTaskDependencies().getDependencies(task)) { - executeTask((AbstractTask) dep); + if (dep instanceof AbstractTask) + executeTask((AbstractTask) dep); } if (!task.getState().getExecuted())