From d1d2c415bf3ab8277ac6a25ead5deac366e00068 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Sat, 8 Jul 2023 00:53:21 -0300 Subject: [PATCH] wip --- build.gradle | 1078 +++++++++++++++-- gradle.properties | 120 +- gradle/scripts/artifacts.gradle | 75 -- gradle/scripts/dependencies.gradle | 120 -- gradle/scripts/optional.gradle | 31 +- gradle/wrapper/gradle-wrapper.jar | Bin 54708 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 302 +++-- src/api/java/appeng/api/package-info.java | 2 +- src/main/java/appeng/core/AEConfig.java | 4 +- ...peng_at.cfg => appliedenergistics2_at.cfg} | 0 11 files changed, 1312 insertions(+), 423 deletions(-) delete mode 100644 gradle/scripts/artifacts.gradle delete mode 100644 gradle/scripts/dependencies.gradle rename src/main/resources/{appeng_at.cfg => appliedenergistics2_at.cfg} (100%) diff --git a/build.gradle b/build.gradle index d77e9e839..6fad5b63f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,126 +1,1020 @@ /* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . + * DO NOT CHANGE THIS FILE! + * Also, you may replace this file at any time if there is an update available. + * Please check https://github.com/GregTechCEu/Buildscripts/blob/master/build.gradle for updates. + * You can also run ./gradlew updateBuildScript to update your buildscript. */ -buildscript { - repositories { - mavenLocal() - jcenter() - mavenCentral() +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.gtnewhorizons.retrofuturagradle.mcp.ReobfuscatedJar +import com.modrinth.minotaur.dependencies.ModDependency +import com.modrinth.minotaur.dependencies.VersionDependency +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.gradle.api.tasks.testing.logging.TestLogEvent +import org.gradle.internal.logging.text.StyledTextOutputFactory +import org.jetbrains.gradle.ext.Gradle - maven { - name = "forge" - url = "http://files.minecraftforge.net/maven" - } - } - dependencies { - classpath("com.anatawa12.forge:ForgeGradle:2.3-1.0.+") { - changing = true - } - } -} +import static org.gradle.internal.logging.text.StyledTextOutput.Style plugins { - id "org.sonarqube" version "2.6" + id 'java' + id 'java-library' + id 'eclipse' + id 'maven-publish' + id 'org.jetbrains.gradle.plugin.idea-ext' version '1.1.7' + id 'com.gtnewhorizons.retrofuturagradle' version '1.3.19' + id 'net.darkhax.curseforgegradle' version '1.0.14' apply false + id 'com.modrinth.minotaur' version '2.8.0' apply false + id 'com.diffplug.spotless' version '6.13.0' apply false + id 'com.palantir.git-version' version '3.0.0' apply false + id 'com.github.johnrengelman.shadow' version '8.1.1' apply false } -apply plugin: 'net.minecraftforge.gradle.forge' -apply plugin: 'jacoco' - -repositories { - mavenLocal() - jcenter() - mavenCentral() +if (verifySettingsGradle()) { + throw new GradleException("Settings has been updated, please re-run task.") } -apply from: 'gradle/scripts/dependencies.gradle' -apply from: 'gradle/scripts/artifacts.gradle' -apply from: 'gradle/scripts/optional.gradle' +def out = services.get(StyledTextOutputFactory).create('an-output') -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +// Project properties -// ensure everything uses UTF-8 and not some random codepage chosen by gradle -compileJava.options.encoding = 'UTF-8' -tasks.withType(JavaCompile) { +// Required properties: we don't know how to handle these being missing gracefully +checkPropertyExists("modName") +checkPropertyExists("modId") +checkPropertyExists("modGroup") +checkPropertyExists("minecraftVersion") // hard-coding this makes it harder to immediately tell what version a mod is in (even though this only really supports 1.12.2) +checkPropertyExists("apiPackage") +checkPropertyExists("accessTransformersFile") +checkPropertyExists("usesMixins") +checkPropertyExists("mixinsPackage") +checkPropertyExists("coreModClass") +checkPropertyExists("containsMixinsAndOrCoreModOnly") + +propertyDefaultIfUnset("customMavenPublishUrl", "") + +// Project property assertions + +final String javaSourceDir = 'src/main/java/' +final String scalaSourceDir = 'src/main/scala/' +// If Kotlin is supported, add the path here + +final String modGroupPath = modGroup.toString().replace('.' as char, '/' as char) +final String apiPackagePath = apiPackage.toString().replace('.' as char, '/' as char) + +String targetPackageJava = javaSourceDir + modGroupPath +String targetPackageScala = scalaSourceDir + modGroupPath + +// If Kotlin is supported, add the path here + +if (!getFile(targetPackageJava).exists() && !getFile(targetPackageScala).exists()) { + throw new GradleException("Could not resolve \"modGroup\"! Could not find ${targetPackageJava} or ${targetPackageScala}") +} + +if (apiPackage) { + targetPackageJava = 'src/api/java/' + modGroupPath + targetPackageScala = 'src/api/java/' + modGroupPath + if (!getFile(targetPackageJava).exists() && !getFile(targetPackageScala).exists()) { + throw new GradleException("Could not resolve \"apiPackage\"! Could not find ${targetPackageJava} or ${targetPackageScala}") + } +} + +if (accessTransformersFile) { + for (atFile in accessTransformersFile.split(",")) { + String targetFile = 'src/main/resources/' + atFile.trim() + if (!getFile(targetFile).exists()) { + throw new GradleException("Could not resolve \"accessTransformersFile\"! Could not find " + targetFile) + } + tasks.deobfuscateMergedJarToSrg.accessTransformerFiles.from(targetFile) + tasks.srgifyBinpatchedJar.accessTransformerFiles.from(targetFile) + } +} + +if (usesMixins.toBoolean()) { + if (mixinsPackage.isEmpty()) { + throw new GradleException("\"usesMixins\" requires \"mixinsPackage\" to be set!") + } + final String mixinPackagePath = mixinsPackage.toString().replaceAll('\\.', '/') + targetPackageJava = javaSourceDir + modGroupPath + '/' + mixinPackagePath + targetPackageScala = scalaSourceDir + modGroupPath + '/' + mixinPackagePath + if (!getFile(targetPackageJava).exists()) { + throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find ${targetPackageJava} or ${targetPackageScala}") + } +} + +if (coreModClass) { + final String coreModPath = coreModClass.toString().replaceAll('\\.', '/') + String targetFileJava = javaSourceDir + modGroupPath + '/' + coreModPath + '.java' + String targetFileScala = scalaSourceDir + modGroupPath + '/' + coreModPath + '.scala' + String targetFileScalaJava = scalaSourceDir + modGroupPath + '/' + coreModPath + '.java' + if (!getFile(targetFileJava).exists() && !getFile(targetFileScala).exists() && !getFile(targetFileScalaJava).exists()) { + throw new GradleException("Could not resolve \"coreModClass\"! Could not find " + targetFileJava) + } +} + +// Plugin application + +// Git version checking, also checking for if this is a submodule +if (project.file('.git/HEAD').isFile() || project.file('.git').isFile()) { + apply plugin: 'com.palantir.git-version' +} + +// Shadowing +if (usesShadowedDependencies.toBoolean()) { + apply plugin: 'com.github.johnrengelman.shadow' +} + +java { + toolchain { + if (enableModernJavaSyntax.toBoolean()) { + languageVersion.set(JavaLanguageVersion.of(17)) + } else { + languageVersion.set(JavaLanguageVersion.of(8)) + } + // Azul covers the most platforms for Java 8+ toolchains, crucially including MacOS arm64 + vendor.set(JvmVendorSpec.AZUL) + } + if (!noPublishedSources.toBoolean()) { + withSourcesJar() + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' + + if (enableModernJavaSyntax.toBoolean()) { + if (it.name in ['compileMcLauncherJava', 'compilePatchedMcJava']) { + return + } + + sourceCompatibility = 17 + options.release.set(8) + + javaCompiler.set(javaToolchains.compilerFor { + languageVersion.set(JavaLanguageVersion.of(17)) + vendor.set(JvmVendorSpec.AZUL) + }) + } +} + +tasks.withType(ScalaCompile).configureEach { options.encoding = 'UTF-8' } -version = aeversion + "-" + aechannel + "-" + aebuild + "-" + extended + "-" + extendedversion -group = aegroup -archivesBaseName = aebasename -// Add Coremod Manifest -jar { - manifest { - attributes 'FMLAT': 'appeng_at.cfg' - attributes "FMLCorePlugin": "appeng.core.AE2ELCore" - attributes "FMLCorePluginContainsFMLMod": "true" +// Allow others using this buildscript to have custom gradle code run +if (getFile('addon.gradle').exists()) { + apply from: 'addon.gradle' +} + +// Configure Minecraft + +// Try to gather mod version from git tags if version is not manually specified +if (!modVersion) { + try { + modVersion = gitVersion() + } catch (Exception ignored) { + out.style(Style.Failure).text( + "Mod version could not be determined! Property 'modVersion' is not set, and either git is not installed or no git tags exist.\n" + + "Either specify a mod version in 'gradle.properties', or create at least one tag in git for this project." + ) + modVersion = 'NO-GIT-TAG-SET' + } +} + +if (includeMCVersionJar.toBoolean()) { + version = "${minecraftVersion}-${modVersion}" +} else { + version = modVersion +} + +group = modGroup +archivesBaseName = modArchivesBaseName + +minecraft { + mcVersion = minecraftVersion + username = developmentEnvironmentUserName.toString() + useDependencyAccessTransformers = true + + setMcpMappingChannel("snapshot") + setMcpMappingVersion("20171003") + + // Automatic token injection with RetroFuturaGradle + if (gradleTokenModId) { + injectedTags.put gradleTokenModId, modId + } + if (gradleTokenModName) { + injectedTags.put gradleTokenModName, modName + } + if (gradleTokenVersion) { + injectedTags.put gradleTokenVersion, modVersion + } + + injectedTags.put("VERSION", project.version) + injectedTags.put("AEVERSION", aeversion) + injectedTags.put("AECHANNEL", aechannel) + injectedTags.put("AEBUILD", aebuild) + + // JVM arguments + extraRunJvmArguments.add("-ea:${modGroup}") + if (usesMixins.toBoolean()) { + extraRunJvmArguments.addAll([ + '-Dmixin.hotSwap=true', + '-Dmixin.checks.interfaces=true', + '-Dmixin.debug.export=true' + ]) + } + if (coreModClass) { + extraRunJvmArguments.add("-Dfml.coreMods.load=${modGroup}.${coreModClass}") + } +} + +if (generateGradleTokenClass) { + tasks.injectTags.outputClassName.set(generateGradleTokenClass) +} + +tasks.named('processIdeaSettings').configure { + dependsOn('injectTags') +} + +tasks.register("generateMcModInfo") { + +} + +tasks.register("generatePackMcMeta") { + +} + +tasks.named('processIdeaSettings').configure { + dependsOn('injectTags') +} + +// Repositories + +// Allow unsafe repos but warn +repositories.configureEach { repo -> + if (repo instanceof UrlArtifactRepository) { + if (repo.getUrl() != null && repo.getUrl().getScheme() == "http" && !repo.allowInsecureProtocol) { + logger.warn("Deprecated: Allowing insecure connections for repo '${repo.name}' - add 'allowInsecureProtocol = true'") + repo.allowInsecureProtocol = true + } + } +} + +// Allow adding custom repositories to the buildscript +if (getFile('repositories.gradle').exists()) { + apply from: 'repositories.gradle' +} + +repositories { + exclusiveContent { + forRepository { + //noinspection ForeignDelegate + maven { + name = 'Curse Maven' + url = 'https://www.cursemaven.com' + } + } + filter { + includeGroup 'curse.maven' + } + } + exclusiveContent { + forRepository { + //noinspection ForeignDelegate + maven { + name = 'Modrinth' + url = 'https://api.modrinth.com/maven' + } + } + filter { + includeGroup 'maven.modrinth' + } + } + maven { + name 'Cleanroom Maven' + url 'https://maven.cleanroommc.com' + } + maven { + name 'BlameJared Maven' + url 'https://maven.blamejared.com' + } + gradlePluginPortal() + mavenCentral() + mavenLocal() +} + +// Dependencies + +// Configure dependency configurations +configurations { + embed + implementation.extendsFrom(embed) + + if (usesShadowedDependencies.toBoolean()) { + for (config in [compileClasspath, runtimeClasspath, testCompileClasspath, testRuntimeClasspath]) { + config.extendsFrom(shadowImplementation) + config.extendsFrom(shadowCompile) + } + } +} + +dependencies { + if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) { + implementation 'zone.rong:mixinbooter:7.0' + String mixin = 'org.spongepowered:mixin:0.8.3' + if (usesMixins.toBoolean()) { + mixin = modUtils.enableMixins(mixin, "mixins.${modId}.refmap.json") + } + + api(mixin) { + transitive = false + } + + annotationProcessor(mixin) { + transitive = false + } + + annotationProcessor 'org.ow2.asm:asm-debug-all:5.2' + // should use 24.1.1 but 30.0+ has a vulnerability fix + annotationProcessor 'com.google.guava:guava:30.0-jre' + // should use 2.8.6 but 2.8.9+ has a vulnerability fix + annotationProcessor 'com.google.code.gson:gson:2.8.9' + } + + if (enableJUnit.toBoolean()) { + testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1' + testImplementation 'org.hamcrest:hamcrest:2.2' + } + + if (enableModernJavaSyntax.toBoolean()) { + annotationProcessor 'com.github.bsideup.jabel:jabel-javac-plugin:1.0.0' + compileOnly('com.github.bsideup.jabel:jabel-javac-plugin:1.0.0') { + transitive = false + } + // workaround for https://github.com/bsideup/jabel/issues/174 + annotationProcessor 'net.java.dev.jna:jna-platform:5.13.0' + // Allow jdk.unsupported classes like sun.misc.Unsafe, workaround for JDK-8206937 and fixes Forge crashes in tests. + patchedMinecraft 'me.eigenraven.java8unsupported:java-8-unsupported-shim:1.0.0' + + // allow Jabel to work in tests + testAnnotationProcessor "com.github.bsideup.jabel:jabel-javac-plugin:1.0.0" + testCompileOnly("com.github.bsideup.jabel:jabel-javac-plugin:1.0.0") { + transitive = false // We only care about the 1 annotation class + } + testCompileOnly "me.eigenraven.java8unsupported:java-8-unsupported-shim:1.0.0" + } + + compileOnlyApi 'org.jetbrains:annotations:23.0.0' + annotationProcessor 'org.jetbrains:annotations:23.0.0' + + if (includeCommonDevEnvMods.toBoolean()) { + implementation 'mezz.jei:jei_1.12.2:4.16.1.302' + //noinspection DependencyNotationArgument + implementation rfg.deobf('curse.maven:top-245211:2667280') // TOP 1.4.28 + } +} + +if (getFile('dependencies.gradle').exists()) { + apply from: 'dependencies.gradle' +} + +apply from: 'gradle/scripts/optional.gradle' + +// Test configuration + +// Ensure tests have access to minecraft classes +sourceSets { + test { + java { + compileClasspath += patchedMc.output + mcLauncher.output + runtimeClasspath += patchedMc.output + mcLauncher.output + } + } +} + +test { + // ensure tests are run with java8 + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(8) + }.get() + + testLogging { + events TestLogEvent.STARTED, TestLogEvent.PASSED, TestLogEvent.FAILED + exceptionFormat TestExceptionFormat.FULL + showExceptions true + showStackTraces true + showCauses true + showStandardStreams true + } + + if (enableJUnit.toBoolean()) { + useJUnitPlatform() + } +} + +// Resource processing and jar building + +processResources { + // this will ensure that this task is redone when the versions change. + inputs.property 'version', modVersion + inputs.property 'mcversion', minecraftVersion + // Blowdryer puts these files into the resource directory, so + // exclude them from builds (doesn't hurt to exclude even if not present) + exclude('spotless.importorder') + exclude('spotless.eclipseformat.xml') + + // replace stuff in mcmod.info, nothing else + filesMatching('mcmod.info') { fcd -> + fcd.expand( + 'version': modVersion, + 'mcversion': minecraftVersion, + 'modid': modId, + 'modname': modName + ) + } + + if (accessTransformersFile) { + String[] ats = accessTransformersFile.split(',') + ats.each { at -> + rename "(${at})", 'META-INF/$1' + } } from sourceSets.api.output dependsOn apiClasses - - // specify which files are really included, can control which APIs should be in - include "appeng/**" - include "assets/**" - include "mcmod.info" - include "pack.mcmeta" - include "META-INF/appeng_at.cfg" } -minecraft { - version = minecraft_version + "-" + forge_version +// Automatically generate a mixin json file if it does not already exist +tasks.register('generateAssets') { + group = 'GT Buildscript' + description = 'Generates a pack.mcmeta, mcmod.info, or mixins.{modid}.json if needed' + doLast { + // pack.mcmeta + def packMcmetaFile = getFile('src/main/resources/pack.mcmeta') + if (!packMcmetaFile.exists()) { + packMcmetaFile.text = """{ + "pack": { + "pack_format": 3, + "description": "${modName} Resource Pack" + } +} +""" + } - replaceIn "AEConfig.java" - replaceIn "package-info.java" + // mcmod.info + def mcmodInfoFile = getFile('src/main/resources/mcmod.info') + if (!mcmodInfoFile.exists()) { + mcmodInfoFile.text = """[{ + "modid": "\${modid}", + "name": "\${modname}", + "description": "A Mod about Matter, Energy and using them to conquer the world..", + "version": "\${version}", + "mcversion": "\${mcversion}", + "logoFile": "assets/appliedenergistics2/meta/logo.png", + "url": "https://github.com/PrototypeTrousers/Applied-Energistics-2", + "authorList": ["AlgorithmX2"], + "credits": "AlgorithmX2", + "dependencies": [] +}] +""" + } - replace "@version@", project.version - replace "@aeversion@", aeversion - replace "@aechannel@", aechannel - replace "@aebuild@", aebuild + // mixins.{modid}.json + if (usesMixins.toBoolean()) { + def mixinConfigFile = getFile("src/main/resources/mixins.${modId}.json") + if (!mixinConfigFile.exists()) { + def mixinConfigRefmap = "mixins.${modId}.refmap.json" - // used when launching minecraft in dev env - runDir = "run" - mappings = mcp_mappings + mixinConfigFile.text = """{ + "package": "${modGroup}.${mixinsPackage}", + "refmap": "${mixinConfigRefmap}", + "target": "@env(DEFAULT)", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": [], + "client": [], + "server": [] +} +""" + } + } + } } -sourceSets { - api - main +tasks.named('processResources').configure { + dependsOn('generateAssets') } -processResources -{ - // this will ensure that this task is redone when the versions change. - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version - - // replace stuff in mcmod.info, nothing else - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - expand 'version': project.version, 'mcversion': project.minecraft.version +jar { + manifest { + attributes(getManifestAttributes()) } - // copy everything else, thats not the mcmod.info - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' + // Add all embedded dependencies into the jar + from provider { + configurations.embed.collect { + it.isDirectory() ? it : zipTree(it) + } + } +} + +// Create API library jar +tasks.register('apiJar', Jar) { + archiveClassifier.set 'api' + from(sourceSets.main.java) { + include "${modGroupPath}/${apiPackagePath}/**" } - // move access transformer to META-INF - rename '(.+_at.cfg)', 'META-INF/$1' + from(sourceSets.main.output) { + include "${modGroupPath}/${apiPackagePath}/**" + } } + +// Configure shadow jar task +if (usesShadowedDependencies.toBoolean()) { + tasks.named('shadowJar', ShadowJar).configure { + manifest { + attributes(getManifestAttributes()) + } + // Only shadow classes that are actually used, if enabled + if (minimizeShadowedDependencies.toBoolean()) { + minimize() + } + configurations = [ + project.configurations.shadowImplementation, + project.configurations.shadowCompile + ] + archiveClassifier.set('dev') + if (relocateShadowedDependencies.toBoolean()) { + relocationPrefix = modGroup + '.shadow' + enableRelocation = true + } + } + configurations.runtimeElements.outgoing.artifacts.clear() + configurations.apiElements.outgoing.artifacts.clear() + configurations.runtimeElements.outgoing.artifact(tasks.named('shadowJar', ShadowJar)) + configurations.apiElements.outgoing.artifact(tasks.named('shadowJar', ShadowJar)) + tasks.named('jar', Jar) { + enabled = false + finalizedBy(tasks.shadowJar) + } + tasks.named('reobfJar', ReobfuscatedJar) { + inputJar.set(tasks.named('shadowJar', ShadowJar).flatMap({ it.archiveFile })) + } + AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants) project.components.findByName('java') + javaComponent.withVariantsFromConfiguration(configurations.shadowRuntimeElements) { + skip() + } + for (runTask in ['runClient', 'runServer']) { + tasks.named(runTask).configure { + dependsOn('shadowJar') + } + } +} + +def getManifestAttributes() { + def attributes = [:] + if (coreModClass) { + attributes['FMLCorePlugin'] = "${modGroup}.${coreModClass}" + } + if (!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) { + attributes['FMLCorePluginContainsFMLMod'] = true + } + if (accessTransformersFile) { + attributes['FMLAT'] = accessTransformersFile.toString() + } + + if (usesMixins.toBoolean()) { + attributes['ForceLoadAsMod'] = !containsMixinsAndOrCoreModOnly.toBoolean() + } + return attributes +} + + +// IDE Configuration + +eclipse { + classpath { + downloadSources = true + downloadJavadoc = true + } +} + +idea { + module { + inheritOutputDirs true + downloadJavadoc true + downloadSources true + } + project { + settings { + runConfigurations { + '1. Setup Workspace'(Gradle) { + taskNames = ['setupDecompWorkspace'] + } + '2. Run Client'(Gradle) { + taskNames = ['runClient'] + } + '3. Run Server'(Gradle) { + taskNames = ['runServer'] + } + '4. Run Obfuscated Client'(Gradle) { + taskNames = ['runObfClient'] + } + '5. Run Obfuscated Server'(Gradle) { + taskNames = ['runObfServer'] + } + if (enableSpotless.toBoolean()) { + '6. Apply Spotless'(Gradle) { + taskNames = ["spotlessApply"] + } + '7. Build Jars'(Gradle) { + taskNames = ['build'] + } + } else { + '6. Build Jars'(Gradle) { + taskNames = ['build'] + } + } + 'Update Buildscript'(Gradle) { + taskNames = ['updateBuildScript'] + } + 'FAQ'(Gradle) { + taskNames = ['faq'] + } + } + compiler.javac { + afterEvaluate { + javacAdditionalOptions = '-encoding utf8' + moduleJavacAdditionalOptions = [ + (project.name + '.main'): tasks.compileJava.options.compilerArgs.collect { + '"' + it + '"' + }.join(' ') + ] + } + } + } + } +} + + +// Deployment +def final modrinthApiKey = providers.environmentVariable('MODRINTH_API_KEY') +def final cfApiKey = providers.environmentVariable('CURSEFORGE_API_KEY') +final boolean isCIEnv = providers.environmentVariable('CI').getOrElse('false').toBoolean() + +if (isCIEnv || deploymentDebug.toBoolean()) { + artifacts { + if (!noPublishedSources.toBoolean()) { + archives sourcesJar + } + if (apiPackage) { + archives apiJar + } + } +} + +// Changelog generation +tasks.register('generateChangelog') { + group = 'GT Buildscript' + description = 'Generate a default changelog of all commits since the last tagged git commit' + onlyIf { + generateDefaultChangelog.toBoolean() + } + doLast { + def lastTag = getLastTag() + + def changelog = runShell(([ + "git", + "log", + "--date=format:%d %b %Y", + "--pretty=%s - **%an** (%ad)", + "${lastTag}..HEAD" + ] + (sourceSets.main.java.srcDirs + sourceSets.main.resources.srcDirs) + .collect { ['--', it] }).flatten()) + + if (changelog) { + changelog = "Changes since ${lastTag}:\n${{ ("\n" + changelog).replaceAll("\n", "\n* ") }}" + } + def f = getFile('build/changelog.md') + changelog = changelog ?: 'There have been no changes.' + f.write(changelog, 'UTF-8') + + // Set changelog for Modrinth + if (modrinthApiKey.isPresent() || deploymentDebug.toBoolean()) { + modrinth.changelog.set(changelog) + } + } +} + +if (cfApiKey.isPresent() || deploymentDebug.toBoolean()) { + apply plugin: 'net.darkhax.curseforgegradle' + //noinspection UnnecessaryQualifiedReference + tasks.register('curseforge', net.darkhax.curseforgegradle.TaskPublishCurseForge) { + disableVersionDetection() + debugMode = deploymentDebug.toBoolean() + apiToken = cfApiKey.getOrElse('debug_token') + + doFirst { + def mainFile = upload(curseForgeProjectId, reobfJar) + def changelogFile = getChangelog() + def changelogRaw = changelogFile.exists() ? changelogFile.getText('UTF-8') : "" + + mainFile.displayName = "${modName}: ${modVersion}" + mainFile.releaseType = getReleaseType() + mainFile.changelog = changelogRaw + mainFile.changelogType = 'markdown' + mainFile.addModLoader 'Forge' + mainFile.addJavaVersion "Java 8" + mainFile.addGameVersion minecraftVersion + + if (curseForgeRelations.size() != 0) { + String[] deps = curseForgeRelations.split(';') + deps.each { dep -> + if (dep.size() == 0) { + return + } + String[] parts = dep.split(':') + String type = parts[0], slug = parts[1] + if (!(type in ['requiredDependency', 'embeddedLibrary', 'optionalDependency', 'tool', 'incompatible'])) { + throw new Exception('Invalid Curseforge dependency type: ' + type) + } + mainFile.addRelation(slug, type) + } + } + + for (artifact in getSecondaryArtifacts()) { + def additionalFile = mainFile.withAdditionalFile(artifact) + additionalFile.changelog = changelogRaw + } + } + } + tasks.curseforge.dependsOn(build) + tasks.curseforge.dependsOn('generateChangelog') +} + +if (modrinthApiKey.isPresent() || deploymentDebug.toBoolean()) { + apply plugin: 'com.modrinth.minotaur' + def final changelogFile = getChangelog() + + modrinth { + token = modrinthApiKey.getOrElse('debug_token') + projectId = modrinthProjectId + changelog = changelogFile.exists() ? changelogFile.getText('UTF-8') : "" + versionType = getReleaseType() + versionNumber = modVersion + gameVersions = [minecraftVersion] + loaders = ["forge"] + debugMode = deploymentDebug.toBoolean() + uploadFile = reobfJar + additionalFiles = getSecondaryArtifacts() + } + if (modrinthRelations.size() != 0) { + String[] deps = modrinthRelations.split(';') + deps.each { dep -> + if (dep.size() == 0) { + return + } + String[] parts = dep.split(':') + String[] qual = parts[0].split('-') + addModrinthDep(qual[0], qual[1], parts[1]) + } + } + tasks.modrinth.dependsOn(build) + tasks.modrinth.dependsOn('generateChangelog') +} + +def addModrinthDep(String scope, String type, String name) { + com.modrinth.minotaur.dependencies.Dependency dep + if (!(scope in ['required', 'optional', 'incompatible', 'embedded'])) { + throw new Exception('Invalid modrinth dependency scope: ' + scope) + } + switch (type) { + case 'project': + dep = new ModDependency(name, scope) + break + case 'version': + dep = new VersionDependency(name, scope) + break + default: + throw new Exception('Invalid modrinth dependency type: ' + type) + } + project.modrinth.dependencies.add(dep) +} + +if (customMavenPublishUrl) { + String publishedVersion = modVersion + + publishing { + publications { + create('maven', MavenPublication) { + //noinspection GroovyAssignabilityCheck + from components.java + + if (apiPackage) { + artifact apiJar + } + + // providers is not available here, use System for getting env vars + groupId = System.getenv('ARTIFACT_GROUP_ID') ?: project.group + artifactId = System.getenv('ARTIFACT_ID') ?: project.name + version = System.getenv('RELEASE_VERSION') ?: publishedVersion + } + } + + repositories { + maven { + url = customMavenPublishUrl + allowInsecureProtocol = !customMavenPublishUrl.startsWith('https') + credentials { + username = providers.environmentVariable('MAVEN_USER').getOrElse('NONE') + password = providers.environmentVariable('MAVEN_PASSWORD').getOrElse('NONE') + } + } + } + } +} + +def getSecondaryArtifacts() { + def secondaryArtifacts = [usesShadowedDependencies.toBoolean() ? tasks.shadowJar : tasks.jar] + if (!noPublishedSources.toBoolean()) secondaryArtifacts += [sourcesJar] + if (apiPackage) secondaryArtifacts += [apiJar] + return secondaryArtifacts +} + +def getReleaseType() { + String type = project.releaseType + if (!(type in ['release', 'beta', 'alpha'])) { + throw new Exception("Release type invalid! Found \"" + type + "\", allowed: \"release\", \"beta\", \"alpha\"") + } + return type +} + +/* + * If CHANGELOG_LOCATION env var is set, that takes highest precedence. + * Next, if 'generateDefaultChangelog' option is enabled, use that. + * Otherwise, try to use a CHANGELOG.md file at root directory. + */ + +def getChangelog() { + def final changelogEnv = providers.environmentVariable('CHANGELOG_LOCATION') + if (changelogEnv.isPresent()) { + return new File(changelogEnv.get()) + } + if (generateDefaultChangelog.toBoolean()) { + return getFile('build/changelog.md') + } + return getFile('CHANGELOG.md') +} + + +// Buildscript updating + +def buildscriptGradleVersion = '8.1.1' + +tasks.named('wrapper', Wrapper).configure { + gradleVersion = buildscriptGradleVersion +} + +tasks.register('updateBuildScript') { + group = 'GT Buildscript' + description = 'Updates the build script to the latest version' + + if (gradle.gradleVersion != buildscriptGradleVersion && !Boolean.getBoolean('DISABLE_BUILDSCRIPT_GRADLE_UPDATE')) { + dependsOn('wrapper') + } + + doLast { + if (performBuildScriptUpdate()) return + print('Build script already up to date!') + } +} + +if (!project.getGradle().startParameter.isOffline() && !Boolean.getBoolean('DISABLE_BUILDSCRIPT_UPDATE_CHECK') && isNewBuildScriptVersionAvailable()) { + if (autoUpdateBuildScript.toBoolean()) { + performBuildScriptUpdate() + } else { + out.style(Style.SuccessHeader).println("Build script update available! Run 'gradle updateBuildScript'") + if (gradle.gradleVersion != buildscriptGradleVersion) { + out.style(Style.SuccessHeader).println("updateBuildScript can update gradle from ${gradle.gradleVersion} to ${buildscriptGradleVersion}\n") + } + } +} + +static URL availableBuildScriptUrl() { + new URL("https://raw.githubusercontent.com/GregTechCEu/Buildscripts/master/build.gradle") +} + +static URL exampleSettingsGradleUrl() { + new URL("https://raw.githubusercontent.com/GregTechCEu/Buildscripts/master/settings.gradle") +} + +boolean verifySettingsGradle() { + def settingsFile = getFile("settings.gradle") + if (!settingsFile.exists()) { + println("Downloading default settings.gradle") + exampleSettingsGradleUrl().withInputStream { i -> settingsFile.withOutputStream { it << i } } + return true + } + return false +} + +boolean performBuildScriptUpdate() { + if (isNewBuildScriptVersionAvailable()) { + def buildscriptFile = getFile("build.gradle") + availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } } + def out = services.get(StyledTextOutputFactory).create('buildscript-update-output') + out.style(Style.Success).print("Build script updated. Please REIMPORT the project or RESTART your IDE!") + if (verifySettingsGradle()) { + throw new GradleException("Settings has been updated, please re-run task.") + } + return true + } + return false +} + +boolean isNewBuildScriptVersionAvailable() { + Map parameters = ["connectTimeout": 10000, "readTimeout": 10000] + + String currentBuildScript = getFile("build.gradle").getText() + String currentBuildScriptHash = getVersionHash(currentBuildScript) + String availableBuildScript = availableBuildScriptUrl().newInputStream(parameters).getText() + String availableBuildScriptHash = getVersionHash(availableBuildScript) + + boolean isUpToDate = currentBuildScriptHash.empty || availableBuildScriptHash.empty || currentBuildScriptHash == availableBuildScriptHash + return !isUpToDate +} + +static String getVersionHash(String buildScriptContent) { + String versionLine = buildScriptContent.find("^//version: [a-z0-9]*") + if (versionLine != null) { + return versionLine.split(": ").last() + } + return "" +} + + +// Faq + +tasks.register('faq') { + group = 'GT Buildscript' + description = 'Prints frequently asked questions about building a project' + doLast { + print("\nTo update this buildscript to the latest version, run 'gradlew updateBuildScript' or run the generated run configuration if you are using IDEA.\n" + + "To set up the project, run the 'setupDecompWorkspace' task, which you can run as './gradlew setupDecompWorkspace' in a terminal, or find in the 'modded minecraft' gradle category.\n\n" + + "To add new dependencies to your project, place them in 'dependencies.gradle', NOT in 'build.gradle' as they would be replaced when the script updates.\n" + + "To add new repositories to your project, place them in 'repositories.gradle'.\n" + + "If you need additional gradle code to run, you can place it in a file named 'addon.gradle' (or either of the above, up to you for organization).\n\n" + + "If your build fails to recognize the syntax of newer Java versions, enable Jabel in your 'gradle.properties' under the option name 'enableModernJavaSyntax'.\n" + + "To see information on how to configure your IDE properly for Java 17, see https://github.com/GregTechCEu/Buildscripts/blob/master/docs/jabel.md\n\n" + + "Report any issues or feature requests you have for this build script to https://github.com/GregTechCEu/Buildscripts/issues\n") + } +} + + +// Helpers + +def getFile(String relativePath) { + return new File(projectDir, relativePath) +} + +def checkPropertyExists(String propertyName) { + if (!project.hasProperty(propertyName)) { + throw new GradleException("This project requires a property \"" + propertyName + "\"! Please add it your \"gradle.properties\". You can find all properties and their description here: https://github.com/GregTechCEu/Buildscripts/blob/main/gradle.properties") + } +} + +def propertyDefaultIfUnset(String propertyName, defaultValue) { + if (!project.hasProperty(propertyName) || project.property(propertyName) == "") { + project.ext.setProperty(propertyName, defaultValue) + } +} + +def propertyDefaultIfUnsetWithEnvVar(String propertyName, defaultValue, String envVarName) { + def envVar = providers.environmentVariable(envVarName) + if (envVar.isPresent()) { + project.ext.setProperty(propertyName, envVar.get()) + } else { + propertyDefaultIfUnset(propertyName, defaultValue) + } +} + +static runShell(command) { + def process = command.execute() + def outputStream = new StringBuffer() + def errorStream = new StringBuffer() + process.waitForProcessOutput(outputStream, errorStream) + + errorStream.toString().with { + if (it) { + throw new GradleException("Error executing ${command}:\n> ${it}") + } + } + return outputStream.toString().trim() +} + +def getLastTag() { + def githubTag = providers.environmentVariable('GITHUB_TAG') + return runShell('git describe --abbrev=0 --tags ' + + (githubTag.isPresent() ? runShell('git rev-list --tags --skip=1 --max-count=1') : '')) +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index effb184fe..4c43f3e8d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ tesla_version=1.0.63 ic2_version=2.8.73-ex112 top_version=1.12-1.4.23-16 cofhcore_version=1.12.2-4.5.2.19 -crafttweaker_version=4.1.8.9 +crafttweaker_version=4.1.20.684 ctm_version=MC1.12.2-0.3.1.16 forestry_version=5.8.2.387 ######################################################### @@ -31,3 +31,121 @@ forestry_version=5.8.2.387 ######################################################### website_version=1.12.2 curse_versions=1.12.2 +mapping_channel=snapshot +mapping_version=20171003 +# Run Configurations +minecraft_username=Developer +extra_jvm_args= +modName=Applied Energistics 2 +# This is a case-sensitive string to identify your mod. Convention is to use lower case. +modId=appliedenergistics2 +modGroup=appeng +# Version of your mod. +# This field can be left empty if you want your mod's version to be determined by the latest git tag instead. +modVersion=rv6-stable-7-extended_life-v0.55.16 +# Whether to use the old jar naming structure (modid-mcversion-version) instead of the new version (modid-version) +includeMCVersionJar=true +# The name of your jar when you produce builds, not including any versioning info +modArchivesBaseName=appliedenergistics2 +# Will update your build.gradle automatically whenever an update is available +autoUpdateBuildScript=false +minecraftVersion=1.12.2 +# Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you +# restart Minecraft in development. Choose this dependent on your mod: +# Do you need consistent player progressing (for example Thaumcraft)? -> Select a name +# Do you need to test how your custom blocks interacts with a player that is not the owner? -> leave name empty +# Alternatively this can be set with the 'DEV_USERNAME' environment variable. +developmentEnvironmentUserName=Developer +# Enables using modern java syntax (up to version 17) via Jabel, while still targeting JVM 8. +# See https://github.com/bsideup/jabel for details on how this works. +# Using this requires that you use a Java 17 JDK for development. +enableModernJavaSyntax=true +# Generate a class with String fields for the mod id, name and version named with the fields below +generateGradleTokenClass=appeng.Tags +gradleTokenModId= +gradleTokenModName= +gradleTokenVersion=VERSION +# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can +# leave this property empty. +# Example value: apiPackage = api + modGroup = com.myname.mymodid -> com.myname.mymodid.api +apiPackage=true +# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/ +# There can be multiple files in a comma-separated list. +# Example value: mymodid_at.cfg,jei_at.cfg +accessTransformersFile=appliedenergistics2_at.cfg +# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled! +usesMixins=false +# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail! +mixinsPackage= +# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin! +# Example value: coreModClass = asm.FMLPlugin + modGroup = com.myname.mymodid -> com.myname.mymodid.asm.FMLPlugin +coreModClass=core.AE2ELCore +# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod (meaning that +# there is no class annotated with @Mod) you want this to be true. When in doubt: leave it on false! +containsMixinsAndOrCoreModOnly=false +# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins. +forceEnableMixins=false +# Adds CurseMaven, Modrinth Maven, BlameJared maven, and some more well-known 1.12.2 repositories +includeWellKnownRepositories=true +# Adds JEI and TheOneProbe to your development environment. Adds them as 'implementation', meaning they will +# be available at compiletime and runtime for your mod (in-game and in-code). +# Overrides the above setting to be always true, as these repositories are needed to fetch the mods +includeCommonDevEnvMods=true +# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated in your jar. It is your +# responsibility check the licence and request permission for distribution, if required. +usesShadowedDependencies=false +# If disabled, won't remove unused classes from shaded dependencies. Some libraries use reflection to access +# their own classes, making the minimization unreliable. +minimizeShadowedDependencies=true +# If disabled, won't rename the shadowed classes. +relocateShadowedDependencies=true +# Publishing to modrinth requires you to set the MODRINTH_API_KEY environment variable to your current modrinth API token. +# The project's ID on Modrinth. Can be either the slug or the ID. +# Leave this empty if you don't want to publish on Modrinth. +# Alternatively this can be set with the 'MODRINTH_PROJECT_ID' environment variable. +modrinthProjectId= +# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth. +# Syntax: scope1-type1:name1;scope2-type2:name2;... +# Where scope can be one of [required, optional, incompatible, embedded], +# type can be one of [project, version], +# and the name is the Modrinth project or version slug/id of the other mod. +# Example: required-project:jei;optional-project:top;incompatible-project:gregtech +modrinthRelations= +# Publishing to CurseForge requires you to set the CURSEFORGE_API_KEY environment variable to one of your CurseForge API tokens. +# The project's numeric ID on CurseForge. You can find this in the About Project box. +# Leave this empty if you don't want to publish on CurseForge. +# Alternatively this can be set with the 'CURSEFORGE_PROJECT_ID' environment variable. +curseForgeProjectId= +# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge. +# Syntax: type1:name1;type2:name2;... +# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible], +# and the name is the CurseForge project slug of the other mod. +# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft +curseForgeRelations= +# This project's release type on CurseForge and/or Modrinth +# Allowed types: release, beta, alpha +releaseType=beta +# Generate a default changelog for releases. Requires git to be installed, as it uses it to generate a changelog of +# commits since the last tagged release. +generateDefaultChangelog=false +# Prevent the source code from being published +noPublishedSources=false +# Enable spotless checks +# Enforces code formatting on your source code +# By default this will use the files found here: https://github.com/GregTechCEu/Buildscripts/tree/master/spotless +# to format your code. However, you can create your own version of these files and place them in your project's +# root directory to apply your own formatting options instead. +enableSpotless=false +# Enable JUnit testing platform used for testing your code. +# Uses JUnit 5. See guide and documentation here: https://junit.org/junit5/docs/current/user-guide/ +enableJUnit=true +# Deployment debug setting +# Uncomment this to test deployments to CurseForge and Modrinth +# Alternatively, you can set the 'DEPLOYMENT_DEBUG' environment variable. +deploymentDebug=false +# Gradle Settings +# Effectively applies the '--stacktrace' flag by default +org.gradle.logging.stacktrace=all +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G \ No newline at end of file diff --git a/gradle/scripts/artifacts.gradle b/gradle/scripts/artifacts.gradle deleted file mode 100644 index c61666b44..000000000 --- a/gradle/scripts/artifacts.gradle +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -// Suppresses warnings/errors when building javadocs -allprojects { - tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') - } -} - -javadoc { - options.encoding = 'UTF-8' - options.charSet = 'UTF-8' -} - -task javadocs(type: Javadoc) { - source = sourceSets.api.java - include "appeng/api/**" - - // Due to ForgeGradle having to be a special snowflake, - // we have to add some custom configurations to the normal compile configuration and hope it does not break. - classpath = configurations.compile + configurations.forgeGradleMc + configurations.forgeGradleMcDeps -} - -task javadocJar(type: Jar, dependsOn: javadocs) { - from javadoc.destinationDir - - classifier = 'javadoc' -} - -task apiJar(type: Jar) { - from sourceSets.api.java - include "appeng/api/**" - - from sourceSets.api.output - include "appeng/api/**" - - classifier = 'api' -} - -task sourceJar(type: Jar, overwrite: true) { - from sourceSets.api.allSource - from sourceSets.main.allSource - - classifier = 'sources' -} - -task devJar(type: Jar, overwrite: true) { - from sourceSets.api.output - from sourceSets.main.output - - classifier = 'dev' -} - -artifacts { - archives apiJar - archives javadocJar - archives sourceJar - archives devJar -} \ No newline at end of file diff --git a/gradle/scripts/dependencies.gradle b/gradle/scripts/dependencies.gradle deleted file mode 100644 index 63b135edd..000000000 --- a/gradle/scripts/dependencies.gradle +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -repositories { - mavenLocal() - - maven { - url "https://cursemaven.com" - } - - maven { - name = "CurseForge" - url = "https://minecraft.curseforge.com/api/maven/" - } - - maven { - name "Mobius" - url "http://mobiusstrip.eu/maven" - } - - maven { - name = "JEI repo" - url "http://dvs1.progwml6.com/files/maven" - } - - maven { - name "Ellpeck" - url "https://maven.ellpeck.de" - } - - maven { - name = "IC2 repo" - url = "http://maven.ic2.player.to" - } - - maven { - name = "CoFH Maven" - url = "http://maven.covers1624.net" - } - - maven { // TheOneProbe - name 'tterrag maven' - url "http://maven.tterrag.com/" - } - - maven { // McJtyLib - name 'mcjty' - url "http://maven.k-4u.nl/" - } - - maven { // CraftTweaker - name 'jared maven' - url "http://maven.blamejared.com/" - } - - //maven { // modmaven, maven proxy - // name 'modmaven' - // url "https://modmaven.k-4u.nl/" - //} -} - -configurations { - mods -} - -dependencies { - // deobfCompile "gregtechce:gregtech:1.12.2:1.15.1.735" - // installable runtime dependencies - deobfCompile "curse.maven:gregtechceu-557242:4429261" - - compileOnly "curse.maven:chisel-235279:2915375" - - deobfCompile "curse.maven:baubles-227083:2518667" - //mods "mcp.mobius.waila:Hwyla:${hwyla_version}" - mods "curse.maven:hwyla-253449:2568751" - mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev" - mods "mcjty.theoneprobe:TheOneProbe-${minecraft_version}:${top_version}" - - // compile against provided APIs - compileOnly "mezz.jei:jei_${minecraft_version}:${jei_version}:api" - //compileOnly "mcp.mobius.waila:Hwyla:${hwyla_version}" - compileOnly "curse.maven:hwyla-253449:2568751" - //Code chicken lib, GTCE dependency - deobfCompile "curse.maven:CCL-242818:2779848" - - compileOnly "curse.maven:recipe-stages-280554:3405072" - compileOnly "curse.maven:item-stages-280316:2696769" - compileOnly "curse.maven:game-stages-268655:2951844" - compileOnly "net.darkhax.tesla:Tesla-1.12.2:${tesla_version}" - compileOnly "net.industrial-craft:industrialcraft-2:${ic2_version}:api" - compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:${top_version}:api" - compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf" - compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}" - compileOnly "curse.maven:inventory-tweaks-223094:2482482" - compileOnly "curse.maven:inventory-bogo-sorter-632327:4399738" - compileOnly "team.chisel.ctm:CTM:${ctm_version}" - compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api" - deobfCompile "net.sengir.forestry:forestry_${minecraft_version}:$forestry_version" - - // at runtime, use the full JEI jar - runtime "mezz.jei:jei_${minecraft_version}:${jei_version}" - - // unit test dependencies - testCompile "junit:junit:4.12" -} diff --git a/gradle/scripts/optional.gradle b/gradle/scripts/optional.gradle index 046613679..8ea315d9b 100644 --- a/gradle/scripts/optional.gradle +++ b/gradle/scripts/optional.gradle @@ -15,41 +15,40 @@ * You should have received a copy of the GNU Lesser General Public License * along with Applied Energistics 2. If not, see . */ - -task wrapper(type: Wrapper) { - gradleVersion = "2.14" -} // HWYLA -task installHwyla(type: Copy, dependsOn: "deinstallHwyla") { +tasks.register('installHwyla', Copy) { + dependsOn "deinstallHwyla" from { configurations.mods } include "**/*Hwyla*.jar" - into file(minecraft.runDir + "/mods") + into file("/run/mods") } -task deinstallHwyla(type: Delete) { - delete fileTree(dir: minecraft.runDir + "/mods", include: "*Hwyla*.jar") +tasks.register('deinstallHwyla', Delete) { + delete fileTree(dir: "/run/mods", include: "*Hwyla*.jar") } // IC2 -task installIC2(type: Copy, dependsOn: "deinstallIC2") { +tasks.register('installIC2', Copy) { + dependsOn "deinstallIC2" from { configurations.mods } include "**/*industrialcraft-2*.jar" - into file(minecraft.runDir + "/mods") + into file("/run/mods") } -task deinstallIC2(type: Delete) { - delete fileTree(dir: minecraft.runDir + "/mods", include: "*industrialcraft-2*.jar") +tasks.register('deinstallIC2', Delete) { + delete fileTree(dir: "/run/mods", include: "*industrialcraft-2*.jar") } // TOP -task installTop(type: Copy, dependsOn: ["deinstallTop"]) { +tasks.register('installTop', Copy) { + dependsOn["deinstallTop"] from { configurations.mods } include "**/*TheOneProbe*.jar" - into file(minecraft.runDir + "/mods") + into file("/run/mods") } -task deinstallTop(type: Delete) { - delete fileTree(dir: minecraft.runDir + "/mods", include: "*TheOneProbe*.jar") +tasks.register('deinstallTop', Delete) { + delete fileTree(dir: "/run/mods", include: "*TheOneProbe*.jar") } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 736fb7d3f94c051b359fc7ae7212d351bc094bdd..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 56600 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 Uvw}-aBL*XectHjR`y(KY0Jm+s1poj5 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9d2dc020a..37aef8d3f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip diff --git a/gradlew b/gradlew index cccdd3d51..79a61d421 100755 --- a/gradlew +++ b/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # 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"` +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac 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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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 @@ -89,84 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -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 - 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"` - 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` - 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" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# 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" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -# 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")" + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done fi +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/src/api/java/appeng/api/package-info.java b/src/api/java/appeng/api/package-info.java index e00d75a70..1cc7b1def 100644 --- a/src/api/java/appeng/api/package-info.java +++ b/src/api/java/appeng/api/package-info.java @@ -22,7 +22,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -@API( apiVersion = "@aeversion@", owner = "appliedenergistics2", provides = "appliedenergistics2|API" ) +@API(apiVersion = "rv6", owner = "appliedenergistics2", provides = "appliedenergistics2|API") package appeng.api; diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index 3cba184d3..3e08120b8 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -43,8 +43,8 @@ import java.util.stream.Stream; public final class AEConfig extends Configuration implements IConfigurableObject, IConfigManagerHost { - public static final String VERSION = "@version@"; - public static final String CHANNEL = "@aechannel@"; + public static final String VERSION = appeng.Tags.VERSION; + public static final String CHANNEL = appeng.Tags.AECHANNEL; public static final String PACKET_CHANNEL = "AE"; // Tunnels public static final double TUNNEL_POWER_LOSS = 0.05; diff --git a/src/main/resources/appeng_at.cfg b/src/main/resources/appliedenergistics2_at.cfg similarity index 100% rename from src/main/resources/appeng_at.cfg rename to src/main/resources/appliedenergistics2_at.cfg