mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-12-13 11:40:29 +00:00
9f8774960f
illuaminate does not handle Java files, for obvious reasons. In order to get around that, we have a series of stub files within /doc/stub which mirrored the Java ones. While this works, it has a few problems: - The link to source code does not work - it just links to the stub file. - There's no guarantee that documentation remains consistent with the Java code. This change found several methods which were incorrectly documented beforehand. We now replace this with a custom Java doclet[1], which extracts doc comments from @LuaFunction annotated methods and generates stub-files from them. These also contain a @source annotation, which allows us to correctly link them back to the original Java code. There's some issues with this which have yet to be fixed. However, I don't think any of them are major blockers right now: - The custom doclet relies on Java 9 - I think it's /technically/ possible to do this on Java 8, but the API is significantly uglier. This means that we need to run javadoc on a separate JVM. This is possible, and it works locally and on CI, but is definitely not a nice approach. - illuaminate now requires the doc stubs to be generated in order for the linter to pass, which does make running the linter locally much harder (especially given the above bullet point). We could notionally include the generated stubs (or at least a cut down version of them) in the repo, but I'm not 100% sure about that. [1]: https://docs.oracle.com/javase/9/docs/api/jdk/javadoc/doclet/package-summary.html
500 lines
15 KiB
Groovy
500 lines
15 KiB
Groovy
buildscript {
|
|
repositories {
|
|
jcenter()
|
|
mavenCentral()
|
|
maven {
|
|
name = "forge"
|
|
url = "https://files.minecraftforge.net/maven"
|
|
}
|
|
}
|
|
dependencies {
|
|
classpath 'com.google.code.gson:gson:2.8.1'
|
|
classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.179'
|
|
classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
|
|
classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
|
|
}
|
|
}
|
|
|
|
plugins {
|
|
id "checkstyle"
|
|
id "jacoco"
|
|
id "com.github.hierynomus.license" version "0.15.0"
|
|
id "com.matthewprenger.cursegradle" version "1.3.0"
|
|
id "com.github.breadmoirai.github-release" version "2.2.4"
|
|
}
|
|
|
|
apply plugin: 'net.minecraftforge.gradle'
|
|
apply plugin: 'org.ajoberstar.grgit'
|
|
apply plugin: 'maven-publish'
|
|
apply plugin: 'maven'
|
|
|
|
version = mod_version
|
|
|
|
group = "org.squiddev"
|
|
archivesBaseName = "cc-tweaked-${mc_version}"
|
|
|
|
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'
|
|
|
|
minecraft {
|
|
runs {
|
|
client {
|
|
workingDirectory project.file('run')
|
|
property 'forge.logging.markers', 'REGISTRIES'
|
|
property 'forge.logging.console.level', 'debug'
|
|
|
|
mods {
|
|
computercraft {
|
|
source sourceSets.main
|
|
}
|
|
}
|
|
}
|
|
|
|
server {
|
|
workingDirectory project.file("run/server-${mc_version}")
|
|
property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
|
|
property 'forge.logging.console.level', 'debug'
|
|
|
|
mods {
|
|
computercraft {
|
|
source sourceSets.main
|
|
}
|
|
}
|
|
}
|
|
|
|
data {
|
|
workingDirectory project.file('run')
|
|
property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
|
|
property 'forge.logging.console.level', 'debug'
|
|
|
|
args '--mod', 'computercraft', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')
|
|
mods {
|
|
computercraft {
|
|
source sourceSets.main
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
mappings channel: 'snapshot', version: "${mappings_version}".toString()
|
|
|
|
accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg')
|
|
}
|
|
|
|
sourceSets {
|
|
main.resources {
|
|
srcDir 'src/generated/resources'
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
maven {
|
|
name "SquidDev"
|
|
url "https://squiddev.cc/maven"
|
|
}
|
|
}
|
|
|
|
configurations {
|
|
shade
|
|
compile.extendsFrom shade
|
|
deployerJars
|
|
cctJavadoc
|
|
}
|
|
|
|
dependencies {
|
|
checkstyle "com.puppycrawl.tools:checkstyle:8.25"
|
|
|
|
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
|
|
|
compileOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3:api")
|
|
compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.15.2:6.0.0.9")
|
|
|
|
runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3")
|
|
|
|
compileOnly 'com.google.auto.service:auto-service:1.0-rc7'
|
|
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
|
|
|
|
shade 'org.squiddev:Cobalt:0.5.1-SNAPSHOT'
|
|
|
|
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
|
|
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
|
|
testImplementation 'org.hamcrest:hamcrest:2.2'
|
|
|
|
deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0"
|
|
|
|
cctJavadoc 'cc.tweaked:cct-javadoc:1.0.0'
|
|
}
|
|
|
|
// Compile tasks
|
|
|
|
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("doc/javadoc")
|
|
classpath = sourceSets.main.compileClasspath
|
|
|
|
options.docletpath = configurations.cctJavadoc.files as List
|
|
options.doclet = "cc.tweaked.javadoc.LuaDoclet"
|
|
|
|
// Attempt to run under Java 11 (any Java >= 9 will work though).
|
|
if(System.getProperty("java.version").startsWith("1.")
|
|
&& (System.getenv("JAVA_HOME_11_X64") != null || project.hasProperty("java11Home"))) {
|
|
executable = "${System.getenv("JAVA_HOME_11_X64") ?: project.property("java11Home")}/bin/javadoc"
|
|
}
|
|
}
|
|
|
|
jar {
|
|
dependsOn javadoc
|
|
|
|
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")])
|
|
}
|
|
|
|
from (sourceSets.main.allSource) {
|
|
include "dan200/computercraft/api/**/*.java"
|
|
}
|
|
|
|
from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
|
|
}
|
|
|
|
[compileJava, compileTestJava].forEach {
|
|
it.configure {
|
|
options.compilerArgs << "-Xlint" << "-Xlint:-processing"
|
|
}
|
|
}
|
|
|
|
import java.nio.charset.StandardCharsets
|
|
import java.nio.file.*
|
|
import java.util.zip.*
|
|
|
|
import com.google.gson.GsonBuilder
|
|
import com.google.gson.JsonElement
|
|
import com.hierynomus.gradle.license.tasks.LicenseCheck
|
|
import com.hierynomus.gradle.license.tasks.LicenseFormat
|
|
import org.ajoberstar.grgit.Grgit
|
|
import proguard.gradle.ProGuardTask
|
|
|
|
task proguard(type: ProGuardTask, dependsOn: jar) {
|
|
description "Removes unused shadowed classes from the jar"
|
|
group "compact"
|
|
|
|
injars jar.archivePath
|
|
outjars "${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar"
|
|
|
|
// Add the main runtime jar and all non-shadowed dependencies
|
|
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
|
|
libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
|
|
doFirst {
|
|
sourceSets.main.compileClasspath
|
|
.filter { !it.name.contains("Cobalt") }
|
|
.each { libraryjars it }
|
|
}
|
|
|
|
// We want to avoid as much obfuscation as possible. We're only doing this to shrink code size.
|
|
dontobfuscate; dontoptimize; keepattributes; keepparameternames
|
|
|
|
// Proguard will remove directories by default, but that breaks JarMount.
|
|
keepdirectories 'data/computercraft/lua**'
|
|
|
|
// Preserve ComputerCraft classes - we only want to strip shadowed files.
|
|
keep 'class dan200.computercraft.** { *; }'
|
|
|
|
// LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard
|
|
dontwarn 'module-info'
|
|
dontwarn 'org.apache.**,org.lwjgl.**'
|
|
}
|
|
|
|
task proguardMove(dependsOn: proguard) {
|
|
description "Replace the original jar with the minified version"
|
|
group "compact"
|
|
|
|
doLast {
|
|
Files.move(
|
|
file("${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar").toPath(),
|
|
file(jar.archivePath).toPath(),
|
|
StandardCopyOption.REPLACE_EXISTING
|
|
)
|
|
}
|
|
}
|
|
|
|
processResources {
|
|
inputs.property "version", mod_version
|
|
inputs.property "mcversion", mc_version
|
|
|
|
def hash = 'none'
|
|
Set<String> contributors = []
|
|
try {
|
|
def grgit = Grgit.open(dir: '.')
|
|
hash = grgit.head().id
|
|
|
|
def blacklist = ['GitHub', 'dan200', 'Daniel Ratcliffe']
|
|
grgit.log().each {
|
|
if (!blacklist.contains(it.author.name)) contributors.add(it.author.name)
|
|
if (!blacklist.contains(it.committer.name)) contributors.add(it.committer.name)
|
|
}
|
|
} catch(Exception ignored) { }
|
|
|
|
inputs.property "commithash", hash
|
|
|
|
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'
|
|
}
|
|
}
|
|
|
|
task compressJson(dependsOn: jar) {
|
|
group "compact"
|
|
description "Minifies all JSON files, stripping whitespace"
|
|
|
|
def jarPath = file(jar.archivePath)
|
|
|
|
def tempPath = File.createTempFile("input", ".jar", temporaryDir)
|
|
tempPath.deleteOnExit()
|
|
|
|
def gson = new GsonBuilder().create()
|
|
|
|
doLast {
|
|
// Copy over all files in the current jar to the new one, running json files from GSON. As pretty printing
|
|
// is turned off, they should be minified.
|
|
new ZipFile(jarPath).withCloseable { inJar ->
|
|
tempPath.getParentFile().mkdirs()
|
|
new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(tempPath))).withCloseable { outJar ->
|
|
inJar.entries().each { entry ->
|
|
if(entry.directory) {
|
|
outJar.putNextEntry(entry)
|
|
} else if(!entry.name.endsWith(".json")) {
|
|
outJar.putNextEntry(entry)
|
|
inJar.getInputStream(entry).withCloseable { outJar << it }
|
|
} else {
|
|
ZipEntry newEntry = new ZipEntry(entry.name)
|
|
newEntry.setTime(entry.time)
|
|
outJar.putNextEntry(newEntry)
|
|
|
|
def element = inJar.getInputStream(entry).withCloseable { gson.fromJson(it.newReader("UTF8"), JsonElement.class) }
|
|
outJar.write(gson.toJson(element).getBytes(StandardCharsets.UTF_8))
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// And replace the original jar again
|
|
Files.move(tempPath.toPath(), jarPath.toPath(), StandardCopyOption.REPLACE_EXISTING)
|
|
}
|
|
}
|
|
|
|
assemble.dependsOn compressJson
|
|
|
|
// Check tasks
|
|
|
|
test {
|
|
useJUnitPlatform()
|
|
testLogging {
|
|
events "skipped", "failed"
|
|
}
|
|
}
|
|
|
|
jacocoTestReport {
|
|
reports {
|
|
xml.enabled true
|
|
html.enabled 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 rootProject.file('config/license/main.txt')
|
|
}
|
|
}
|
|
|
|
[licenseTest, licenseFormatTest].forEach {
|
|
it.configure {
|
|
include("**/*.java")
|
|
header rootProject.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 rootProject.file('config/license/api.txt')
|
|
}
|
|
}
|
|
|
|
// 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.txt")
|
|
inputs.file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt")
|
|
|
|
doLast {
|
|
def ok = true
|
|
|
|
// Check we're targetting the current version
|
|
def whatsnew = new File("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt").readLines()
|
|
if (whatsnew[0] != "New features in CC: Tweaked $mod_version") {
|
|
ok = false
|
|
project.logger.error("Expected `whatsnew.txt' 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.txt")
|
|
} else {
|
|
whatsnew = whatsnew.getAt(0 ..< idx)
|
|
}
|
|
|
|
// Check whatsnew and changelog match.
|
|
def versionChangelog = "# " + whatsnew.join("\n")
|
|
def changelog = new File("src/main/resources/data/computercraft/lua/rom/help/changelog.txt").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
|
|
|
|
curseforge {
|
|
apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : ''
|
|
project {
|
|
id = '282001'
|
|
releaseType = 'release'
|
|
changelog = "Release notes can be found on the GitHub repository (https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
|
|
|
|
relations {
|
|
incompatible "computercraft"
|
|
}
|
|
}
|
|
}
|
|
|
|
publishing {
|
|
publications {
|
|
mavenJava(MavenPublication) {
|
|
from components.java
|
|
// artifact sourceJar
|
|
}
|
|
}
|
|
}
|
|
|
|
uploadArchives {
|
|
repositories {
|
|
if(project.hasProperty('mavenUploadUrl')) {
|
|
mavenDeployer {
|
|
configuration = configurations.deployerJars
|
|
|
|
repository(url: project.property('mavenUploadUrl')) {
|
|
authentication(
|
|
userName: project.property('mavenUploadUser'),
|
|
privateKey: project.property('mavenUploadKey'))
|
|
}
|
|
|
|
pom.project {
|
|
name 'CC: Tweaked'
|
|
packaging 'jar'
|
|
description 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.'
|
|
url 'https://github.com/SquidDev-CC/CC-Tweaked'
|
|
|
|
scm {
|
|
url 'https://github.com/SquidDev-CC/CC-Tweaked.git'
|
|
}
|
|
|
|
issueManagement {
|
|
system 'github'
|
|
url 'https://github.com/SquidDev-CC/CC-Tweaked/issues'
|
|
}
|
|
|
|
licenses {
|
|
license {
|
|
name 'ComputerCraft Public License, Version 1.0'
|
|
url 'https://github.com/SquidDev-CC/CC-Tweaked/blob/master/LICENSE'
|
|
distribution 'repo'
|
|
}
|
|
}
|
|
}
|
|
|
|
pom.whenConfigured { pom ->
|
|
pom.dependencies.clear()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
githubRelease {
|
|
token project.hasProperty('githubApiKey') ? project.githubApiKey : ''
|
|
owner 'SquidDev-CC'
|
|
repo 'CC-Tweaked'
|
|
try {
|
|
targetCommitish = Grgit.open(dir: '.').branch.current().name
|
|
} catch(Exception ignored) { }
|
|
|
|
tagName "v${mc_version}-${mod_version}"
|
|
releaseName "[${mc_version}] ${mod_version}"
|
|
body {
|
|
"## " + new File("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt")
|
|
.readLines()
|
|
.takeWhile { it != 'Type "help changelog" to see the full version history.' }
|
|
.join("\n").trim()
|
|
}
|
|
prerelease false
|
|
}
|
|
|
|
def uploadTasks = ["uploadArchives", "curseforge", "githubRelease"]
|
|
uploadTasks.forEach { tasks.getByName(it).dependsOn checkRelease }
|
|
|
|
task uploadAll(dependsOn: uploadTasks) {
|
|
group "upload"
|
|
description "Uploads to all repositories (Maven, Curse, GitHub release)"
|
|
}
|