mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-06-28 16:13:22 +00:00
![Jonathan Coates](/assets/img/avatar_default.png)
- Switch to plugins { ... } imports for Forge (FG finally supports it!) - Use FG's new fg.component to clean up our Maven metadata instead. We also mark JEI as optional (using Gradle's registerFeature), which means we've no stray deps inside our POM any more.
587 lines
18 KiB
Groovy
587 lines
18 KiB
Groovy
plugins {
|
|
id "checkstyle"
|
|
id "jacoco"
|
|
id "maven-publish"
|
|
id "com.github.hierynomus.license" version "0.16.1"
|
|
id "com.matthewprenger.cursegradle" version "1.4.0"
|
|
id "com.github.breadmoirai.github-release" version "2.2.12"
|
|
id 'org.jetbrains.kotlin.jvm' version '1.7.0'
|
|
id "com.modrinth.minotaur" version "2.+"
|
|
id "net.minecraftforge.gradle" version "5.1.+"
|
|
id "org.spongepowered.mixin" version "0.7.+"
|
|
id "org.parchmentmc.librarian.forgegradle" version "1.+"
|
|
}
|
|
|
|
|
|
import com.hierynomus.gradle.license.tasks.LicenseCheck
|
|
import com.hierynomus.gradle.license.tasks.LicenseFormat
|
|
import org.apache.tools.ant.taskdefs.condition.Os
|
|
|
|
version = mod_version
|
|
|
|
group = "org.squiddev"
|
|
archivesBaseName = "cc-tweaked-${mc_version}"
|
|
|
|
def javaVersion = JavaLanguageVersion.of(8)
|
|
java {
|
|
toolchain {
|
|
languageVersion = javaVersion
|
|
}
|
|
|
|
withSourcesJar()
|
|
withJavadocJar()
|
|
registerFeature("extraMods") { usingSourceSet(sourceSets.main) }
|
|
}
|
|
|
|
sourceSets {
|
|
main.resources {
|
|
srcDir 'src/generated/resources'
|
|
}
|
|
|
|
testMod {}
|
|
}
|
|
|
|
minecraft {
|
|
runs {
|
|
all {
|
|
property 'forge.logging.markers', 'REGISTRIES'
|
|
property 'forge.logging.console.level', 'debug'
|
|
|
|
mods {
|
|
computercraft {
|
|
source sourceSets.main
|
|
}
|
|
}
|
|
|
|
arg "-mixin.config=computercraft.mixins.json"
|
|
}
|
|
|
|
client {
|
|
workingDirectory project.file('run')
|
|
}
|
|
|
|
server {
|
|
workingDirectory project.file("run/server")
|
|
arg "--nogui"
|
|
}
|
|
|
|
data {
|
|
workingDirectory project.file('run')
|
|
args '--mod', 'computercraft', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')
|
|
}
|
|
|
|
testClient {
|
|
workingDirectory project.file('test-files/client')
|
|
parent runs.client
|
|
|
|
mods {
|
|
cctest {
|
|
source sourceSets.testMod
|
|
}
|
|
}
|
|
}
|
|
|
|
testServer {
|
|
workingDirectory project.file('test-files/server')
|
|
parent runs.server
|
|
|
|
mods {
|
|
cctest {
|
|
source sourceSets.testMod
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
mappings channel: 'parchment', version: "${mapping_version}-${mc_version}"
|
|
|
|
accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg')
|
|
accessTransformer file('src/testMod/resources/META-INF/accesstransformer.cfg')
|
|
}
|
|
|
|
mixin {
|
|
add sourceSets.main, 'computercraft.mixins.refmap.json'
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
maven {
|
|
name "SquidDev"
|
|
url "https://squiddev.cc/maven"
|
|
}
|
|
}
|
|
|
|
configurations {
|
|
shade
|
|
implementation.extendsFrom shade
|
|
cctJavadoc
|
|
|
|
testModImplementation.extendsFrom(implementation)
|
|
testModImplementation.extendsFrom(testImplementation)
|
|
}
|
|
|
|
dependencies {
|
|
checkstyle "com.puppycrawl.tools:checkstyle:8.25"
|
|
|
|
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
|
annotationProcessor 'org.spongepowered:mixin:0.8.4:processor'
|
|
|
|
extraModsCompileOnly fg.deobf("mezz.jei:jei-1.16.5:7.7.0.104:api")
|
|
extraModsRuntimeOnly fg.deobf("mezz.jei:jei-1.16.5:7.7.0.104")
|
|
|
|
extraModsCompileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.16.5:7.1.0.313")
|
|
extraModsCompileOnly fg.deobf("commoble.morered:morered-1.16.5:2.1.1.0")
|
|
|
|
shade 'org.squiddev:Cobalt:0.5.5'
|
|
|
|
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
|
|
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0'
|
|
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
|
|
testImplementation 'org.hamcrest:hamcrest:2.2'
|
|
testImplementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0'
|
|
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2'
|
|
|
|
testModImplementation sourceSets.main.output
|
|
|
|
cctJavadoc 'cc.tweaked:cct-javadoc:1.4.6'
|
|
}
|
|
|
|
// Compile tasks
|
|
|
|
compileTestModJava {
|
|
dependsOn(compileJava)
|
|
}
|
|
|
|
javadoc {
|
|
include "dan200/computercraft/api/**/*.java"
|
|
}
|
|
|
|
task luaJavadoc(type: Javadoc) {
|
|
description "Generates documentation for Java-side Lua functions."
|
|
group "documentation"
|
|
|
|
source = sourceSets.main.allJava
|
|
destinationDir = file("${project.docsDir}/luaJavadoc")
|
|
classpath = sourceSets.main.compileClasspath
|
|
|
|
options.docletpath = configurations.cctJavadoc.files as List
|
|
options.doclet = "cc.tweaked.javadoc.LuaDoclet"
|
|
options.noTimestamp = false
|
|
|
|
javadocTool = javaToolchains.javadocToolFor {
|
|
languageVersion = JavaLanguageVersion.of(11)
|
|
}
|
|
}
|
|
|
|
jar {
|
|
manifest {
|
|
attributes([
|
|
"Specification-Title" : "computercraft",
|
|
"Specification-Vendor" : "SquidDev",
|
|
"Specification-Version" : "1",
|
|
"Implementation-Title" : "CC: Tweaked",
|
|
"Implementation-Version" : "${mod_version}",
|
|
"Implementation-Vendor" : "SquidDev",
|
|
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
|
|
"MixinConfigs" : "computercraft.mixins.json",
|
|
])
|
|
}
|
|
|
|
from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
|
|
}
|
|
|
|
jar.finalizedBy("reobfJar")
|
|
|
|
[compileJava, compileTestJava, compileTestModJava].forEach {
|
|
it.configure {
|
|
options.compilerArgs << "-Xlint" << "-Xlint:-processing"
|
|
}
|
|
}
|
|
|
|
processResources {
|
|
inputs.property "version", mod_version
|
|
inputs.property "mcversion", mc_version
|
|
|
|
def hash = 'none'
|
|
Set<String> contributors = []
|
|
try {
|
|
hash = ["git", "-C", projectDir, "rev-parse", "HEAD"].execute().text.trim()
|
|
|
|
def blacklist = ['GitHub', 'Daniel Ratcliffe', 'Weblate']
|
|
|
|
// Extract all authors, commiters and co-authors from the git log.
|
|
def authors = ["git", "-C", projectDir, "log", "--format=tformat:%an <%ae>%n%cn <%ce>%n%(trailers:key=Co-authored-by,valueonly)"]
|
|
.execute().text.readLines().unique()
|
|
|
|
// We now pass this through git's mailmap to de-duplicate some authors.
|
|
def remapAuthors = ["git", "check-mailmap", "--stdin"].execute()
|
|
remapAuthors.withWriter { stdin ->
|
|
if (stdin !instanceof BufferedWriter) stdin = new BufferedWriter(stdin)
|
|
|
|
authors.forEach {
|
|
if (it == "") return
|
|
if (!it.endsWith(">")) it += ">" // Some commits have broken Co-Authored-By lines!
|
|
stdin.writeLine(it)
|
|
}
|
|
stdin.close()
|
|
}
|
|
|
|
// And finally extract out the actual name.
|
|
def emailRegex = ~/^([^<]+) <.+>$/
|
|
remapAuthors.text.readLines().forEach {
|
|
def matcher = it =~ emailRegex
|
|
matcher.find()
|
|
def name = matcher.group(1)
|
|
if (!blacklist.contains(name)) contributors.add(name)
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace()
|
|
}
|
|
inputs.property "commithash", hash
|
|
duplicatesStrategy = DuplicatesStrategy.INCLUDE
|
|
|
|
from(sourceSets.main.resources.srcDirs) {
|
|
include 'META-INF/mods.toml'
|
|
include 'data/computercraft/lua/rom/help/credits.txt'
|
|
|
|
expand 'version': mod_version,
|
|
'mcversion': mc_version,
|
|
'gitcontributors': contributors.sort(false, String.CASE_INSENSITIVE_ORDER).join('\n')
|
|
}
|
|
|
|
from(sourceSets.main.resources.srcDirs) {
|
|
exclude 'META-INF/mods.toml'
|
|
exclude 'data/computercraft/lua/rom/help/credits.txt'
|
|
}
|
|
}
|
|
|
|
sourcesJar {
|
|
duplicatesStrategy = DuplicatesStrategy.INCLUDE
|
|
}
|
|
|
|
// Web tasks
|
|
|
|
List<String> mkCommand(String command) {
|
|
return Os.isFamily(Os.FAMILY_WINDOWS) ? ["cmd", "/c", command] : ["sh", "-c", command]
|
|
}
|
|
|
|
task rollup(type: Exec) {
|
|
group = "build"
|
|
description = "Bundles JS into rollup"
|
|
|
|
inputs.files(fileTree("src/web")).withPropertyName("sources")
|
|
inputs.file("package-lock.json").withPropertyName("package-lock.json")
|
|
inputs.file("tsconfig.json").withPropertyName("Typescript config")
|
|
inputs.file("rollup.config.js").withPropertyName("Rollup config")
|
|
outputs.file("$buildDir/rollup/index.js").withPropertyName("output")
|
|
|
|
commandLine mkCommand('"node_modules/.bin/rollup" --config rollup.config.js')
|
|
}
|
|
|
|
task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) {
|
|
group = "build"
|
|
description = "Generates docs using Illuaminate"
|
|
|
|
inputs.files(fileTree("doc")).withPropertyName("docs")
|
|
inputs.files(fileTree("src/main/resources/data/computercraft/lua/rom")).withPropertyName("lua rom")
|
|
inputs.file("illuaminate.sexp").withPropertyName("illuaminate.sexp")
|
|
inputs.dir("$buildDir/docs/luaJavadoc")
|
|
inputs.file("$buildDir/rollup/index.js").withPropertyName("scripts")
|
|
inputs.file("src/web/styles.css").withPropertyName("styles")
|
|
outputs.dir("$buildDir/docs/lua")
|
|
|
|
commandLine mkCommand('"bin/illuaminate" doc-gen')
|
|
}
|
|
|
|
task jsxDocs(type: Exec, dependsOn: [illuaminateDocs]) {
|
|
group = "build"
|
|
description = "Post-processes documentation to statically render some dynamic content."
|
|
|
|
inputs.files(fileTree("src/web")).withPropertyName("sources")
|
|
inputs.file("src/generated/export/index.json").withPropertyName("export")
|
|
inputs.file("package-lock.json").withPropertyName("package-lock.json")
|
|
inputs.file("tsconfig.json").withPropertyName("Typescript config")
|
|
inputs.files(fileTree("$buildDir/docs/lua"))
|
|
outputs.dir("$buildDir/docs/site")
|
|
|
|
commandLine mkCommand('"node_modules/.bin/ts-node" --esm src/web/transform.tsx')
|
|
}
|
|
|
|
task docWebsite(type: Copy, dependsOn: [jsxDocs]) {
|
|
from('doc') {
|
|
include 'logo.png'
|
|
include 'images/**'
|
|
}
|
|
from("$buildDir/rollup") {
|
|
exclude 'index.js'
|
|
}
|
|
from("$buildDir/docs/lua") {
|
|
exclude '**/*.html'
|
|
}
|
|
from("src/generated/export/items") {
|
|
into("images/items")
|
|
}
|
|
|
|
into "${project.docsDir}/site"
|
|
}
|
|
|
|
// Check tasks
|
|
|
|
test {
|
|
useJUnitPlatform()
|
|
testLogging {
|
|
events "skipped", "failed"
|
|
}
|
|
}
|
|
|
|
jacocoTestReport {
|
|
dependsOn('test')
|
|
reports {
|
|
xml.required = true
|
|
html.required = true
|
|
}
|
|
}
|
|
|
|
test.finalizedBy(jacocoTestReport)
|
|
|
|
license {
|
|
mapping("java", "SLASHSTAR_STYLE")
|
|
strictCheck true
|
|
|
|
ext.year = Calendar.getInstance().get(Calendar.YEAR)
|
|
}
|
|
|
|
[licenseMain, licenseFormatMain].forEach {
|
|
it.configure {
|
|
include("**/*.java")
|
|
exclude("dan200/computercraft/api/**")
|
|
header file('config/license/main.txt')
|
|
}
|
|
}
|
|
|
|
[licenseTest, licenseFormatTest, licenseTestMod, licenseFormatTestMod].forEach {
|
|
it.configure {
|
|
include("**/*.java")
|
|
header file('config/license/main.txt')
|
|
}
|
|
}
|
|
|
|
gradle.projectsEvaluated {
|
|
tasks.withType(LicenseFormat) {
|
|
outputs.upToDateWhen { false }
|
|
}
|
|
}
|
|
|
|
|
|
task licenseAPI(type: LicenseCheck)
|
|
task licenseFormatAPI(type: LicenseFormat)
|
|
[licenseAPI, licenseFormatAPI].forEach {
|
|
it.configure {
|
|
source = sourceSets.main.java
|
|
include("dan200/computercraft/api/**")
|
|
header file('config/license/api.txt')
|
|
}
|
|
}
|
|
|
|
task setupServer(type: Copy) {
|
|
group "test server"
|
|
description "Sets up the environment for the test server."
|
|
|
|
from("src/testMod/server-files") {
|
|
include "eula.txt"
|
|
include "server.properties"
|
|
}
|
|
into "test-files/server"
|
|
}
|
|
|
|
tasks.register("testServer", JavaExec.class).configure {
|
|
it.group('In-game tests')
|
|
it.description("Runs tests on a temporary Minecraft instance.")
|
|
it.dependsOn(setupServer, "prepareRunTestServer", "cleanTestServer", 'compileTestModJava')
|
|
finalizedBy("jacocoTestServerReport")
|
|
|
|
// Copy from runTestServer. We do it in this slightly odd way as runTestServer
|
|
// isn't created until the task is configured (which is no good for us).
|
|
JavaExec exec = tasks.getByName("runTestServer")
|
|
exec.copyTo(it)
|
|
it.setClasspath(exec.getClasspath())
|
|
it.mainClass = exec.mainClass
|
|
it.setArgs(exec.getArgs())
|
|
|
|
it.systemProperty('forge.logging.console.level', 'info')
|
|
it.systemProperty('cctest.run', 'true')
|
|
|
|
// Jacoco and modlauncher don't play well together as the classes loaded in-game don't
|
|
// match up with those written to disk. We get Jacoco to dump all classes to disk, and
|
|
// use that when generating the report.
|
|
def coverageOut = new File(buildDir, "jacocoClassDump/testServer")
|
|
jacoco.applyTo(it)
|
|
it.jacoco.setIncludes(["dan200.computercraft.*"])
|
|
it.jacoco.setClassDumpDir(coverageOut)
|
|
it.outputs.dir(coverageOut)
|
|
// Older versions of modlauncher don't include a protection domain (and thus no code
|
|
// source). Jacoco skips such classes by default, so we need to explicitly include them.
|
|
it.jacoco.setIncludeNoLocationClasses(true)
|
|
}
|
|
|
|
tasks.register("jacocoTestServerReport", JacocoReport.class).configure {
|
|
it.group('In-game')
|
|
it.description("Generate coverage reports for testServer")
|
|
it.dependsOn("testServer")
|
|
|
|
it.executionData(new File(buildDir, "jacoco/testServer.exec"))
|
|
it.sourceDirectories.from(sourceSets.main.allJava.srcDirs)
|
|
it.classDirectories.from(new File(buildDir, "jacocoClassDump/testServer"))
|
|
|
|
it.reports {
|
|
xml.enabled true
|
|
html.enabled true
|
|
}
|
|
}
|
|
|
|
check.dependsOn("testServer")
|
|
|
|
// Upload tasks
|
|
|
|
task checkRelease {
|
|
group "upload"
|
|
description "Verifies that everything is ready for a release"
|
|
|
|
inputs.property "version", mod_version
|
|
inputs.file("src/main/resources/data/computercraft/lua/rom/help/changelog.md")
|
|
inputs.file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.md")
|
|
|
|
doLast {
|
|
def ok = true
|
|
|
|
// Check we're targetting the current version
|
|
def whatsnew = new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/whatsnew.md").readLines()
|
|
if (whatsnew[0] != "New features in CC: Tweaked $mod_version") {
|
|
ok = false
|
|
project.logger.error("Expected `whatsnew.md' to target $mod_version.")
|
|
}
|
|
|
|
// Check "read more" exists and trim it
|
|
def idx = whatsnew.findIndexOf { it == 'Type "help changelog" to see the full version history.' }
|
|
if (idx == -1) {
|
|
ok = false
|
|
project.logger.error("Must mention the changelog in whatsnew.md")
|
|
} else {
|
|
whatsnew = whatsnew.getAt(0..<idx)
|
|
}
|
|
|
|
// Check whatsnew and changelog match.
|
|
def versionChangelog = "# " + whatsnew.join("\n")
|
|
def changelog = new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/changelog.md").getText()
|
|
if (!changelog.startsWith(versionChangelog)) {
|
|
ok = false
|
|
project.logger.error("whatsnew and changelog are not in sync")
|
|
}
|
|
|
|
if (!ok) throw new IllegalStateException("Could not check release")
|
|
}
|
|
}
|
|
check.dependsOn checkRelease
|
|
|
|
def isStable = true
|
|
|
|
curseforge {
|
|
apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : ''
|
|
project {
|
|
id = '282001'
|
|
releaseType = isStable ? 'release' : 'alpha'
|
|
changelog = "Release notes can be found on the GitHub repository (https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
|
|
|
|
addGameVersion "${mc_version}"
|
|
}
|
|
|
|
}
|
|
|
|
modrinth {
|
|
token = project.hasProperty('modrinthApiKey') ? project.getProperty('modrinthApiKey') : ''
|
|
projectId = 'gu7yAYhd'
|
|
versionNumber = "${project.mc_version}-${project.mod_version}"
|
|
versionType = isStable ? 'release' : 'alpha'
|
|
uploadFile = jar
|
|
gameVersions = [project.mc_version]
|
|
changelog = "Release notes can be found on the [GitHub repository](https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
|
|
|
|
}
|
|
|
|
publishing {
|
|
publications {
|
|
maven(MavenPublication) {
|
|
from components.java
|
|
fg.component(it)
|
|
|
|
pom {
|
|
name = 'CC: Tweaked'
|
|
description = 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.'
|
|
url = 'https://github.com/cc-tweaked/CC-Tweaked'
|
|
|
|
scm {
|
|
url = 'https://github.com/cc-tweaked/CC-Tweaked.git'
|
|
}
|
|
|
|
issueManagement {
|
|
system = 'github'
|
|
url = 'https://github.com/cc-tweaked/CC-Tweaked/issues'
|
|
}
|
|
|
|
licenses {
|
|
license {
|
|
name = 'ComputerCraft Public License, Version 1.0'
|
|
url = 'https://github.com/cc-tweaked/CC-Tweaked/blob/mc-1.16.x/LICENSE'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
if (project.hasProperty("mavenUser")) {
|
|
maven {
|
|
name = "SquidDev"
|
|
url = "https://squiddev.cc/maven"
|
|
credentials {
|
|
username = project.property("mavenUser") as String
|
|
password = project.property("mavenPass") as String
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
githubRelease {
|
|
token project.hasProperty('githubApiKey') ? project.githubApiKey : ''
|
|
owner 'cc-tweaked'
|
|
repo 'CC-Tweaked'
|
|
targetCommitish.set(project.provider({
|
|
try {
|
|
return ["git", "-C", projectDir, "rev-parse", "--abbrev-ref", "HEAD"].execute().text.trim()
|
|
} catch (Exception e) {
|
|
e.printStackTrace()
|
|
}
|
|
return "master"
|
|
}))
|
|
|
|
tagName "v${mc_version}-${mod_version}"
|
|
releaseName "[${mc_version}] ${mod_version}"
|
|
body.set(project.provider({
|
|
"## " + new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/whatsnew.md")
|
|
.readLines()
|
|
.takeWhile { it != 'Type "help changelog" to see the full version history.' }
|
|
.join("\n").trim()
|
|
}))
|
|
prerelease false
|
|
prerelease !isStable
|
|
}
|
|
|
|
def uploadTasks = ["publish", "curseforge", "modrinth", "githubRelease"]
|
|
uploadTasks.forEach { tasks.named(it) { dependsOn checkRelease } }
|
|
|
|
task uploadAll(dependsOn: uploadTasks) {
|
|
group "upload"
|
|
description "Uploads to all repositories (Maven, Curse, Modrinth, GitHub release)"
|
|
}
|