2017-05-01 13:32:39 +00:00
// For those who want the bleeding edge
buildscript {
repositories {
jcenter ( )
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
}
dependencies {
2019-02-14 10:53:18 +00:00
classpath 'com.google.code.gson:gson:2.8.1'
2017-06-12 08:14:57 +00:00
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
2019-02-14 10:53:18 +00:00
classpath 'net.sf.proguard:proguard-gradle:6.1.0beta1'
2019-01-28 14:05:30 +00:00
classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
2017-05-01 13:32:39 +00:00
}
}
plugins {
2019-05-01 12:48:33 +00:00
id 'com.matthewprenger.cursegradle' version '1.2.0'
2019-04-07 14:30:27 +00:00
id "com.github.breadmoirai.github-release" version "2.2.4"
2017-05-01 13:32:39 +00:00
}
2017-12-01 20:05:26 +00:00
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'org.ajoberstar.grgit'
2018-04-19 21:36:00 +00:00
apply plugin: 'maven-publish'
apply plugin: 'maven'
2017-12-01 20:05:26 +00:00
2019-03-19 11:47:12 +00:00
version = mod_version
2019-02-19 14:49:13 +00:00
2017-11-15 16:25:10 +00:00
group = "org.squiddev"
2019-03-19 11:47:12 +00:00
archivesBaseName = "cc-tweaked-${mc_version}"
2017-05-01 13:32:39 +00:00
minecraft {
2019-03-19 11:47:12 +00:00
version = "${mc_version}-${forge_version}"
2017-05-01 13:32:39 +00:00
runDir = "run"
2019-03-19 11:47:12 +00:00
replace '${version}' , mod_version
mappings = mappings_version
makeObfSourceJar = false
2017-05-01 13:32:39 +00:00
}
2017-10-25 12:40:35 +00:00
repositories {
maven {
2019-03-19 11:47:12 +00:00
name "JEI"
url "http://dvs1.progwml6.com/files/maven"
2017-10-25 12:40:35 +00:00
}
2017-05-01 16:49:22 +00:00
maven {
2019-03-19 11:47:12 +00:00
name "SquidDev"
url "https://squiddev.cc/maven"
}
ivy {
name "Charset"
artifactPattern "https://asie.pl/files/mods/Charset/LibOnly/[module]-[revision](-[classifier]).[ext]"
}
maven {
name "Amadornes"
url "http://maven.amadornes.com/"
2017-05-01 16:49:22 +00:00
}
}
configurations {
shade
compile . extendsFrom shade
2018-04-19 21:36:00 +00:00
deployerJars
2017-10-25 12:40:35 +00:00
}
2017-05-01 13:32:39 +00:00
2017-10-25 12:40:35 +00:00
dependencies {
2019-03-16 01:49:02 +00:00
deobfProvided "mezz.jei:jei_1.12.2:4.15.0.269:api"
2018-08-11 09:48:41 +00:00
deobfProvided "pl.asie:Charset-Lib:0.5.4.6"
2019-04-24 14:14:22 +00:00
deobfProvided "MCMultiPart2:MCMultiPart:2.5.3"
2018-08-11 09:48:41 +00:00
2019-03-16 01:49:02 +00:00
runtime "mezz.jei:jei_1.12.2:4.15.0.269"
2018-08-11 09:48:41 +00:00
Bump Cobalt version to enable single-threading
The latest version of Cobalt has several major changes, which I'm
looking forward to taking advantage of in the coming months:
- The Lua interpreter has been split up from the actual LuaClosure
instance. It now runs multiple functions within one loop, handling
pushing/popping and resuming method calls correctly.
This means we have a theoretically infinite call depth, as we're no
longer bounded by Java's stack size. In reality, this is limited to
32767 (Short.MAX_VALUE), as that's a mostly equivalent to the limits
PUC Lua exposes.
- The stack is no longer unwound in the event of errors. This both
simplifies error handling (not that CC:T needs to care about that)
but also means one can call debug.traceback on a now-dead coroutine
(which is more useful for debugging than using xpcall).
- Most significantly, coroutines are no longer each run on a dedicated
thread. Instead, yielding or resuming throws an exception to unwind
the Java stack and switches to a different coroutine.
In order to preserve compatability with CC's assumption about LuaJ's
threading model (namely that yielding blocks the thread), we also
provide a yieldBlock method (which CC:T consumes). This suspends the
current thread and switches execution to a new thread (see
SquidDev/Cobalt@b5ddf164f1c77bc2657f096f39dd167c19270f6d for more
details). While this does mean we need to use more than 1 thread,
it's still /substantially/ less than would otherwise be needed.
We've been running these changes on SwitchCraft for a few days now and
haven't seen any issues. One nice thing to observe is that the number of
CC thread has gone down from ~1.9k to ~100 (of those, ~70 are dedicated
to running coroutines). Similarly, the server has gone from generating
~15k threads over its lifetime, to ~3k. While this is still a lot, it's
a substantial improvement.
2019-02-10 21:46:52 +00:00
shade 'org.squiddev:Cobalt:0.5.0-SNAPSHOT'
2018-02-21 15:29:34 +00:00
2019-03-01 23:48:32 +00:00
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
2018-04-19 21:36:00 +00:00
deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0"
2017-05-01 13:32:39 +00:00
}
2017-11-14 22:37:37 +00:00
javadoc {
include "dan200/computercraft/api/**/*.java"
}
2017-05-14 16:00:14 +00:00
jar {
2017-11-14 22:37:37 +00:00
dependsOn javadoc
2017-05-14 16:00:14 +00:00
manifest {
attributes ( 'FMLAT' : 'computercraft_at.cfg' )
}
2017-11-14 21:48:47 +00:00
2019-02-19 14:49:13 +00:00
from ( sourceSets . main . allSource ) {
2017-11-14 22:37:37 +00:00
include "dan200/computercraft/api/**/*.java"
2019-02-19 14:49:13 +00:00
}
2017-11-14 22:37:37 +00:00
2017-11-14 21:48:47 +00:00
from configurations . shade . collect { it . isDirectory ( ) ? it : zipTree ( it ) }
2017-05-14 16:00:14 +00:00
}
2019-02-14 10:53:18 +00:00
import java.nio.charset.StandardCharsets
import java.nio.file.*
import java.util.zip.*
import com.google.gson.GsonBuilder
import com.google.gson.JsonElement
2017-05-24 16:35:41 +00:00
import org.ajoberstar.grgit.Grgit
2019-02-14 10:53:18 +00:00
import proguard.gradle.ProGuardTask
task proguard ( type: ProGuardTask , dependsOn: jar ) {
description "Removes unused shadowed classes from the jar"
2019-02-16 15:57:35 +00:00
group "compact"
2019-02-14 10:53:18 +00:00
injars jar . archivePath
outjars "${jar.archivePath.absolutePath.replace(" . jar ", " ")}-min.jar"
2019-02-16 15:57:35 +00:00
// Add the main runtime jar and all non-shadowed dependencies
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
doFirst {
sourceSets . main . compileClasspath
. filter { ! it . name . contains ( "Cobalt" ) }
. each { libraryjars it }
}
2019-02-14 10:53:18 +00:00
// 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 'assets/computercraft/lua**'
// Preserve ComputerCraft classes - we only want to strip shadowed files.
keep 'class dan200.computercraft.** { *; }'
// Preserve the constructors in Cobalt library class, as we init them via reflection
keepclassmembers 'class org.squiddev.cobalt.lib.** { <init>(...); }'
}
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
)
}
}
reobfJar . dependsOn proguardMove
2017-05-24 16:35:41 +00:00
processResources {
2019-03-19 11:47:12 +00:00
inputs . property "version" , mod_version
2019-02-20 09:48:16 +00:00
inputs . property "mcversion" , mc_version
2017-05-01 13:32:39 +00:00
2019-01-28 14:05:30 +00:00
def hash = 'none'
2017-05-24 17:20:46 +00:00
Set < String > contributors = [ ]
2019-01-28 14:05:30 +00:00
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 ) { }
2017-07-06 16:23:35 +00:00
2019-01-28 14:05:30 +00:00
inputs . property "commithash" , hash
2017-05-24 17:20:46 +00:00
2017-05-01 13:32:39 +00:00
from ( sourceSets . main . resources . srcDirs ) {
include 'mcmod.info'
2017-05-24 17:20:46 +00:00
include 'assets/computercraft/lua/rom/help/credits.txt'
2019-03-19 11:47:12 +00:00
expand 'version' : mod_version ,
2019-02-20 09:48:16 +00:00
'mcversion' : mc_version ,
'gitcontributors' : contributors . sort ( false , String . CASE_INSENSITIVE_ORDER ) . join ( '\n' )
2017-07-06 16:23:35 +00:00
}
2017-05-01 13:32:39 +00:00
from ( sourceSets . main . resources . srcDirs ) {
exclude 'mcmod.info'
2017-05-24 17:20:46 +00:00
exclude 'assets/computercraft/lua/rom/help/credits.txt'
2017-05-01 13:32:39 +00:00
}
}
2019-02-14 10:53:18 +00:00
task compressJson ( dependsOn: extractAnnotationsJar ) {
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 - >
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
2017-12-01 20:05:26 +00:00
2019-05-31 09:19:24 +00:00
task checkRelease ( dependsOn: extractAnnotationsJar ) {
group "upload"
description "Verifies that everything is ready for a release"
inputs . property "version" , mod_version
inputs . file ( "src/main/resources/assets/computercraft/lua/rom/help/changelog.txt" )
inputs . file ( "src/main/resources/assets/computercraft/lua/rom/help/whatsnew.txt" )
doLast {
def ok = true
// Check we're targetting the current version
def whatsnew = new File ( "src/main/resources/assets/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/assets/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" )
}
}
2017-12-01 20:05:26 +00:00
curseforge {
apiKey = project . hasProperty ( 'curseForgeApiKey' ) ? project . curseForgeApiKey : ''
project {
id = '282001'
2019-02-23 10:35:15 +00:00
releaseType = 'release'
2019-04-02 20:37:19 +00:00
changelog = "Release notes can be found on the GitHub repository (https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
2019-05-01 12:48:33 +00:00
relations {
incompatible "computercraft"
}
2017-12-01 20:05:26 +00:00
}
}
2018-04-19 21:36:00 +00:00
publishing {
publications {
mavenJava ( MavenPublication ) {
from components . java
artifact sourceJar
}
}
}
uploadArchives {
repositories {
if ( project . hasProperty ( 'mavenUploadUrl' ) ) {
mavenDeployer {
configuration = configurations . deployerJars
2018-04-20 18:39:53 +00:00
2018-04-19 21:36:00 +00:00
repository ( url: project . property ( 'mavenUploadUrl' ) ) {
authentication (
userName: project . property ( 'mavenUploadUser' ) ,
privateKey: project . property ( 'mavenUploadKey' ) )
}
2018-04-20 18:39:53 +00:00
pom . project {
name 'CC: Tweaked'
packaging 'jar'
2019-03-19 11:47:12 +00:00
description 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.'
2018-04-20 18:39:53 +00:00
url 'https://github.com/SquidDev-CC/CC-Tweaked'
scm {
2019-03-19 11:47:12 +00:00
url 'https://github.com/SquidDev-CC/CC-Tweaked.git'
2018-04-20 18:39:53 +00:00
}
issueManagement {
system 'github'
2019-03-19 11:47:12 +00:00
url 'https://github.com/SquidDev-CC/CC-Tweaked/issues'
2018-04-20 18:39:53 +00:00
}
licenses {
license {
name 'ComputerCraft Public License, Version 1.0'
2019-03-19 11:47:12 +00:00
url 'https://github.com/SquidDev-CC/CC-Tweaked/blob/master/LICENSE'
2018-04-20 18:39:53 +00:00
distribution 'repo'
}
}
}
pom . whenConfigured { pom - >
pom . dependencies . clear ( )
}
2018-04-19 21:36:00 +00:00
}
}
}
}
2019-04-07 14:30:27 +00:00
githubRelease {
token project . hasProperty ( 'githubApiKey' ) ? project . githubApiKey : ''
owner 'SquidDev-CC'
repo 'CC-Tweaked'
2019-06-01 08:23:18 +00:00
targetCommitish { Grgit . open ( dir: '.' ) . branch . current ( ) . name }
2019-04-07 14:30:27 +00:00
tagName "v${mc_version}-${mod_version}"
releaseName "[${mc_version}] ${mod_version}"
2019-05-31 09:19:24 +00:00
body {
2019-05-31 12:56:48 +00:00
"## " + new File ( "src/main/resources/assets/computercraft/lua/rom/help/whatsnew.txt" )
2019-05-31 09:19:24 +00:00
. readLines ( )
. takeWhile { it ! = 'Type "help changelog" to see the full version history.' }
. join ( "\n" ) . trim ( )
}
2019-04-07 14:30:27 +00:00
prerelease false
}
2019-06-01 08:23:18 +00:00
def uploadTasks = [ "uploadArchives" , "curseforge" , "githubRelease" ]
uploadTasks . forEach { tasks . getByName ( it ) . dependsOn checkRelease }
task uploadAll ( dependsOn: uploadTasks ) {
2019-04-16 09:32:49 +00:00
group "upload"
description "Uploads to all repositories (Maven, Curse, GitHub release)"
}
2019-03-01 23:48:32 +00:00
test {
useJUnitPlatform ( )
testLogging {
events "passed" , "skipped" , "failed"
}
}
2017-05-07 00:42:32 +00:00
gradle . projectsEvaluated {
tasks . withType ( JavaCompile ) {
2019-03-19 11:47:12 +00:00
options . compilerArgs < < "-Xlint" < < "-Xlint:-processing" < < "-Werror"
2017-05-07 00:42:32 +00:00
}
}
2017-05-24 16:35:41 +00:00
2017-11-14 22:37:37 +00:00
runClient . outputs . upToDateWhen { false }
runServer . outputs . upToDateWhen { false }