recreate repo
This commit is contained in:
		
						commit
						7efa7780fe
					
				
					 29 changed files with 1613 additions and 0 deletions
				
			
		
							
								
								
									
										15
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| /.idea | ||||
| 
 | ||||
| /work | ||||
| /tools | ||||
| /build | ||||
| /.gradle | ||||
| *.log | ||||
| *.reject | ||||
| /run/ | ||||
| 
 | ||||
| *.iml | ||||
| *.ipr | ||||
| *.iws | ||||
| /out | ||||
| /classes/ | ||||
							
								
								
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| MIT License | ||||
| 
 | ||||
| Copyright (c) 2016 ChorusMC | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										5
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| # ChorusGradle | ||||
| Gradle plugin for Chorus | ||||
| 
 | ||||
| run : bash gradlew setupChorus genIdeaRuns | ||||
| 
 | ||||
							
								
								
									
										62
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,62 @@ | |||
| apply plugin: 'java' | ||||
| apply plugin: 'groovy' | ||||
| apply plugin: 'maven' | ||||
| apply plugin: 'maven-publish' | ||||
| apply plugin: 'idea' | ||||
| 
 | ||||
| group = 'chorusmc.gradle' | ||||
| version = '0.0.1' | ||||
| sourceCompatibility = targetCompatibility = '1.8' | ||||
| 
 | ||||
| if (System.getenv().BUILD_NUMBER) { | ||||
|     version = version + "." + "${System.getenv().BUILD_NUMBER}" | ||||
| } | ||||
| 
 | ||||
| repositories { | ||||
|     mavenCentral() | ||||
|     flatDir { | ||||
|         dirs 'libs' | ||||
|     } | ||||
|     ivy { | ||||
|         name "Enigma-Temporary" | ||||
|         artifactPattern "http://modmuss50.me:8080/job/Enigma-Asie/lastSuccessfulBuild/artifact/build/libs/[module]-[revision]-[classifier].[ext]" | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| configurations { | ||||
|     deployerJars | ||||
|     shade | ||||
|     compile.extendsFrom shade | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|     compile gradleApi() | ||||
|     shade 'org.zeroturnaround:zt-zip:1.9' | ||||
|     compile 'org.slf4j:slf4j-api:1.7.21' | ||||
|     compile 'org.slf4j:slf4j-simple:1.7.21' | ||||
|     shade 'com.google.code.gson:gson:2.6.2' | ||||
|     shade 'com.googlecode.java-diff-utils:diffutils:1.3.0' | ||||
|     shade 'com.cloudbees:diff4j:1.2' | ||||
|     shade 'commons-io:commons-io:1.4' | ||||
|     shade 'com.google.guava:guava-jdk5:17.0' | ||||
|     shade 'org.ow2.asm:asm-debug-all:5.0.3' | ||||
|     shade 'com.google.guava:guava:19.0' | ||||
|     shade name: "enigma", version: "0.11.0.6", classifier: "all" | ||||
| } | ||||
| 
 | ||||
| sourceSets { | ||||
|     main.compileClasspath += configurations.shade; | ||||
|     main.runtimeClasspath += configurations.shade; | ||||
|     test.compileClasspath += configurations.shade; | ||||
|     test.runtimeClasspath += configurations.shade; | ||||
| } | ||||
| 
 | ||||
| jar { | ||||
|     configurations.shade.each { dep -> | ||||
|         from(project.zipTree(dep)) { | ||||
|             exclude 'META-INF', 'META-INF/**' | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| //TODO maven uploading | ||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										6
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| #Wed Jun 22 18:29:49 CEST 2016 | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip | ||||
							
								
								
									
										164
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,164 @@ | |||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| ############################################################################## | ||||
| ## | ||||
| ##  Gradle start up script for UN*X | ||||
| ## | ||||
| ############################################################################## | ||||
| 
 | ||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| DEFAULT_JVM_OPTS="" | ||||
| 
 | ||||
| APP_NAME="Gradle" | ||||
| APP_BASE_NAME=`basename "$0"` | ||||
| 
 | ||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
| MAX_FD="maximum" | ||||
| 
 | ||||
| warn ( ) { | ||||
|     echo "$*" | ||||
| } | ||||
| 
 | ||||
| die ( ) { | ||||
|     echo | ||||
|     echo "$*" | ||||
|     echo | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| # OS specific support (must be 'true' or 'false'). | ||||
| cygwin=false | ||||
| msys=false | ||||
| darwin=false | ||||
| case "`uname`" in | ||||
|   CYGWIN* ) | ||||
|     cygwin=true | ||||
|     ;; | ||||
|   Darwin* ) | ||||
|     darwin=true | ||||
|     ;; | ||||
|   MINGW* ) | ||||
|     msys=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. | ||||
| if [ -n "$JAVA_HOME" ] ; then | ||||
|     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||||
|         # IBM's JDK on AIX uses strange locations for the executables | ||||
|         JAVACMD="$JAVA_HOME/jre/sh/java" | ||||
|     else | ||||
|         JAVACMD="$JAVA_HOME/bin/java" | ||||
|     fi | ||||
|     if [ ! -x "$JAVACMD" ] ; then | ||||
|         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||||
| 
 | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
|     fi | ||||
| else | ||||
|     JAVACMD="java" | ||||
|     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
| 
 | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
| fi | ||||
| 
 | ||||
| # Increase the maximum file descriptors if we can. | ||||
| if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then | ||||
|     MAX_FD_LIMIT=`ulimit -H -n` | ||||
|     if [ $? -eq 0 ] ; then | ||||
|         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | ||||
|             MAX_FD="$MAX_FD_LIMIT" | ||||
|         fi | ||||
|         ulimit -n $MAX_FD | ||||
|         if [ $? -ne 0 ] ; then | ||||
|             warn "Could not set maximum file descriptor limit: $MAX_FD" | ||||
|         fi | ||||
|     else | ||||
|         warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| # For Darwin, add options to specify how the application appears in the dock | ||||
| if $darwin; then | ||||
|     GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | ||||
| fi | ||||
| 
 | ||||
| # For Cygwin, switch paths to Windows format before running java | ||||
| if $cygwin ; then | ||||
|     APP_HOME=`cygpath --path --mixed "$APP_HOME"` | ||||
|     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | ||||
| 
 | ||||
|     # We build the pattern for arguments to be converted via cygpath | ||||
|     ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | ||||
|     SEP="" | ||||
|     for dir in $ROOTDIRSRAW ; do | ||||
|         ROOTDIRS="$ROOTDIRS$SEP$dir" | ||||
|         SEP="|" | ||||
|     done | ||||
|     OURCYGPATTERN="(^($ROOTDIRS))" | ||||
|     # Add a user-defined pattern to the cygpath arguments | ||||
|     if [ "$GRADLE_CYGPATTERN" != "" ] ; then | ||||
|         OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | ||||
|     fi | ||||
|     # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||||
|     i=0 | ||||
|     for arg in "$@" ; do | ||||
|         CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` | ||||
|         CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option | ||||
| 
 | ||||
|         if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition | ||||
|             eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` | ||||
|         else | ||||
|             eval `echo args$i`="\"$arg\"" | ||||
|         fi | ||||
|         i=$((i+1)) | ||||
|     done | ||||
|     case $i in | ||||
|         (0) set -- ;; | ||||
|         (1) set -- "$args0" ;; | ||||
|         (2) set -- "$args0" "$args1" ;; | ||||
|         (3) set -- "$args0" "$args1" "$args2" ;; | ||||
|         (4) set -- "$args0" "$args1" "$args2" "$args3" ;; | ||||
|         (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; | ||||
|         (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; | ||||
|         (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; | ||||
|         (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; | ||||
|         (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; | ||||
|     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=("$@") | ||||
| } | ||||
| eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS | ||||
| JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" | ||||
| 
 | ||||
| exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" | ||||
							
								
								
									
										90
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,90 @@ | |||
| @if "%DEBUG%" == "" @echo off | ||||
| @rem ########################################################################## | ||||
| @rem | ||||
| @rem  Gradle startup script for Windows | ||||
| @rem | ||||
| @rem ########################################################################## | ||||
| 
 | ||||
| @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 Find java.exe | ||||
| if defined JAVA_HOME goto findJavaFromJavaHome | ||||
| 
 | ||||
| set JAVA_EXE=java.exe | ||||
| %JAVA_EXE% -version >NUL 2>&1 | ||||
| if "%ERRORLEVEL%" == "0" goto init | ||||
| 
 | ||||
| echo. | ||||
| echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
| echo. | ||||
| echo Please set the JAVA_HOME variable in your environment to match the | ||||
| echo location of your Java installation. | ||||
| 
 | ||||
| goto fail | ||||
| 
 | ||||
| :findJavaFromJavaHome | ||||
| set JAVA_HOME=%JAVA_HOME:"=% | ||||
| set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||||
| 
 | ||||
| if exist "%JAVA_EXE%" goto init | ||||
| 
 | ||||
| echo. | ||||
| echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||||
| echo. | ||||
| echo Please set the JAVA_HOME variable in your environment to match the | ||||
| echo location of your Java installation. | ||||
| 
 | ||||
| goto fail | ||||
| 
 | ||||
| :init | ||||
| @rem Get command-line arguments, handling Windowz 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. | ||||
| set CMD_LINE_ARGS= | ||||
| set _SKIP=2 | ||||
| 
 | ||||
| :win9xME_args_slurp | ||||
| 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 | ||||
| 
 | ||||
| set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||
| 
 | ||||
| @rem Execute Gradle | ||||
| "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% | ||||
| 
 | ||||
| :end | ||||
| @rem End local scope for the variables with windows NT shell | ||||
| if "%ERRORLEVEL%"=="0" goto mainEnd | ||||
| 
 | ||||
| :fail | ||||
| rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||
| rem the _cmd.exe /c_ return code! | ||||
| if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||||
| exit /b 1 | ||||
| 
 | ||||
| :mainEnd | ||||
| if "%OS%"=="Windows_NT" endlocal | ||||
| 
 | ||||
| :omega | ||||
							
								
								
									
										2
									
								
								settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								settings.gradle
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| rootProject.name = 'ChorusGradle' | ||||
| 
 | ||||
							
								
								
									
										118
									
								
								src/main/java/chorusmc/gradle/AbstractPlugin.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/main/java/chorusmc/gradle/AbstractPlugin.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,118 @@ | |||
| package chorusmc.gradle; | ||||
| 
 | ||||
| import chorusmc.gradle.util.Constants; | ||||
| import com.google.common.collect.ImmutableMap; | ||||
| import org.gradle.api.Plugin; | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.Task; | ||||
| import org.gradle.api.artifacts.repositories.MavenArtifactRepository; | ||||
| import org.gradle.api.plugins.JavaPlugin; | ||||
| import org.gradle.api.plugins.JavaPluginConvention; | ||||
| import org.gradle.api.tasks.SourceSet; | ||||
| import org.gradle.api.tasks.javadoc.Javadoc; | ||||
| import org.gradle.plugins.ide.eclipse.model.EclipseModel; | ||||
| import org.gradle.plugins.ide.idea.model.IdeaModel; | ||||
| 
 | ||||
| public class AbstractPlugin implements Plugin<Project> { | ||||
|     protected Project project; | ||||
| 
 | ||||
|     @Override | ||||
|     public void apply(Project target) { | ||||
|         this.project = target; | ||||
| 
 | ||||
|         // Apply default plugins | ||||
|         project.apply(ImmutableMap.of("plugin", "java")); | ||||
|         project.apply(ImmutableMap.of("plugin", "eclipse")); | ||||
|         project.apply(ImmutableMap.of("plugin", "idea")); | ||||
| 
 | ||||
|         project.getExtensions().create("minecraft", ChorusGradleExtension.class); | ||||
| 
 | ||||
|         // Force add Mojang repository | ||||
|         addMavenRepo(target, "Mojang", "https://libraries.minecraft.net/"); | ||||
| 
 | ||||
|         // Minecraft libraries configuration | ||||
|         project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES); | ||||
|         project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES_CLIENT); | ||||
|         project.getConfigurations().maybeCreate(Constants.CONFIG_NATIVES); | ||||
| 
 | ||||
|         // Common libraries extends from client libraries, CONFIG_MC_DEPENDENCIES will contains all MC dependencies | ||||
|         project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).extendsFrom(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES_CLIENT)); | ||||
| 
 | ||||
|         configureIDEs(); | ||||
|         configureCompile(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Permit to create a Task instance of the type in the project | ||||
|      * | ||||
|      * @param name The name of the task | ||||
|      * @param type The type of the task that will be used to create an instance | ||||
|      * @return The created task object for the project | ||||
|      */ | ||||
|     public <T extends Task> T makeTask(String name, Class<T> type) { | ||||
|         return makeTask(project, name, type); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Permit to create a Task instance of the type in a project | ||||
|      * | ||||
|      * @param target The target project | ||||
|      * @param name   The name of the task | ||||
|      * @param type   The type of the task that will be used to create an instance | ||||
|      * @return The created task object for the specified project | ||||
|      */ | ||||
|     public static <T extends Task> T makeTask(Project target, String name, Class<T> type) { | ||||
|         return target.getTasks().create(name, type); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Permit to add a Maven repository to a target project | ||||
|      * | ||||
|      * @param target The garget project | ||||
|      * @param name   The name of the repository | ||||
|      * @param url    The URL of the repository | ||||
|      * @return An object containing the name and the URL of the repository that can be modified later | ||||
|      */ | ||||
|     public MavenArtifactRepository addMavenRepo(Project target, final String name, final String url) { | ||||
|         return target.getRepositories().maven(repo -> { | ||||
|             repo.setName(name); | ||||
|             repo.setUrl(url); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Add Minecraft dependencies to IDE dependencies | ||||
|      */ | ||||
|     protected void configureIDEs() { | ||||
|         // IDEA | ||||
|         IdeaModel ideaModule = (IdeaModel) project.getExtensions().getByName("idea"); | ||||
| 
 | ||||
|         ideaModule.getModule().getExcludeDirs().addAll(project.files(".gradle", "build", ".idea", "out").getFiles()); | ||||
|         ideaModule.getModule().setDownloadJavadoc(true); | ||||
|         ideaModule.getModule().setDownloadSources(true); | ||||
|         ideaModule.getModule().setInheritOutputDirs(true); | ||||
|         ideaModule.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES)); | ||||
| 
 | ||||
|         // ECLIPSE | ||||
|         EclipseModel eclipseModule = (EclipseModel) project.getExtensions().getByName("eclipse"); | ||||
|         eclipseModule.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Add Minecraft dependencies to compile time | ||||
|      */ | ||||
|     protected void configureCompile() { | ||||
|         JavaPluginConvention javaModule = (JavaPluginConvention) project.getConvention().getPlugins().get("java"); | ||||
| 
 | ||||
|         SourceSet main = javaModule.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME); | ||||
|         SourceSet test = javaModule.getSourceSets().getByName(SourceSet.TEST_SOURCE_SET_NAME); | ||||
| 
 | ||||
|         main.setCompileClasspath(main.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES))); | ||||
|         test.setCompileClasspath(test.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES))); | ||||
|         main.setRuntimeClasspath(main.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES))); | ||||
|         test.setCompileClasspath(test.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES))); | ||||
| 
 | ||||
|         Javadoc javadoc = (Javadoc) project.getTasks().getByName(JavaPlugin.JAVADOC_TASK_NAME); | ||||
|         javadoc.setClasspath(main.getOutput().plus(main.getCompileClasspath())); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										6
									
								
								src/main/java/chorusmc/gradle/ChorusGradleExtension.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/main/java/chorusmc/gradle/ChorusGradleExtension.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| package chorusmc.gradle; | ||||
| 
 | ||||
| public class ChorusGradleExtension { | ||||
|     public String version; | ||||
|     public String runDir = "run"; | ||||
| } | ||||
							
								
								
									
										19
									
								
								src/main/java/chorusmc/gradle/ChorusGradlePlugin.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/main/java/chorusmc/gradle/ChorusGradlePlugin.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| package chorusmc.gradle; | ||||
| 
 | ||||
| import chorusmc.gradle.task.*; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| public class ChorusGradlePlugin extends AbstractPlugin { | ||||
|     @Override | ||||
|     public void apply(Project target) { | ||||
|         super.apply(target); | ||||
| 
 | ||||
|         makeTask("download", DownloadTask.class); | ||||
|         makeTask("mapJars", MapJarsTask.class).dependsOn("download"); | ||||
|         makeTask("setupChorus", DefaultTask.class).dependsOn("mapJars"); | ||||
| 
 | ||||
|         makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); | ||||
|         makeTask("genIdeaRuns", GenIdeaProjectTask.class).dependsOn("cleanIdea").dependsOn("idea").dependsOn("extractNatives"); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										132
									
								
								src/main/java/chorusmc/gradle/task/DownloadNewTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								src/main/java/chorusmc/gradle/task/DownloadNewTask.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,132 @@ | |||
| package chorusmc.gradle.task; | ||||
| 
 | ||||
| import chorusmc.gradle.util.Constants; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.Input; | ||||
| import org.gradle.api.tasks.OutputFile; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| import chorusmc.gradle.util.progress.ProgressLogger; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.URL; | ||||
| import java.nio.ByteBuffer; | ||||
| import java.nio.channels.Channels; | ||||
| import java.nio.channels.FileChannel; | ||||
| import java.nio.channels.ReadableByteChannel; | ||||
| 
 | ||||
| /** | ||||
|  * Generic Download class compatible with ProgressLogger | ||||
|  */ | ||||
| public class DownloadNewTask extends DefaultTask { | ||||
| 
 | ||||
|     @Input | ||||
|     private Object output; | ||||
| 
 | ||||
|     @OutputFile | ||||
|     private String url; | ||||
|     private String taskName; | ||||
| 
 | ||||
|     @TaskAction | ||||
|     public void download() throws IOException { | ||||
|         File outputFile = getProject().file(getOutput()); | ||||
|         outputFile.getParentFile().mkdirs(); | ||||
|         outputFile.createNewFile(); | ||||
| 
 | ||||
|         getLogger().info("Downloading " + getURL()); | ||||
| 
 | ||||
|         URL url = new URL(getURL()); | ||||
|         HttpURLConnection connect = (HttpURLConnection) url.openConnection(); | ||||
|         connect.setRequestProperty("User-Agent", Constants.USER_AGENT); | ||||
|         connect.setInstanceFollowRedirects(true); | ||||
| 
 | ||||
|         ProgressLogger progressLogger = ProgressLogger.getProgressFactory(getProject(), getClass().getName()); | ||||
|         progressLogger.setDescription("Downloading " + getURL()); | ||||
|         ReadableByteChannel inChannel = new DownloadChannel(Channels.newChannel(connect.getInputStream()), getContentLength(url), progressLogger); | ||||
|         FileChannel outChannel = new FileOutputStream(outputFile).getChannel(); | ||||
|         outChannel.transferFrom(inChannel, 0, Long.MAX_VALUE); | ||||
|         outChannel.close(); | ||||
|         inChannel.close(); | ||||
|         progressLogger.completed(); | ||||
|         getLogger().info("Download complete"); | ||||
|     } | ||||
| 
 | ||||
|     private int getContentLength(URL url) { | ||||
|         HttpURLConnection connection; | ||||
|         int contentLength = -1; | ||||
|         try { | ||||
|             connection = (HttpURLConnection) url.openConnection(); | ||||
|             contentLength = connection.getContentLength(); | ||||
|         } catch (Exception e) { | ||||
|         } | ||||
|         return contentLength; | ||||
|     } | ||||
| 
 | ||||
|     public File getOutput() { | ||||
|         return getProject().file(output); | ||||
|     } | ||||
| 
 | ||||
|     public void setOutput(Object output) { | ||||
|         this.output = output; | ||||
|     } | ||||
| 
 | ||||
|     public String getURL() { | ||||
|         return url; | ||||
|     } | ||||
| 
 | ||||
|     public void setURL(String url) { | ||||
|         this.url = url; | ||||
|     } | ||||
| 
 | ||||
|     public void setTaskName(String taskName) { | ||||
|         this.taskName = taskName; | ||||
|     } | ||||
| 
 | ||||
|     public String getTaskName() { | ||||
|         return taskName; | ||||
|     } | ||||
| 
 | ||||
|     class DownloadChannel implements ReadableByteChannel { | ||||
|         ProgressLogger logger; | ||||
|         String formattedSize; | ||||
|         ReadableByteChannel rbc; | ||||
|         long totalBytes; | ||||
| 
 | ||||
|         DownloadChannel(ReadableByteChannel rbc, long expectedSize, ProgressLogger logger) { | ||||
|             this.logger = logger; | ||||
|             this.formattedSize = toHumanReadableLength(expectedSize); | ||||
|             this.rbc = rbc; | ||||
|         } | ||||
| 
 | ||||
|         public void close() throws IOException { | ||||
|             rbc.close(); | ||||
|         } | ||||
| 
 | ||||
|         public boolean isOpen() { | ||||
|             return rbc.isOpen(); | ||||
|         } | ||||
| 
 | ||||
|         public int read(ByteBuffer buffer) throws IOException { | ||||
|             int processedBytes; | ||||
|             if ((processedBytes = rbc.read(buffer)) > 0) { | ||||
|                 totalBytes += processedBytes; | ||||
|                 logger.progress(toHumanReadableLength(totalBytes) + "/" + formattedSize + " downloaded"); | ||||
|             } | ||||
|             return processedBytes; | ||||
|         } | ||||
| 
 | ||||
|         private String toHumanReadableLength(long bytes) { | ||||
|             if (bytes < 1024) { | ||||
|                 return bytes + " B"; | ||||
|             } else if (bytes < 1024 * 1024) { | ||||
|                 return (bytes / 1024) + " KB"; | ||||
|             } else if (bytes < 1024 * 1024 * 1024) { | ||||
|                 return String.format("%.2f MB", bytes / (1024.0 * 1024.0)); | ||||
|             } else { | ||||
|                 return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										124
									
								
								src/main/java/chorusmc/gradle/task/DownloadTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								src/main/java/chorusmc/gradle/task/DownloadTask.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,124 @@ | |||
| package chorusmc.gradle.task; | ||||
| 
 | ||||
| import chorusmc.gradle.util.Constants; | ||||
| import chorusmc.gradle.util.Version; | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.artifacts.Configuration; | ||||
| import org.gradle.api.artifacts.dsl.DependencyHandler; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| import chorusmc.gradle.ChorusGradleExtension; | ||||
| import chorusmc.gradle.util.Checksum; | ||||
| import chorusmc.gradle.util.ManifestVersion; | ||||
| import chorusmc.gradle.util.assets.AssetIndex; | ||||
| import chorusmc.gradle.util.assets.AssetObject; | ||||
| import chorusmc.gradle.util.progress.ProgressLogger; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.IOException; | ||||
| import java.net.URL; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| public class DownloadTask extends DefaultTask { | ||||
|     @TaskAction | ||||
|     public void download() { | ||||
|         try { | ||||
|             ChorusGradleExtension extension = this.getProject().getExtensions().getByType(ChorusGradleExtension.class); | ||||
| 
 | ||||
|             if (!Constants.MINECRAFT_JSON.get(extension).exists()) { | ||||
|                 this.getLogger().lifecycle(":downloading minecraft json"); | ||||
|                 FileUtils.copyURLToFile(new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"), Constants.VERSION_MANIFEST); | ||||
|                 ManifestVersion mcManifest = new GsonBuilder().create().fromJson(FileUtils.readFileToString(Constants.VERSION_MANIFEST), ManifestVersion.class); | ||||
| 
 | ||||
|                 Optional<ManifestVersion.Versions> optionalVersion = mcManifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(extension.version)).findFirst(); | ||||
|                 if (optionalVersion.isPresent()) { | ||||
|                     FileUtils.copyURLToFile(new URL(optionalVersion.get().url), Constants.MINECRAFT_JSON.get(extension)); | ||||
|                 } else { | ||||
|                     this.getLogger().info(":failed downloading minecraft json"); | ||||
|                     throw new RuntimeException("Failed downloading Minecraft json"); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             Gson gson = new Gson(); | ||||
|             Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 
 | ||||
|             if (!Constants.MINECRAFT_CLIENT_JAR.get(extension).exists() || !Checksum.equals(Constants.MINECRAFT_CLIENT_JAR.get(extension), version.downloads.get("client").sha1)) { | ||||
|                 this.getLogger().lifecycle(":downloading client"); | ||||
|                 FileUtils.copyURLToFile(new URL(version.downloads.get("client").url), Constants.MINECRAFT_CLIENT_JAR.get(extension)); | ||||
|             } | ||||
| 
 | ||||
|             if (Constants.MAPPINGS_ZIP.exists()) { | ||||
|                 Constants.MAPPINGS_ZIP.delete(); | ||||
|             } | ||||
| 
 | ||||
|             this.getLogger().lifecycle(":downloading mappings"); | ||||
|             FileUtils.copyURLToFile(new URL("https://github.com/ChorusMC/pomf/archive/master.zip"), Constants.MAPPINGS_ZIP); | ||||
| 
 | ||||
|             DependencyHandler dependencyHandler = getProject().getDependencies(); | ||||
| 
 | ||||
|             if (getProject().getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getState() == Configuration.State.UNRESOLVED) { | ||||
|                 for (Version.Library library : version.libraries) { | ||||
|                     if (library.allowed() && library.getFile() != null) { | ||||
|                         // By default, they are all available on all sides | ||||
|                         String configName = Constants.CONFIG_MC_DEPENDENCIES; | ||||
|                         if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput")) { | ||||
|                             configName = Constants.CONFIG_MC_DEPENDENCIES_CLIENT; | ||||
|                         } | ||||
|                         dependencyHandler.add(configName, library.getArtifactName()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES).getState() == Configuration.State.UNRESOLVED) { | ||||
|                 version.libraries.stream().filter(lib -> lib.natives != null).forEach(lib -> dependencyHandler.add(Constants.CONFIG_NATIVES, lib.getArtifactName())); | ||||
|             } | ||||
| 
 | ||||
|             // Force add LaunchWrapper | ||||
|             dependencyHandler.add(Constants.CONFIG_MC_DEPENDENCIES, "net.minecraft:launchwrapper:1.11"); | ||||
| 
 | ||||
|             Version.AssetIndex assetIndex = version.assetIndex; | ||||
| 
 | ||||
|             File assets = new File(Constants.CACHE_FILES, "assets"); | ||||
|             if (!assets.exists()) { | ||||
|                 assets.mkdirs(); | ||||
|             } | ||||
| 
 | ||||
|             File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.id + ".json"); | ||||
|             if (!assetsInfo.exists() || !Checksum.equals(assetsInfo, assetIndex.sha1)) { | ||||
|                 this.getLogger().lifecycle(":downloading asset index"); | ||||
|                 FileUtils.copyURLToFile(new URL(assetIndex.url), assetsInfo); | ||||
|             } | ||||
| 
 | ||||
|             ProgressLogger progressLogger = ProgressLogger.getProgressFactory(getProject(), getClass().getName()); | ||||
|             progressLogger.start("Downloading assets...", "assets"); | ||||
|             AssetIndex index = new Gson().fromJson(new FileReader(assetsInfo), AssetIndex.class); | ||||
|             Map<String, AssetObject> parent = index.getFileMap(); | ||||
|             final int totalSize = parent.size(); | ||||
|             int position = 0; | ||||
|             this.getLogger().lifecycle(":downloading assets..."); | ||||
|             for (Map.Entry<String, AssetObject> entry : parent.entrySet()) { | ||||
|                 AssetObject object = entry.getValue(); | ||||
|                 String sha1 = object.getHash(); | ||||
|                 File file = new File(assets, "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1); | ||||
|                 if (!file.exists() || !Checksum.equals(file, sha1)) { | ||||
|                     this.getLogger().debug(":downloading asset " + entry.getKey()); | ||||
|                     FileUtils.copyURLToFile(new URL(Constants.RESOURCES_BASE + sha1.substring(0, 2) + "/" + sha1), file); | ||||
|                 } | ||||
|                 String assetName = entry.getKey(); | ||||
|                 int end = assetName.lastIndexOf("/") + 1; | ||||
|                 if (end > 0) { | ||||
|                     assetName = assetName.substring(end, assetName.length()); | ||||
|                 } | ||||
|                 progressLogger.progress(assetName + " - " + position + "/" + totalSize + " (" + (int) ((position / (double) totalSize) * 100) + "%) assets downloaded"); | ||||
|                 position++; | ||||
|             } | ||||
|             progressLogger.completed(); | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										20
									
								
								src/main/java/chorusmc/gradle/task/ExtractNativesTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/main/java/chorusmc/gradle/task/ExtractNativesTask.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| package chorusmc.gradle.task; | ||||
| 
 | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| import org.zeroturnaround.zip.ZipUtil; | ||||
| import chorusmc.gradle.util.Constants; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| 
 | ||||
| public class ExtractNativesTask extends DefaultTask { | ||||
|     @TaskAction | ||||
|     public void extractNatives() throws FileNotFoundException { | ||||
|         if (!Constants.MINECRAFT_NATIVES.exists()) { | ||||
|             for (File source : getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES)) { | ||||
|                 ZipUtil.unpack(source, Constants.MINECRAFT_NATIVES); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										167
									
								
								src/main/java/chorusmc/gradle/task/GenIdeaProjectTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								src/main/java/chorusmc/gradle/task/GenIdeaProjectTask.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,167 @@ | |||
| package chorusmc.gradle.task; | ||||
| 
 | ||||
| import chorusmc.gradle.ChorusGradleExtension; | ||||
| import chorusmc.gradle.util.Constants; | ||||
| import chorusmc.gradle.util.IdeaRunConfig; | ||||
| import chorusmc.gradle.util.Version; | ||||
| import com.google.gson.Gson; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| import org.w3c.dom.Document; | ||||
| import org.w3c.dom.Element; | ||||
| import org.w3c.dom.Node; | ||||
| import org.w3c.dom.NodeList; | ||||
| import org.xml.sax.SAXException; | ||||
| 
 | ||||
| import javax.xml.parsers.DocumentBuilder; | ||||
| import javax.xml.parsers.DocumentBuilderFactory; | ||||
| import javax.xml.parsers.ParserConfigurationException; | ||||
| import javax.xml.transform.OutputKeys; | ||||
| import javax.xml.transform.Transformer; | ||||
| import javax.xml.transform.TransformerException; | ||||
| import javax.xml.transform.TransformerFactory; | ||||
| import javax.xml.transform.dom.DOMSource; | ||||
| import javax.xml.transform.stream.StreamResult; | ||||
| import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| public class GenIdeaProjectTask extends DefaultTask { | ||||
|     @TaskAction | ||||
|     public void genIdeaRuns() throws IOException, ParserConfigurationException, SAXException, TransformerException { | ||||
|         ChorusGradleExtension extension = this.getProject().getExtensions().getByType(ChorusGradleExtension.class); | ||||
| 
 | ||||
|         File file = new File(getProject().getName() + ".iml"); | ||||
|         DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); | ||||
|         DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); | ||||
|         Document doc = docBuilder.parse(file); | ||||
| 
 | ||||
|         Node component = null; | ||||
|         NodeList module = doc.getElementsByTagName("module").item(0).getChildNodes(); | ||||
|         for (int i = 0; i < module.getLength(); i++) { | ||||
|             if (module.item(i).getNodeName().equals("component")) { | ||||
|                 component = module.item(i); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (component == null) { | ||||
|             this.getLogger().lifecycle(":failed to generate intellij run configurations"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         Node content = null; | ||||
|         NodeList moduleList = component.getChildNodes(); | ||||
| 
 | ||||
|         for (int i = 0; i < moduleList.getLength(); i++) { | ||||
|             if (moduleList.item(i).getNodeName().equals("content")) { | ||||
|                 content = moduleList.item(i); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (content == null) { | ||||
|             this.getLogger().lifecycle(":failed to generate intellij run configurations"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         Element sourceFolder = doc.createElement("sourceFolder"); | ||||
|         sourceFolder.setAttribute("url", "file://$MODULE_DIR$/minecraft/src/main/java"); | ||||
|         sourceFolder.setAttribute("isTestSource", "false"); | ||||
|         content.appendChild(sourceFolder); | ||||
| 
 | ||||
|         sourceFolder = doc.createElement("sourceFolder"); | ||||
|         sourceFolder.setAttribute("url", "file://$MODULE_DIR$/minecraft/src/main/resources"); | ||||
|         sourceFolder.setAttribute("type", "java-resource"); | ||||
|         content.appendChild(sourceFolder); | ||||
| 
 | ||||
|         Gson gson = new Gson(); | ||||
| 
 | ||||
|         Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 
 | ||||
|         for (Version.Library library : version.libraries) { | ||||
|             if (library.allowed() && library.getFile() != null && library.getFile().exists()) { | ||||
|                 Element node = doc.createElement("orderEntry"); | ||||
|                 node.setAttribute("type", "module-library"); | ||||
|                 Element libraryElement = doc.createElement("library"); | ||||
|                 Element classes = doc.createElement("CLASSES"); | ||||
|                 Element javadoc = doc.createElement("JAVADOC"); | ||||
|                 Element sources = doc.createElement("SOURCES"); | ||||
|                 Element root = doc.createElement("root"); | ||||
|                 root.setAttribute("url", "jar://" + library.getFile().getAbsolutePath() + "!/"); | ||||
|                 classes.appendChild(root); | ||||
|                 libraryElement.appendChild(classes); | ||||
|                 libraryElement.appendChild(javadoc); | ||||
|                 libraryElement.appendChild(sources); | ||||
|                 node.appendChild(libraryElement); | ||||
|                 component.appendChild(node); | ||||
|             } else if (!library.allowed()) { | ||||
|                 this.getLogger().info(":" + library.getFile().getName() + " is not allowed on this os"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         Element node = doc.createElement("orderEntry"); | ||||
|         node.setAttribute("type", "module-library"); | ||||
|         Element libraryElement = doc.createElement("library"); | ||||
|         Element classes = doc.createElement("CLASSES"); | ||||
|         Element javadoc = doc.createElement("JAVADOC"); | ||||
|         Element sources = doc.createElement("SOURCES"); | ||||
|         Element root = doc.createElement("root"); | ||||
|         root.setAttribute("url", "jar://" + Constants.MINECRAFT_CLIENT_MAPPED_JAR.get(extension).getAbsolutePath() + "!/"); | ||||
|         classes.appendChild(root); | ||||
|         libraryElement.appendChild(classes); | ||||
|         libraryElement.appendChild(javadoc); | ||||
|         libraryElement.appendChild(sources); | ||||
|         node.appendChild(libraryElement); | ||||
|         component.appendChild(node); | ||||
| 
 | ||||
|         TransformerFactory transformerFactory = TransformerFactory.newInstance(); | ||||
|         Transformer transformer = transformerFactory.newTransformer(); | ||||
|         DOMSource source = new DOMSource(doc); | ||||
|         StreamResult result = new StreamResult(file); | ||||
|         transformer.setOutputProperty(OutputKeys.INDENT, "yes"); | ||||
|         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); | ||||
|         transformer.transform(source, result); | ||||
| 
 | ||||
|         file = new File(getProject().getName() + ".iws"); | ||||
|         docFactory = DocumentBuilderFactory.newInstance(); | ||||
|         docBuilder = docFactory.newDocumentBuilder(); | ||||
|         doc = docBuilder.parse(file); | ||||
| 
 | ||||
|         NodeList list = doc.getElementsByTagName("component"); | ||||
|         Element runManager = null; | ||||
|         for (int i = 0; i < list.getLength(); i++) { | ||||
|             Element element = (Element) list.item(i); | ||||
|             if (element.getAttribute("name").equals("RunManager")) { | ||||
|                 runManager = element; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (runManager == null) { | ||||
|             this.getLogger().lifecycle(":failed to generate intellij run configurations"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         IdeaRunConfig ideaClient = new IdeaRunConfig(); | ||||
|         ideaClient.mainClass = "chorusmc.base.ClientStart"; | ||||
|         ideaClient.projectName = getProject().getName(); | ||||
|         ideaClient.configName = "Minecraft Client"; | ||||
|         ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; | ||||
|         ideaClient.arguments = "--assetIndex " + version.assetIndex.id + " --assetsDir " + new File(Constants.CACHE_FILES, "assets").getAbsolutePath(); | ||||
| 
 | ||||
|         runManager.appendChild(ideaClient.genRuns(runManager)); | ||||
| 
 | ||||
|         transformerFactory = TransformerFactory.newInstance(); | ||||
|         transformer = transformerFactory.newTransformer(); | ||||
|         source = new DOMSource(doc); | ||||
|         result = new StreamResult(file); | ||||
|         transformer.setOutputProperty(OutputKeys.INDENT, "yes"); | ||||
|         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); | ||||
|         transformer.transform(source, result); | ||||
| 
 | ||||
|         File runDir = new File(Constants.WORKING_DIRECTORY, extension.runDir); | ||||
|         if (!runDir.exists()) { | ||||
|             runDir.mkdirs(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										68
									
								
								src/main/java/chorusmc/gradle/task/MapJarsTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/main/java/chorusmc/gradle/task/MapJarsTask.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,68 @@ | |||
| package chorusmc.gradle.task; | ||||
| 
 | ||||
| import cuchaz.enigma.Deobfuscator; | ||||
| import cuchaz.enigma.mapping.MappingsEnigmaReader; | ||||
| import cuchaz.enigma.throwables.MappingParseException; | ||||
| import groovy.lang.Closure; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| import org.gradle.process.ExecResult; | ||||
| import org.gradle.process.JavaExecSpec; | ||||
| import chorusmc.gradle.ChorusGradleExtension; | ||||
| import chorusmc.gradle.util.Constants; | ||||
| import org.zeroturnaround.zip.ZipUtil; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.util.jar.JarFile; | ||||
| 
 | ||||
| public class MapJarsTask extends DefaultTask { | ||||
| 
 | ||||
|     Deobfuscator deobfuscator; | ||||
| 
 | ||||
|     @TaskAction | ||||
|     public void mapJars() throws IOException, MappingParseException { | ||||
|         ChorusGradleExtension extension = this.getProject().getExtensions().getByType(ChorusGradleExtension.class); | ||||
|         if(Constants.MINECRAFT_CLIENT_MAPPED_JAR.get(extension).exists()){ | ||||
|             Constants.MINECRAFT_CLIENT_MAPPED_JAR.get(extension).delete(); | ||||
|         } | ||||
|         this.getLogger().lifecycle(":unpacking mappings"); | ||||
|         if(Constants.MAPPINGS_DIR.exists()){ | ||||
|             FileUtils.deleteDirectory(Constants.MAPPINGS_DIR); | ||||
|         } | ||||
|         ZipUtil.unpack(Constants.MAPPINGS_ZIP, Constants.MAPPINGS_DIR); | ||||
| 
 | ||||
|         this.getLogger().lifecycle(":remapping jar"); | ||||
|         deobfuscator = new Deobfuscator(new JarFile(Constants.MINECRAFT_CLIENT_JAR.get(extension))); | ||||
|         this.deobfuscator.setMappings(new MappingsEnigmaReader().read(new File(Constants.MAPPINGS_DIR, "pomf-master" + File.separator + "mappings"))); | ||||
|         this.deobfuscator.writeJar(Constants.MINECRAFT_CLIENT_MAPPED_JAR.get(extension), new ProgressListener()); | ||||
| 
 | ||||
|         File tempAssests = new File(Constants.CACHE_FILES, "tempAssets"); | ||||
| 
 | ||||
|         ZipUtil.unpack(Constants.MINECRAFT_CLIENT_JAR.get(extension), tempAssests, name -> { | ||||
|             if (name.startsWith("assets") || name.startsWith("log4j2.xml")) { | ||||
|                 return name; | ||||
|             } else { | ||||
|                 return null; | ||||
|             } | ||||
|         }); | ||||
|         ZipUtil.unpack(Constants.MINECRAFT_CLIENT_MAPPED_JAR.get(extension), tempAssests); | ||||
| 
 | ||||
|         ZipUtil.pack(tempAssests, Constants.MINECRAFT_CLIENT_MAPPED_JAR.get(extension)); | ||||
|     } | ||||
| 
 | ||||
|     public static class ProgressListener implements Deobfuscator.ProgressListener { | ||||
|         @Override | ||||
|         public void init(int i, String s) { | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public void onProgress(int i, String s) { | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										27
									
								
								src/main/java/chorusmc/gradle/util/Checksum.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/main/java/chorusmc/gradle/util/Checksum.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| package chorusmc.gradle.util; | ||||
| 
 | ||||
| import com.google.common.hash.HashCode; | ||||
| import com.google.common.hash.Hashing; | ||||
| import com.google.common.io.Files; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| public class Checksum { | ||||
|     public static boolean equals(File file, String checksum) { | ||||
|         if (file == null) { | ||||
|             return false; | ||||
|         } | ||||
|         try { | ||||
|             HashCode hash = Files.hash(file, Hashing.sha1()); | ||||
|             StringBuilder builder = new StringBuilder(); | ||||
|             for (Byte hashBytes : hash.asBytes()) { | ||||
|                 builder.append(Integer.toString((hashBytes & 0xFF) + 0x100, 16).substring(1)); | ||||
|             } | ||||
|             return builder.toString().equals(checksum); | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										49
									
								
								src/main/java/chorusmc/gradle/util/Constants.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								src/main/java/chorusmc/gradle/util/Constants.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,49 @@ | |||
| package chorusmc.gradle.util; | ||||
| 
 | ||||
| import chorusmc.gradle.util.delayed.IDelayed; | ||||
| import chorusmc.gradle.util.delayed.DelayedFile; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class Constants { | ||||
|     public static final File WORKING_DIRECTORY = new File("."); | ||||
|     public static final File CACHE_FILES = new File(WORKING_DIRECTORY, ".gradle/minecraft"); | ||||
| 
 | ||||
|     public static final IDelayed<File> MINECRAFT_CLIENT_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-client.jar")); | ||||
|     public static final IDelayed<File> MINECRAFT_CLIENT_MAPPED_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-client-mapped.jar")); | ||||
| 
 | ||||
|     public static final File MAPPINGS_ZIP = new File(CACHE_FILES, "mappings.zip"); | ||||
|     public static final File MAPPINGS_DIR = new File(CACHE_FILES, "mappings"); | ||||
| 
 | ||||
|     public static final File MINECRAFT_LIBS = new File(CACHE_FILES, "libs"); | ||||
|     public static final File MINECRAFT_NATIVES = new File(CACHE_FILES, "natives"); | ||||
|     public static final IDelayed<File> MINECRAFT_JSON = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-info.json")); | ||||
| 
 | ||||
|     public static final File MINECRAFT_ROOT = new File(WORKING_DIRECTORY, "minecraft"); | ||||
|     public static final IDelayed<File> MAPPING_SRG = new DelayedFile(extension -> new File(WORKING_DIRECTORY, "mappings.srg")); | ||||
| 
 | ||||
|     public static final File VERSION_MANIFEST = new File(CACHE_FILES, "version_manifest.json"); | ||||
| 
 | ||||
|     public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/"; | ||||
|     public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/"; | ||||
| 
 | ||||
|     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"; | ||||
| 
 | ||||
|     public static final String CONFIG_NATIVES = "MC_NATIVES"; | ||||
|     public static final String CONFIG_MC_DEPENDENCIES = "MC_DEPENDENCIES"; | ||||
|     public static final String CONFIG_MC_DEPENDENCIES_CLIENT = "MC_DEPENDENCIES_CLIENT"; | ||||
|     public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; | ||||
| 
 | ||||
|     public static List<String> getClassPath() { | ||||
|         URL[] urls = ((URLClassLoader) Constants.class.getClassLoader()).getURLs(); | ||||
|         ArrayList<String> list = new ArrayList<>(); | ||||
|         for (URL url : urls) { | ||||
|             list.add(url.getPath()); | ||||
|         } | ||||
|         return list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										48
									
								
								src/main/java/chorusmc/gradle/util/IdeaRunConfig.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/main/java/chorusmc/gradle/util/IdeaRunConfig.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | |||
| package chorusmc.gradle.util; | ||||
| 
 | ||||
| import com.google.common.base.Strings; | ||||
| import com.google.common.collect.ImmutableMap; | ||||
| import org.w3c.dom.Document; | ||||
| import org.w3c.dom.Element; | ||||
| import org.w3c.dom.Node; | ||||
| 
 | ||||
| import javax.xml.parsers.ParserConfigurationException; | ||||
| import javax.xml.transform.TransformerException; | ||||
| import java.io.IOException; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| public class IdeaRunConfig { | ||||
|     public String configName; | ||||
|     public String projectName; | ||||
|     public String mainClass; | ||||
|     public String runDir; | ||||
|     public String arguments; | ||||
| 
 | ||||
|     public Element genRuns(Element doc) throws IOException, ParserConfigurationException, TransformerException { | ||||
|         Element root = this.addXml(doc, "component", ImmutableMap.of("name", "ProjectRunConfigurationManager")); | ||||
|         root = addXml(root, "configuration", ImmutableMap.of("default", "false", "name", configName, "type", "Application", "factoryName", "Application")); | ||||
| 
 | ||||
|         this.addXml(root, "module", ImmutableMap.of("name", projectName)); | ||||
|         this.addXml(root, "option", ImmutableMap.of("name", "MAIN_CLASS_NAME", "value", mainClass)); | ||||
|         this.addXml(root, "option", ImmutableMap.of("name", "WORKING_DIRECTORY", "value", runDir)); | ||||
| 
 | ||||
|         if (!Strings.isNullOrEmpty(arguments)) { | ||||
|             this.addXml(root, "option", ImmutableMap.of("name", "PROGRAM_PARAMETERS", "value", arguments)); | ||||
|         } | ||||
|         return root; | ||||
|     } | ||||
| 
 | ||||
|     public Element addXml(Node parent, String name, Map<String, String> values) { | ||||
|         Document doc = parent.getOwnerDocument(); | ||||
|         if (doc == null) { | ||||
|             doc = (Document) parent; | ||||
|         } | ||||
| 
 | ||||
|         Element e = doc.createElement(name); | ||||
|         for (Map.Entry<String, String> entry : values.entrySet()) { | ||||
|             e.setAttribute(entry.getKey(), entry.getValue()); | ||||
|         } | ||||
|         parent.appendChild(e); | ||||
|         return e; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										12
									
								
								src/main/java/chorusmc/gradle/util/ManifestVersion.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/main/java/chorusmc/gradle/util/ManifestVersion.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| package chorusmc.gradle.util; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class ManifestVersion { | ||||
|     public List<Versions> versions = new ArrayList<>(); | ||||
| 
 | ||||
|     public static class Versions { | ||||
|         public String id, url; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										26
									
								
								src/main/java/chorusmc/gradle/util/OperatingSystem.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/main/java/chorusmc/gradle/util/OperatingSystem.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| package chorusmc.gradle.util; | ||||
| 
 | ||||
| public class OperatingSystem { | ||||
|     public static String getOS() { | ||||
|         String osName = System.getProperty("os.name").toLowerCase(); | ||||
|         if (osName.contains("win")) { | ||||
|             return "windows"; | ||||
|         } else if (osName.contains("mac")) { | ||||
|             return "osx"; | ||||
|         } else { | ||||
|             return "linux"; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static String getArch() { | ||||
|         if (is64Bit()) { | ||||
|             return "64"; | ||||
|         } else { | ||||
|             return "32"; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static boolean is64Bit() { | ||||
|         return System.getProperty("sun.arch.data.model").contains("64"); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										135
									
								
								src/main/java/chorusmc/gradle/util/Version.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								src/main/java/chorusmc/gradle/util/Version.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,135 @@ | |||
| package chorusmc.gradle.util; | ||||
| 
 | ||||
| import com.google.gson.JsonObject; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| public class Version { | ||||
|     public List<Library> libraries; | ||||
|     public Map<String, Downloads> downloads; | ||||
|     public AssetIndex assetIndex; | ||||
| 
 | ||||
|     public class Downloads { | ||||
|         public String url; | ||||
|         public String sha1; | ||||
|     } | ||||
| 
 | ||||
|     public class AssetIndex { | ||||
|         public String id; | ||||
|         public String sha1; | ||||
|         public String url; | ||||
|     } | ||||
| 
 | ||||
|     public class Library { | ||||
|         public String name; | ||||
|         public JsonObject natives; | ||||
|         public JsonObject downloads; | ||||
|         private Artifact artifact; | ||||
|         public Rule[] rules; | ||||
| 
 | ||||
|         public String getURL() { | ||||
|             String path; | ||||
|             String[] parts = this.name.split(":", 3); | ||||
|             path = parts[0].replace(".", "/") + "/" + parts[1] + "/" + parts[2] + "/" + parts[1] + "-" + parts[2] + getClassifier() + ".jar"; | ||||
|             return Constants.LIBRARIES_BASE + path; | ||||
|         } | ||||
| 
 | ||||
|         public File getFile() { | ||||
|             String[] parts = this.name.split(":", 3); | ||||
|             return new File(Constants.MINECRAFT_LIBS, parts[0].replace(".", File.separator) + File.separator + parts[1] + File.separator + parts[2] + File.separator + parts[1] + "-" + parts[2] + getClassifier() + ".jar"); | ||||
|         } | ||||
| 
 | ||||
|         public String getSha1() { | ||||
|             if (this.downloads == null) { | ||||
|                 return ""; | ||||
|             } else if (this.downloads.getAsJsonObject("artifact") == null) { | ||||
|                 return ""; | ||||
|             } else if (this.downloads.getAsJsonObject("artifact").get("sha1") == null) { | ||||
|                 return ""; | ||||
|             } else { | ||||
|                 return this.downloads.getAsJsonObject("artifact").get("sha1").getAsString(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public String getClassifier() { | ||||
|             if (natives == null) { | ||||
|                 return ""; | ||||
|             } else { | ||||
|                 return "-" + natives.get(OperatingSystem.getOS().replace("${arch}", OperatingSystem.getArch())).getAsString().replace("\"", ""); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public boolean allowed() { | ||||
|             if (this.rules == null || this.rules.length <= 0) { | ||||
|                 return true; | ||||
|             } | ||||
| 
 | ||||
|             boolean success = false; | ||||
|             for (Rule rule : this.rules) { | ||||
|                 if (rule.os != null && rule.os.name != null) { | ||||
|                     if (rule.os.name.equalsIgnoreCase(OperatingSystem.getOS())) { | ||||
|                         return rule.action.equalsIgnoreCase("allow"); | ||||
|                     } | ||||
|                 } else { | ||||
|                     success = rule.action.equalsIgnoreCase("allow"); | ||||
|                 } | ||||
|             } | ||||
|             return success; | ||||
|         } | ||||
| 
 | ||||
|         public String getArtifactName() { | ||||
|             if (artifact == null) { | ||||
|                 artifact = new Artifact(name); | ||||
|             } | ||||
|             return artifact.getArtifact(natives == null ? artifact.getClassifier() : natives.get(OperatingSystem.getOS()).getAsString()); | ||||
|         } | ||||
| 
 | ||||
|         private class Artifact { | ||||
|             private final String domain, name, version, classifier, ext; | ||||
| 
 | ||||
|             public Artifact(String name) { | ||||
|                 String[] splitedArtifact = name.split(":"); | ||||
|                 int idx = splitedArtifact[splitedArtifact.length - 1].indexOf('@'); | ||||
|                 if (idx != -1) { | ||||
|                     ext = splitedArtifact[splitedArtifact.length - 1].substring(idx + 1); | ||||
|                     splitedArtifact[splitedArtifact.length - 1] = splitedArtifact[splitedArtifact.length - 1].substring(0, idx); | ||||
|                 } else { | ||||
|                     ext = "jar"; | ||||
|                 } | ||||
|                 this.domain = splitedArtifact[0]; | ||||
|                 this.name = splitedArtifact[1]; | ||||
|                 this.version = splitedArtifact[2]; | ||||
|                 this.classifier = splitedArtifact.length > 3 ? splitedArtifact[3] : null; | ||||
|             } | ||||
| 
 | ||||
|             public String getArtifact(String classifier) { | ||||
|                 String ret = domain + ":" + name + ":" + version; | ||||
|                 if (classifier != null && classifier.indexOf('$') > -1) { | ||||
|                     classifier = classifier.replace("${arch}", Constants.SYSTEM_ARCH); | ||||
|                 } | ||||
|                 if (classifier != null) { | ||||
|                     ret += ":" + classifier; | ||||
|                 } | ||||
|                 if (!"jar".equals(ext)) { | ||||
|                     ret += "@" + ext; | ||||
|                 } | ||||
|                 return ret; | ||||
|             } | ||||
| 
 | ||||
|             public String getClassifier() { | ||||
|                 return classifier; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private class Rule { | ||||
|         public String action; | ||||
|         public OS os; | ||||
| 
 | ||||
|         private class OS { | ||||
|             String name; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										27
									
								
								src/main/java/chorusmc/gradle/util/assets/AssetIndex.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/main/java/chorusmc/gradle/util/assets/AssetIndex.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| package chorusmc.gradle.util.assets; | ||||
| 
 | ||||
| import java.util.HashSet; | ||||
| import java.util.LinkedHashMap; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| public class AssetIndex { | ||||
|     private final Map<String, AssetObject> objects; | ||||
|     private boolean virtual; | ||||
| 
 | ||||
|     public AssetIndex() { | ||||
|         this.objects = new LinkedHashMap<>(); | ||||
|     } | ||||
| 
 | ||||
|     public Map<String, AssetObject> getFileMap() { | ||||
|         return this.objects; | ||||
|     } | ||||
| 
 | ||||
|     public Set<AssetObject> getUniqueObjects() { | ||||
|         return new HashSet<>(this.objects.values()); | ||||
|     } | ||||
| 
 | ||||
|     public boolean isVirtual() { | ||||
|         return this.virtual; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								src/main/java/chorusmc/gradle/util/assets/AssetObject.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/main/java/chorusmc/gradle/util/assets/AssetObject.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| package chorusmc.gradle.util.assets; | ||||
| 
 | ||||
| public class AssetObject { | ||||
|     private String hash; | ||||
|     private long size; | ||||
| 
 | ||||
|     public String getHash() { | ||||
|         return this.hash; | ||||
|     } | ||||
| 
 | ||||
|     public long getSize() { | ||||
|         return this.size; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean equals(Object o) { | ||||
|         if (this == o) { | ||||
|             return true; | ||||
|         } else if ((o == null) || (getClass() != o.getClass())) { | ||||
|             return false; | ||||
|         } else { | ||||
|             AssetObject that = (AssetObject) o; | ||||
|             return this.size == that.size && this.hash.equals(that.hash); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int result = this.hash.hashCode(); | ||||
|         result = 31 * result + (int) (this.size ^ this.size >>> 32); | ||||
|         return result; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										23
									
								
								src/main/java/chorusmc/gradle/util/delayed/DelayedFile.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/main/java/chorusmc/gradle/util/delayed/DelayedFile.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| package chorusmc.gradle.util.delayed; | ||||
| 
 | ||||
| import chorusmc.gradle.ChorusGradleExtension; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.function.Function; | ||||
| 
 | ||||
| public class DelayedFile implements IDelayed<File> { | ||||
|     private File file; | ||||
|     private Function<ChorusGradleExtension, File> function; | ||||
| 
 | ||||
|     public DelayedFile(Function<ChorusGradleExtension, File> function) { | ||||
|         this.function = function; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public File get(ChorusGradleExtension extension) { | ||||
|         if (this.file == null) { | ||||
|             this.file = this.function.apply(extension); | ||||
|         } | ||||
|         return this.file; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								src/main/java/chorusmc/gradle/util/delayed/IDelayed.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/main/java/chorusmc/gradle/util/delayed/IDelayed.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| package chorusmc.gradle.util.delayed; | ||||
| 
 | ||||
| import chorusmc.gradle.ChorusGradleExtension; | ||||
| 
 | ||||
| public interface IDelayed<T> { | ||||
|     T get(ChorusGradleExtension extension); | ||||
| } | ||||
							
								
								
									
										206
									
								
								src/main/java/chorusmc/gradle/util/progress/ProgressLogger.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								src/main/java/chorusmc/gradle/util/progress/ProgressLogger.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,206 @@ | |||
| package chorusmc.gradle.util.progress; | ||||
| 
 | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.lang.reflect.Method; | ||||
| 
 | ||||
| /** | ||||
|  * Wrapper to ProgressLogger internal API | ||||
|  */ | ||||
| public class ProgressLogger { | ||||
|     private final Object logger; | ||||
|     private final Method getDescription, setDescription, getShortDescription, setShortDescription, getLoggingHeader, setLoggingHeader, start, started, startedArg, progress, completed, completedArg; | ||||
| 
 | ||||
|     private ProgressLogger(Object logger) { | ||||
|         this.logger = logger; | ||||
|         this.getDescription = getMethod("getDescription"); | ||||
|         this.setDescription = getMethod("setDescription", String.class); | ||||
|         this.getShortDescription = getMethod("getShortDescription"); | ||||
|         this.setShortDescription = getMethod("setShortDescription", String.class); | ||||
|         this.getLoggingHeader = getMethod("getLoggingHeader"); | ||||
|         this.setLoggingHeader = getMethod("setLoggingHeader", String.class); | ||||
|         this.start = getMethod("start", String.class, String.class); | ||||
|         this.started = getMethod("started"); | ||||
|         this.startedArg = getMethod("started", String.class); | ||||
|         this.progress = getMethod("progress", String.class); | ||||
|         this.completed = getMethod("completed"); | ||||
|         this.completedArg = getMethod("completed", String.class); | ||||
|     } | ||||
| 
 | ||||
|     private static Class<?> getFactoryClass() { | ||||
|         Class<?> progressLoggerFactoryClass = null; | ||||
|         try { | ||||
|             //Gradle 2.14 and higher | ||||
|             progressLoggerFactoryClass = Class.forName("org.gradle.internal.logging.progress.ProgressLoggerFactory"); | ||||
|         } catch (ClassNotFoundException e) { | ||||
|             //prior to Gradle 2.14 | ||||
|             try { | ||||
|                 progressLoggerFactoryClass = Class.forName("org.gradle.logging.ProgressLoggerFactory"); | ||||
|             } catch (ClassNotFoundException e1) { | ||||
|                 // Unsupported Gradle version | ||||
|             } | ||||
|         } | ||||
|         return progressLoggerFactoryClass; | ||||
|     } | ||||
| 
 | ||||
|     private Method getMethod(String methodName, Class<?>... args) { | ||||
|         if (logger != null) { | ||||
|             try { | ||||
|                 return logger.getClass().getMethod(methodName, args); | ||||
|             } catch (NoSuchMethodException ignored) { | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     private Object invoke(Method method, Object... args) { | ||||
|         if (logger != null) { | ||||
|             try { | ||||
|                 method.setAccessible(true); | ||||
|                 return method.invoke(logger, args); | ||||
|             } catch (IllegalAccessException | InvocationTargetException ignored) { | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get a Progress logger from the Gradle internal API | ||||
|      * | ||||
|      * @param project  The project | ||||
|      * @param category The logger category | ||||
|      * @return In any case a progress logger | ||||
|      */ | ||||
|     public static ProgressLogger getProgressFactory(Project project, String category) { | ||||
|         try { | ||||
|             Method getServices = project.getClass().getMethod("getServices"); | ||||
|             Object serviceFactory = getServices.invoke(project); | ||||
|             Method get = serviceFactory.getClass().getMethod("get", Class.class); | ||||
|             Object progressLoggerFactory = get.invoke(serviceFactory, getFactoryClass()); | ||||
|             Method newOperation = progressLoggerFactory.getClass().getMethod("newOperation", String.class); | ||||
|             return new ProgressLogger(newOperation.invoke(progressLoggerFactory, category)); | ||||
|         } catch (Exception e) { | ||||
|             project.getLogger().error("Unable to get progress logger. Download progress will not be displayed."); | ||||
|             return new ProgressLogger(null); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns the description of the operation. | ||||
|      * | ||||
|      * @return the description, must not be empty. | ||||
|      */ | ||||
|     public String getDescription() { | ||||
|         return (String) invoke(getDescription); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * <p>Sets the description of the operation. This should be a full, stand-alone description of the operation. | ||||
|      * <p> | ||||
|      * <p>This must be called before {@link #started()}. | ||||
|      * | ||||
|      * @param description The description. | ||||
|      */ | ||||
|     public ProgressLogger setDescription(String description) { | ||||
|         invoke(setDescription, description); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns the short description of the operation. This is used in place of the full description when display space is limited. | ||||
|      * | ||||
|      * @return The short description, must not be empty. | ||||
|      */ | ||||
|     public String getShortDescription() { | ||||
|         return (String) invoke(getShortDescription); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * <p>Sets the short description of the operation. This is used in place of the full description when display space is limited. | ||||
|      * <p> | ||||
|      * <p>This must be called before {@link #started()} | ||||
|      * | ||||
|      * @param description The short description. | ||||
|      */ | ||||
|     public ProgressLogger setShortDescription(String description) { | ||||
|         invoke(setShortDescription, description); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * <p>Returns the logging header for the operation. This is logged before any other log messages for this operation are logged. It is usually | ||||
|      * also logged at the end of the operation, along with the final status message. Defaults to null. | ||||
|      * <p> | ||||
|      * <p>If not specified, no logging header is logged. | ||||
|      * | ||||
|      * @return The logging header, possibly empty. | ||||
|      */ | ||||
|     public String getLoggingHeader() { | ||||
|         return (String) invoke(getLoggingHeader); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * <p>Sets the logging header for the operation. This is logged before any other log messages for this operation are logged. It is usually | ||||
|      * also logged at the end of the operation, along with the final status message. Defaults to null. | ||||
|      * | ||||
|      * @param header The header. May be empty or null. | ||||
|      */ | ||||
|     public ProgressLogger setLoggingHeader(String header) { | ||||
|         invoke(setLoggingHeader, header); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Convenience method that sets descriptions and logs started() event. | ||||
|      * | ||||
|      * @return this logger instance | ||||
|      */ | ||||
|     public ProgressLogger start(String description, String shortDescription) { | ||||
|         invoke(start, description, shortDescription); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Logs the start of the operation, with no initial status. | ||||
|      */ | ||||
|     public void started() { | ||||
|         invoke(started); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Logs the start of the operation, with the given status. | ||||
|      * | ||||
|      * @param status The initial status message. Can be null or empty. | ||||
|      */ | ||||
|     public void started(String status) { | ||||
|         invoke(started, status); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Logs some progress, indicated by a new status. | ||||
|      * | ||||
|      * @param status The new status message. Can be null or empty. | ||||
|      */ | ||||
|     public void progress(String status) { | ||||
|         invoke(progress, status); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Logs the completion of the operation, with no final status | ||||
|      */ | ||||
|     public void completed() { | ||||
|         invoke(completed); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Logs the completion of the operation, with a final status. This is generally logged along with the description. | ||||
|      * | ||||
|      * @param status The final status message. Can be null or empty. | ||||
|      */ | ||||
|     public void completed(String status) { | ||||
|         invoke(completed, status); | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1 @@ | |||
| implementation-class=chorusmc.gradle.ChorusGradlePlugin | ||||
		Loading…
	
		Reference in a new issue