mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-12-15 12:40:30 +00:00
2a4f75ba15
- Bump Forge version to latest RB. - Generate an 8-bit audio stream again, as we no longer need to be compatible with MC's existing streams. No functionality changes, just mildly less hacky.
559 lines
17 KiB
Groovy
559 lines
17 KiB
Groovy
buildscript {
|
|
repositories {
|
|
mavenCentral()
|
|
maven { url = "https://maven.minecraftforge.net" }
|
|
maven { url = 'https://maven.parchmentmc.org' }
|
|
}
|
|
dependencies {
|
|
classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+'
|
|
classpath "org.spongepowered:mixingradle:0.7.+"
|
|
classpath 'org.parchmentmc:librarian:1.+'
|
|
}
|
|
}
|
|
|
|
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.6.0"
|
|
id "com.modrinth.minotaur" version "1.2.1"
|
|
}
|
|
|
|
apply plugin: 'net.minecraftforge.gradle'
|
|
apply plugin: "org.spongepowered.mixin"
|
|
apply plugin: 'org.parchmentmc.librarian.forgegradle'
|
|
|
|
version = mod_version
|
|
|
|
group = "org.squiddev"
|
|
archivesBaseName = "cc-tweaked-${mc_version}"
|
|
|
|
def javaVersion = JavaLanguageVersion.of(17)
|
|
java {
|
|
toolchain {
|
|
languageVersion = javaVersion
|
|
}
|
|
|
|
withSourcesJar()
|
|
withJavadocJar()
|
|
}
|
|
|
|
tasks.withType(JavaExec).configureEach {
|
|
javaLauncher = javaToolchains.launcherFor {
|
|
languageVersion = javaVersion
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
main.resources {
|
|
srcDir 'src/generated/resources'
|
|
}
|
|
|
|
testMod {}
|
|
}
|
|
|
|
minecraft {
|
|
runs {
|
|
all {
|
|
lazyToken('minecraft_classpath') {
|
|
configurations.shade.copyRecursive().resolve().collect { it.absolutePath }.join(File.pathSeparator)
|
|
}
|
|
|
|
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/')
|
|
}
|
|
|
|
gameTestServer {
|
|
workingDirectory project.file('test-files/server')
|
|
|
|
mods {
|
|
cctest {
|
|
source sourceSets.testMod
|
|
}
|
|
}
|
|
|
|
lazyToken('minecraft_classpath') {
|
|
(configurations.shade.copyRecursive().resolve() + configurations.testModExtra.copyRecursive().resolve())
|
|
.collect { it.absolutePath }
|
|
.join(File.pathSeparator)
|
|
}
|
|
}
|
|
}
|
|
|
|
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
|
|
|
|
testModExtra
|
|
testModImplementation.extendsFrom(testModExtra)
|
|
testModImplementation.extendsFrom(implementation)
|
|
}
|
|
|
|
dependencies {
|
|
checkstyle "com.puppycrawl.tools:checkstyle:8.45"
|
|
|
|
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
|
annotationProcessor 'org.spongepowered:mixin:0.8.4:processor'
|
|
|
|
compileOnly fg.deobf("mezz.jei:jei-1.18.2:9.4.1.116:api")
|
|
runtimeOnly fg.deobf("mezz.jei:jei-1.18.2:9.4.1.116")
|
|
|
|
shade 'org.squiddev:Cobalt:0.5.2-SNAPSHOT'
|
|
|
|
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.6.0'
|
|
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2'
|
|
|
|
testModImplementation sourceSets.main.output
|
|
testModExtra('org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0') {
|
|
exclude group: "org.jetbrains", module: "annotations"
|
|
}
|
|
|
|
cctJavadoc 'cc.tweaked:cct-javadoc:1.4.5'
|
|
}
|
|
|
|
// 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 = javaVersion
|
|
}
|
|
}
|
|
|
|
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 {
|
|
def hash = 'none'
|
|
Set<String> contributors = []
|
|
try {
|
|
hash = ["git", "-C", projectDir, "rev-parse", "HEAD"].execute().text.trim()
|
|
|
|
def blacklist = ['GitHub', 'dan200', 'Daniel Ratcliffe']
|
|
["git", "-C", projectDir, "log", "--format=tformat:%an%n%cn"].execute().text.split('\n').each {
|
|
if (!blacklist.contains(it)) contributors.add(it)
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace()
|
|
}
|
|
inputs.property "commithash", hash
|
|
duplicatesStrategy = DuplicatesStrategy.INCLUDE
|
|
|
|
from(sourceSets.main.resources.srcDirs) {
|
|
include 'data/computercraft/lua/rom/help/credits.txt'
|
|
|
|
expand(
|
|
'gitcontributors': contributors.sort(false, String.CASE_INSENSITIVE_ORDER).join('\n')
|
|
)
|
|
}
|
|
|
|
from(sourceSets.main.resources.srcDirs) {
|
|
exclude 'data/computercraft/lua/rom/help/credits.txt'
|
|
}
|
|
}
|
|
|
|
sourcesJar {
|
|
duplicatesStrategy = DuplicatesStrategy.INCLUDE
|
|
}
|
|
|
|
// Web tasks
|
|
|
|
|
|
import com.hierynomus.gradle.license.tasks.LicenseCheck
|
|
import com.hierynomus.gradle.license.tasks.LicenseFormat
|
|
import com.modrinth.minotaur.TaskModrinthUpload
|
|
import org.apache.tools.ant.taskdefs.condition.Os
|
|
|
|
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 = "Bundles JS into rollup"
|
|
|
|
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 docWebsite(type: Copy, dependsOn: [illuaminateDocs]) {
|
|
from('doc') {
|
|
include 'logo.png'
|
|
include 'images/**'
|
|
}
|
|
from("$buildDir/rollup") {
|
|
exclude 'index.js'
|
|
}
|
|
into "${project.docsDir}/lua"
|
|
}
|
|
|
|
// Check tasks
|
|
|
|
test {
|
|
useJUnitPlatform()
|
|
testLogging {
|
|
events "skipped", "failed"
|
|
}
|
|
}
|
|
|
|
jacocoTestReport {
|
|
dependsOn('test')
|
|
reports {
|
|
xml.required = true
|
|
html.required = true
|
|
}
|
|
}
|
|
|
|
check.dependsOn 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')
|
|
}
|
|
}
|
|
|
|
tasks.register("testServer", JavaExec.class).configure {
|
|
it.group('In-game tests')
|
|
it.description("Runs tests on a temporary Minecraft instance.")
|
|
it.dependsOn("prepareRunGameTestServer", "cleanTestServer", 'compileTestModJava')
|
|
|
|
// 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("runGameTestServer")
|
|
exec.copyTo(it)
|
|
it.setClasspath(exec.getClasspath())
|
|
it.mainClass = exec.mainClass
|
|
it.setArgs(exec.getArgs())
|
|
|
|
// 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("jacocoTestServerReport")
|
|
|
|
|
|
// 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}"
|
|
}
|
|
}
|
|
|
|
tasks.register('publishModrinth', TaskModrinthUpload.class).configure {
|
|
dependsOn('assemble', 'reobfJar')
|
|
onlyIf {
|
|
project.hasProperty('modrinthApiKey')
|
|
}
|
|
|
|
token = project.hasProperty('modrinthApiKey') ? project.getProperty('modrinthApiKey') : ''
|
|
projectId = 'gu7yAYhd'
|
|
versionNumber = "${project.mc_version}-${project.mod_version}"
|
|
uploadFile = jar
|
|
versionType = isStable ? 'RELEASE' : 'ALPHA'
|
|
addGameVersion(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})."
|
|
addLoader('forge')
|
|
}
|
|
|
|
tasks.withType(GenerateModuleMetadata) {
|
|
// We can't generate metadata as that includes Forge as a dependency.
|
|
enabled = false
|
|
}
|
|
|
|
publishing {
|
|
publications {
|
|
maven(MavenPublication) {
|
|
from components.java
|
|
|
|
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.15.x/LICENSE'
|
|
}
|
|
}
|
|
|
|
withXml { asNode().remove(asNode().get("dependencies")) }
|
|
}
|
|
}
|
|
}
|
|
|
|
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({
|
|
def cmd = ["git", "rev-parse", "--abbrev-ref", "HEAD"]
|
|
println(cmd)
|
|
def proc = cmd.execute([], projectDir)
|
|
if (proc.waitFor() != 0) {
|
|
println(proc.err.text.trim())
|
|
throw new IllegalStateException("Executed with a non-0 exit code (${proc.exitValue()}).")
|
|
}
|
|
|
|
def branch = proc.text.trim()
|
|
if (branch == "") throw new IllegalStateException("Cannot determine branch")
|
|
return branch
|
|
}))
|
|
|
|
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 !isStable
|
|
}
|
|
|
|
def uploadTasks = ["publish", "curseforge", "publishModrinth", "githubRelease"]
|
|
uploadTasks.forEach { tasks.getByName(it).dependsOn checkRelease }
|
|
|
|
task uploadAll(dependsOn: uploadTasks) {
|
|
group "upload"
|
|
description "Uploads to all repositories (Maven, Curse, Modrinth, GitHub release)"
|
|
}
|