From bfa027baf9b53b184becada2a18d4e0c1bb1f9f7 Mon Sep 17 00:00:00 2001 From: Kamesuta Date: Mon, 11 Sep 2017 22:01:46 +0900 Subject: [PATCH] =?UTF-8?q?Travis=E7=92=B0=E5=A2=83=E6=A7=8B=E7=AF=89?= =?UTF-8?q?=E3=81=A8Gradle=E3=83=BBMod=E7=92=B0=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 141 ++---- .idea/compiler.xml | 10 - .idea/misc.xml | 10 - .idea/modules.xml | 11 - .../SuperCompressedCobblestoneMod_api.iml | 126 ----- .../SuperCompressedCobblestoneMod_main.iml | 138 ------ .../SuperCompressedCobblestoneMod_test.iml | 130 ------ .idea/vcs.xml | 6 - .travis.yml | 32 ++ README.md | 3 +- SuperCompressedCobblestoneMod.iml | 13 - build.bat | 3 + build.gradle | 437 ++++++++++++++++-- build.sh | 5 + gradle.properties | 36 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54712 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 89 ++-- gradlew.bat | 14 +- install.bat | 3 + install.sh | 5 + settings.gradle | 1 + src/main/kotlin/c6h2cl2/sccsm/Reference.kt | 18 + src/main/kotlin/c6h2cl2/sccsm/SCCSMConst.kt | 10 - src/main/kotlin/c6h2cl2/sccsm/SCCSMCore.kt | 7 +- src/main/resources/mcmod.info | 26 ++ 26 files changed, 622 insertions(+), 656 deletions(-) delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/modules/SuperCompressedCobblestoneMod_api.iml delete mode 100644 .idea/modules/SuperCompressedCobblestoneMod_main.iml delete mode 100644 .idea/modules/SuperCompressedCobblestoneMod_test.iml delete mode 100644 .idea/vcs.xml create mode 100644 .travis.yml delete mode 100644 SuperCompressedCobblestoneMod.iml create mode 100644 build.bat create mode 100644 build.sh create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 install.bat create mode 100644 install.sh create mode 100644 settings.gradle create mode 100644 src/main/kotlin/c6h2cl2/sccsm/Reference.kt delete mode 100644 src/main/kotlin/c6h2cl2/sccsm/SCCSMConst.kt create mode 100644 src/main/resources/mcmod.info diff --git a/.gitignore b/.gitignore index 82e2b93..02e481a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,111 +1,30 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -### JetBrains template -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff: -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/dictionaries - -# Sensitive or high-churn files: -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.xml -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml - -# Gradle: -.idea/**/gradle.xml -.idea/**/libraries - -# CMake -cmake-build-debug/ - -# Mongo Explorer plugin: -.idea/**/mongoSettings.xml - -## File-based project format: -*.iws - -## Plugin-specific files: - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties -### Windows template -# Windows thumbnail cache files -Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk -### Gradle template -.gradle -/build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -# Cache of project -.gradletasknamecache - -# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 -# gradle/wrapper/gradle-wrapper.properties - +## .gitignore ## +# ignore all +* +changelog.md + +1.*/* +common/* + +# allow any +!*.md +!src/ +!gradle/ +!lib/ +!info/ +!build.gradle +!common.gradle +!project.gradle +!settings.gradle +!gradle.properties +!properties.gradle +!gradlew +!gradlew.bat +!install.bat +!build.bat +!install.sh +!build.sh +!.gitmodules +!.gitignore +!.gitattributes +!.travis.yml \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 1e6b572..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 99fa241..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index d1b8874..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/SuperCompressedCobblestoneMod_api.iml b/.idea/modules/SuperCompressedCobblestoneMod_api.iml deleted file mode 100644 index 59f23bc..0000000 --- a/.idea/modules/SuperCompressedCobblestoneMod_api.iml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/SuperCompressedCobblestoneMod_main.iml b/.idea/modules/SuperCompressedCobblestoneMod_main.iml deleted file mode 100644 index 45bbb4d..0000000 --- a/.idea/modules/SuperCompressedCobblestoneMod_main.iml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/SuperCompressedCobblestoneMod_test.iml b/.idea/modules/SuperCompressedCobblestoneMod_test.iml deleted file mode 100644 index 7ab2e79..0000000 --- a/.idea/modules/SuperCompressedCobblestoneMod_test.iml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0fa87dd --- /dev/null +++ b/.travis.yml @@ -0,0 +1,32 @@ +language: java +jdk: oraclejdk8 +branches: + except: + - /^b[0-9]/ +before_install: + - sh gradlew clean +install: + - sh gradlew setupCIWorkspace --continue +script: + - sh gradlew build --continue +before_cache: + - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ +cache: + directories: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ +deploy: + - provider: script + skip_cleanup: true +# CurseForgeやBintrayのAPIなどが準備できたらこっち +# script: "sh gradlew githubRelease bintrayUpload curseforge --continue" + script: "sh gradlew githubRelease --continue" + on: + all_branches: true + condition: '! "$TRAVIS_BRANCH" =~ ^(dev\\-|feature\\/).*$' +notifications: + email: false + webhooks: + urls: + secure: "l0p54ziHmZszGmy0MyqvDAbj5d9+vbqkUDjvjQuENS+rJuRO+MD83txViIO6Y3eRO9D7PpR0MRdeDesTMFSvsRsYjF9uC7k95Hk/+3JMEyjJ2CN6TW+f3SrKktMJypA6mdqH6ylhMTVkAONoZ+01iB3lRmlLnnYcBuk0juF+zQ9FzUF/MZpl54tjPwlnn+clpB0B6llcJcP8MhYw7y2Wqr6tBXc7wnYyF9os7H7pLuQuBov17D4E6FX2ZDCa2tw3HDXaxHyvEElmP+nGdmo7xwdSLDrD1eyT/+3aoXLygV1SijfT/zEmCIvEGoUp8znRWhOhN2k4b4m8Khp908IoXFxtoVID/VLiJuRPW9vRkQuYB0pGaWeJXVY8PnUKPeidN+6hzBxw6Ky9J+yq2qrkfxX5cUTYnLsOFgXlev6LdgzIefLbsQ/xOelkf485w+jXNk7Flx1Tmnt0XWmWoHWWcAiDm9dMlES9GjWbb62AEUpI/mLCzLBZZVZwZd8/UUGAOpqcsi5uWrXCohOJN5rDXeje9PqUP0CIrrOkTE5JWZDPhSCpKgoU7t6z8sRrcUlDhUoAW2TVLKjyMpTMAwLKmsndr+UP4bGeX6q2hle4RxvFcubP8WCw3GjL2Eqb5w9X1eCiFva6U0zGBDhctJoG0bvwzdTbNL3/8t6dqk+T/d4=" \ No newline at end of file diff --git a/README.md b/README.md index 3aa63d9..b4f40f7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# SuperCompressedCobblestoneMod +[![Build Status](https://travis-ci.org/KotlinModdingNetwork/SuperCompressedCobblestoneMod.svg?branch=master)](https://travis-ci.org/KotlinModdingNetwork/SuperCompressedCobblestoneMod) +# SuperCompressedCobblestoneMod ## 詳細/タスク 超圧縮丸石mod.mdを見てください。 diff --git a/SuperCompressedCobblestoneMod.iml b/SuperCompressedCobblestoneMod.iml deleted file mode 100644 index 0b80208..0000000 --- a/SuperCompressedCobblestoneMod.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..1e07217 --- /dev/null +++ b/build.bat @@ -0,0 +1,3 @@ +cd /d %~dp0 +call gradlew build +pause \ No newline at end of file diff --git a/build.gradle b/build.gradle index b514727..a60db10 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,15 @@ // For those who want the bleeding edge buildscript { - ext.kotlin_version = '1.1.4-2' - ext.mc_version = '1.10.2' - ext.jei_version = '3.14.7.420' repositories { jcenter() maven { name = "forge" url = "http://files.minecraftforge.net/maven" } + maven { + name = 'sonatype' + url = 'https://oss.sonatype.org/content/repositories/snapshots/' + } maven { name = "CurseForge" url = "https://minecraft.curseforge.com/api/maven/" @@ -18,34 +19,199 @@ buildscript { } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath forgegradle + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}" + } +} + +plugins { + id 'com.palantir.git-version' version '0.7.1' + id 'co.riiid.gradle' version '0.4.2' + id 'com.jfrog.bintray' version '1.7.3' + id 'com.matthewprenger.cursegradle' version '1.0.8' +} + +project.metaClass { + isProperty = { propName -> + return delegate.hasProperty(propName) && !delegate.property(propName).empty } } -apply plugin: 'net.minecraftforge.gradle.forge' + +apply plugin: forgegradle_plugin apply plugin: 'kotlin' +apply plugin: 'maven-publish' + +import org.apache.commons.lang.StringUtils + +ext { + mod_build_prefix = 'b' + + assert project.isProperty('version_major'): 'missing property: version_major' + assert project.isProperty('version_minor'): 'missing property: version_minor' + assert project.isProperty('version_patch'): 'missing property: version_patch' + + mod_travis = System.getenv('TRAVIS') as boolean + mod_buildnumber = System.getenv('TRAVIS_BUILD_NUMBER') as Integer + mod_buildtag = System.getenv('TRAVIS_TAG') + mod_prerelease = mod_autorelease = mod_travis && StringUtils.isEmpty(mod_buildtag) + + if (mod_buildtag != null && mod_buildtag.startsWith(mod_build_prefix)) + throw new GradleException("Oops, circulated travis build. A push starting with the prefix '${mod_build_prefix}' was detected: ${mod_buildtag}") + + mod_version_min = "${project.version_major}.${project.version_minor}.${project.version_patch}" + mod_version = mod_buildnumber != null ? "${mod_version_min}.${mod_buildnumber}" : "${mod_version_min}" + mod_artifacts_dir = file "artifacts/${mod_version_min}/${mod_version}" + mod_artifacts_release_dir = file 'artifacts/release' + + mod_git_repo = plugins.findPlugin('com.palantir.git-version').gitRepo(rootProject).repository + mod_git_head = mod_git_repo.getRef('HEAD').objectId.name() + + def parseChangelog = { changelog -> + def title = null + def msg = null + def releasetype = 'release' + + if (changelog != null) { + if (StringUtils.contains(changelog, '[beta]')) { + changelog = StringUtils.replace(changelog, '[beta]', '') + releasetype = 'beta' + } else if (StringUtils.contains(changelog, '[alpha]')) { + changelog = StringUtils.replace(changelog, '[alpha]', '') + releasetype = 'alpha' + } + + def tagtitle = StringUtils.substringBefore(changelog, '\n') + def tagmsg = StringUtils.stripStart(StringUtils.substringAfter(changelog, '\n'), '\n') + if (!StringUtils.isEmpty(tagtitle) && !StringUtils.isEmpty(tagmsg)) { + title = tagtitle + msg = tagmsg + } + } + return [title, msg, releasetype] + } + + (mod_changelog_title, mod_changelog, mod_releasetype) = ({ + def (changelog_title, changelog, releasetype) = parseChangelog(({ + if (!StringUtils.isEmpty(mod_buildtag)) { + def git_ref = mod_git_repo.getRef "refs/tags/${mod_buildtag}" + + if (git_ref != null) { + def git_revwalk = new org.eclipse.jgit.revwalk.RevWalk(mod_git_repo) + try { + return git_revwalk.parseTag(git_ref.getObjectId()).getFullMessage() + } catch (org.eclipse.jgit.errors.IncorrectObjectTypeException e) { + } finally { + git_revwalk.dispose() + } + } + } + return null + })()) + + def (r_changelog_title, r_changelog) = ({ + def r_change = [changelog_title, changelog] + *.replace('{version}', mod_version) + if (mod_buildnumber == null) + return r_change + else if (mod_buildnumber != null) + return r_change + *.replace('{version_number}', mod_buildnumber) + })() + + if (mod_buildnumber != null) { + if (changelog_title != null && changelog != null) + return [r_changelog_title, r_changelog, releasetype] + return ["v${mod_version}", "v${mod_version_min} Build${mod_buildnumber}", 'alpha'] + } else { + if (changelog_title != null && changelog != null) + return [r_changelog_title, r_changelog, releasetype] + return ["v${mod_version}", "v${mod_version}", 'alpha'] + } + })() + + mod_deploy_target = file 'deploy.txt' + + sec_curseforge_key = System.getenv('CURSEFORGE_TOKEN') ?: project.isProperty('api_key_curseforge') ? project.api_key_curseforge : null + sec_github_key = System.getenv('GITHUB_TOKEN') ?: project.isProperty('api_key_github') ? project.api_key_github : null + sec_bintray_user = System.getenv('BINTRAY_USER') ?: project.isProperty('api_user_bintray') ? project.api_user_bintray : null + sec_bintray_key = System.getenv('BINTRAY_KEY') ?: project.isProperty('api_key_bintray') ? project.api_key_github : null + sec_keystore_location = System.getenv('KEYSTORE_LOCATION') ?: project.isProperty('keystore_location') ? project.keystore_location : null + sec_keystore_alias = System.getenv('KEYSTORE_ALIAS') ?: project.isProperty('keystore_alias') ? project.keystore_alias : null + sec_keystore_password = System.getenv('KEYSTORE_PASSWORD') ?: project.isProperty('keystore_password') ? project.keystore_password : null + + commonManifest = { + if (project.isProperty('extra_fmlcore')) + attributes 'FMLCorePlugin': project.extra_fmlcore + if (project.isProperty('extra_fmlmod')) + attributes 'FMLCorePluginContainsFMLMod': project.extra_fmlcore + if (project.isProperty('extra_fmlat')) + attributes 'FMLAT': project.extra_fmlat + } +} tasks.withType(Jar) { compileJava.options.encoding = 'UTF-8' compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } +task setupSourceSets { + doLast { + sourceSets*.java.srcDirs*.each { it.mkdirs() } + sourceSets*.kotlin.srcDirs*.each { it.mkdirs() } + sourceSets*.resources.srcDirs*.each { it.mkdirs() } + } + [tasks.eclipseClasspath, tasks.ideaModule]*.dependsOn 'setupSourceSets' +} + sourceCompatibility = targetCompatibility = "1.8" // Need this here so eclipse task generates correctly. compileJava { sourceCompatibility = targetCompatibility = "1.8" } -version = "1.0.0" -group= "C6H2Cl2.mod.SuperCompressedCobblestoneMod" // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = "SCCSM-1.10.2" +version = "${version_minecraft}-${mod_version}" minecraft { - version = "1.10.2-12.18.3.2185" - runDir = "run" - mappings = "snapshot_20161111" + version = "${project.version_minecraft}-${project.version_forge}" + + if (project.isProperty('version_mappings')) + mappings = project.version_mappings + + if (!project.isProperty('run_location')) + runDir = 'run' + else + runDir = run_location.replace('{modid}', project.modid).replace('{mcversion}', project.version_minecraft) + + replaceIn 'Reference.java' + replaceIn 'Reference.kt' + replace '{modid}', project.modid + replace '{modname}', project.modname + replace '{version}', mod_version + replace '{mcversion}', project.version_minecraft + replace '{forgeversion}', project.version_forge +} + +import net.minecraftforge.gradle.user.TaskSourceCopy + +// Mad hacks to make source replacements work for Kotlin +for (set in sourceSets) { + def taskName = "source${set.name.capitalize()}Kotlin" + def dir = new File(project.getBuildDir(), "sources/${set.name}/kotlin") + task(taskName, type: TaskSourceCopy) { + source = set.getKotlin() + output = dir + } + def compileTask = tasks[set.getCompileTaskName("kotlin")] + compileTask.source = dir + compileTask.dependsOn taskName + def dirPath = dir.toPath() + compileKotlin.include { + return it.file.toPath().startsWith(dirPath) + } } repositories { + mavenCentral() + jcenter() maven { name = "CurseForge" url = "https://minecraft.curseforge.com/api/maven/" @@ -59,39 +225,246 @@ repositories { name = "ModMaven" url = "modmaven.k-4u.nl" } + maven { + url = "http://maven.shadowfacts.net/" + } } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" compile 'yukarilib:YukariLib-1.10.2:release:dev' - compile "mezz.jei:jei_${mc_version}:${jei_version}:api" - runtime "mezz.jei:jei_${mc_version}:${jei_version}" - compile group: "net.shadowfacts", name: "Forgelin", version: "LATEST_VERSION" + compile "mezz.jei:jei_${version_minecraft}:${jei_version}:api" + runtime "mezz.jei:jei_${version_minecraft}:${jei_version}" + compile "net.shadowfacts:Forgelin:1.5.1" } processResources -{ - // this will ensure that this task is redone when the versions change. - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version + { + // 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' + + // replace version and mcversion + expand([ + 'modid' : project.modid, + 'modname' : project.modname, + 'version' : mod_version, + 'mcversion' : project.version_minecraft, + 'forgeversion' : project.version_forge, + 'minforgeversion': project.isProperty('version_minforge') ? project.version_minforge : project.version_forge, + ]) + } + + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } + } + +// An Error occured while switching above 1.8 -> under 1.7 +task cleanMakeStart(type: Delete) { + // makeStart.dependsOn 'cleanMakeStart' + delete file(new File(tasks.makeStart.getTemporaryDir(), 'extracted')) +} + +jar { + from sourceSets.main.output + from sourceSets.api.output + manifest commonManifest +} - // replace stuff in mcmod.info, nothing else - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' +sourceJar { + from sourceSets.main.allSource + from sourceSets.api.allSource + classifier 'sources' + manifest commonManifest +} - // replace version and mcversion - expand 'version':project.version, 'mcversion':project.minecraft.version +task devJar(dependsOn: 'classes', type: Jar) { + from sourceSets.main.output + from sourceSets.api.output + classifier 'dev' + manifest commonManifest +} + +task apiJar(dependsOn: 'classes', type: Jar) { + from sourceSets.api.output + classifier 'api' + manifest commonManifest +} + +[jar, devJar, sourceJar, apiJar]*.destinationDir = mod_artifacts_dir + +artifacts { + archives jar + archives devJar + archives sourceJar + archives apiJar +} + +task signJars(dependsOn: 'build') { + gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask(tasks.signJars)) + assert sec_keystore_location != null, 'missing sec_keystore_location' } - // copy everything else, thats not the mcmod.info - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' + def keystore_location = sec_keystore_location ?: '' + def keystore_alias = sec_keystore_alias ?: '' + def keystore_password = sec_keystore_password ?: '' + + inputs.dir jar.destinationDir + inputs.file keystore_location + inputs.property 'keystore_alias', keystore_alias + inputs.property 'keystore_password', keystore_password + outputs.dir jar.destinationDir + + doLast { + [jar, devJar, sourceJar, apiJar].each { eachtask -> + eachtask.outputs.files.each { file -> + if (!file.path.endsWith('.jar')) + return + + logger.lifecycle "signing ${file}" + ant.signjar( + destDir: file.parentFile, + jar: file, + keystore: keystore_location, + alias: keystore_alias, + storepass: keystore_password + ) + } + } } } -repositories { - mavenCentral() - jcenter() - maven { - url "http://maven.shadowfacts.net/" + +task deploy(dependsOn: 'build', type: Copy) { + mustRunAfter 'signJars' + + if (mod_deploy_target.exists()) + mod_deploy_target.eachLine { target -> + def dest = target.endsWith('.jar') ? target.parentFile : target + + from(project.tasks.jar.outputs.files.singleFile) + into(dest) + + rename { String oldname -> + target.endsWith('.jar') ? target.name : oldname + } + + eachFile { file -> + def path = file.relativePath.getFile(dest) + logger.lifecycle "copying to ${path}" + } + } +} + +gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask(tasks.curseforge)) { + assert sec_curseforge_key != null, 'missing sec_curseforge_key' + assert project.isProperty('extra_curseforge_id'), 'missing extra_curseforge_id' } } +if (sec_curseforge_key != null && project.isProperty('extra_curseforge_id')) { + curseforge { + tasks.curseforge.enabled = !mod_autorelease + + tasks.curseforge.dependsOn 'reobfShadowJar' + tasks.curseforge.mustRunAfter 'signJars' + apiKey = sec_curseforge_key + project { + id = project.extra_curseforge_id + + changelogType = 'markdown' + changelog = mod_changelog + + releaseType = mod_releasetype + + mainArtifact(jar) { + displayName = "${jar.baseName}-${jar.version}" + } + [devJar, sourceJar, apiJar].each { jar -> + addArtifact(jar) { + displayName = "${jar.baseName}-${jar.version}-${jar.classifier}" + } + } + + relations { + } + } + } +} else + tasks.curseforge.enabled = false + +task releaseArtifacts(dependsOn: 'build', type: Sync) { + from mod_artifacts_dir + into mod_artifacts_release_dir +} + +gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask(tasks.githubRelease)) { + assert sec_github_key != null, 'missing sec_github_key' + assert project.isProperty('extra_github_owner'), 'missing extra_github_owner' + assert project.isProperty('extra_github_repo'), 'missing extra_github_repo' + } +} +if (sec_github_key != null && project.isProperty('extra_github_owner') && project.isProperty('extra_github_repo')) { + github { + tasks.githubRelease.dependsOn 'build' + prerelease = mod_prerelease + owner = project.extra_github_owner + repo = project.extra_github_repo + token = sec_github_key + tagName = mod_travis ? (mod_autorelease ? "${mod_build_prefix}${mod_buildnumber}" : mod_buildtag) : mod_version + targetCommitish = mod_git_head + name = mod_changelog_title + body = mod_changelog + draft = false + assets = [jar, devJar, sourceJar, apiJar]*.outputs*.files*.asPath*.tr('\\', '/') + } +} + +publishing { + publications { + ModPublication(MavenPublication) { + groupId = project.group + artifactId = project.modid + version = "${mod_version}" + artifact jar + artifact jar + artifact devJar + artifact sourceJar + artifact apiJar + } + } +} + +gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask(tasks.bintrayUpload)) { + assert sec_bintray_user != null, 'missing sec_bintray_user' + assert sec_bintray_key != null, 'missing sec_bintray_key' + assert project.isProperty('extra_bintray_repo'), 'missing extra_bintray_repo' + assert project.isProperty('extra_bintray_name'), 'missing extra_bintray_name' + } +} +if (sec_bintray_user != null && sec_bintray_key != null && project.isProperty('extra_bintray_repo') && project.isProperty('extra_bintray_name')) { + bintray { + tasks.bintrayUpload.enabled = !mod_autorelease + user = sec_bintray_user + key = sec_bintray_key + publications = ['ModPublication'] + publish = true + pkg { + repo = project.extra_bintray_repo + name = project.extra_bintray_name + version { + name = "${mod_version}" + released = new Date() + } + } + } +} else + tasks.bintrayUpload.enabled = false \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..60623d4 --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash +cd `dirname $0` +bash gradlew build +echo 'Press any key to continue . . .' +read Wait \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 7cab1f2..99d57e0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,39 @@ +# ForgeGradle +forgegradle=net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT +forgegradle_plugin=net.minecraftforge.gradle.forge + +# MinecraftForge +version_minecraft=1.10.2 +version_forge=12.18.3.2477 +version_minforge=12.18.3.2185 +version_mappings=snapshot_20161111 + +# Dependency +kotlin_version=1.1.4-2 +jei_version=3.14.7.420 + +# Mod Information +group=kotlinmoddingnetwork +modid=sccsm +modname=SuperCompressedCobblestoneMod + +# Version +version_major=1 +version_minor=0 +version_patch=0 + +# CoreMods +extra_fmlcore= +extra_fmlmod= +extra_fmlat= + +# CurseForge, Bintray, Github +extra_curseforge_id= +extra_bintray_repo= +extra_bintray_name= +extra_github_owner=KotlinModdingNetwork +extra_github_repo=SuperCompressedCobblestoneMod + # 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=-Xmx4G diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7c368f72d99d9b22f784deaa1713ab89792dce83 GIT binary patch literal 54712 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

49F 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6944bf1..ac3912e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Sep 24 18:46:55 JST 2016 +#Tue Sep 12 02:55:59 JST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0.1-all.zip diff --git a/gradlew b/gradlew index c5543e9..cccdd3d 100644 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,20 +6,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# 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"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# 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\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +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 @@ -111,10 +110,10 @@ if $darwin; then 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` @@ -134,11 +133,11 @@ if $cygwin ; then 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 + 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 @@ -155,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# 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" + +# 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")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282..f955316 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/install.bat b/install.bat new file mode 100644 index 0000000..f1e1015 --- /dev/null +++ b/install.bat @@ -0,0 +1,3 @@ +cd /d %~dp0 +call gradlew setupDevWorkspace setupDecompWorkspace eclipse +pause \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..9a9e864 --- /dev/null +++ b/install.sh @@ -0,0 +1,5 @@ +#!/bin/bash +cd `dirname $0` +bash gradlew setupDevWorkspace setupDecompWorkspace eclipse +echo 'Press any key to continue . . .' +read Wait \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..9efe1f1 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'SCCSM' \ No newline at end of file diff --git a/src/main/kotlin/c6h2cl2/sccsm/Reference.kt b/src/main/kotlin/c6h2cl2/sccsm/Reference.kt new file mode 100644 index 0000000..fda1f81 --- /dev/null +++ b/src/main/kotlin/c6h2cl2/sccsm/Reference.kt @@ -0,0 +1,18 @@ +package c6h2cl2.sccsm + +/** + * @author C6H2Cl2 + * @author Kamesuta + */ +// ※Gradleから変数の書き換えを行うため、グローバル定数はご利用いただけません。 +object Reference { + const val MODID = "sccsm" + const val NAME = "SuperCompressedCobblestoneMod" + const val VERSION = "{version}" + const val FORGE = "{forgeversion}" + const val MINECRAFT = "{mcversion}" + const val DEPENDENCIES = "required-after:forgelin" + const val PROXY_SERVER = "c6h2cl2.sccsm.CommonProxy" + const val PROXY_CLIENT = "c6h2cl2.sccsm.ClientProxy" + const val GUI_FACTORY = "c6h2cl2.sccsm.gui.config.ConfigGuiFactory" +} \ No newline at end of file diff --git a/src/main/kotlin/c6h2cl2/sccsm/SCCSMConst.kt b/src/main/kotlin/c6h2cl2/sccsm/SCCSMConst.kt deleted file mode 100644 index 8e435d3..0000000 --- a/src/main/kotlin/c6h2cl2/sccsm/SCCSMConst.kt +++ /dev/null @@ -1,10 +0,0 @@ -package c6h2cl2.sccsm - -/** - * @author C6H2Cl2 - */ - -const val MOD_ID = "sccsm" -const val MOD_NAME = "Super-Compressed Cobblestone Mod" -const val VERSION = "1.0.0" -const val DEPENDENT = "required-after:forgelin;after:ExtraUtilities" \ No newline at end of file diff --git a/src/main/kotlin/c6h2cl2/sccsm/SCCSMCore.kt b/src/main/kotlin/c6h2cl2/sccsm/SCCSMCore.kt index 50ddec9..e9152c8 100644 --- a/src/main/kotlin/c6h2cl2/sccsm/SCCSMCore.kt +++ b/src/main/kotlin/c6h2cl2/sccsm/SCCSMCore.kt @@ -13,7 +13,7 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent * @author C6H2Cl2 */ -@Mod(modid = MOD_ID, name = MOD_NAME, version = VERSION, useMetadata = true, dependencies = DEPENDENT) +@Mod(modid = Reference.MODID, name = Reference.NAME, version = Reference.VERSION, dependencies = Reference.DEPENDENCIES, useMetadata = true) class SCCSMCore { companion object { @@ -44,10 +44,7 @@ class SCCSMCore { private fun loadMeta() { meta.autogenerated = false - meta.modId = MOD_ID - meta.name = MOD_NAME - meta.version = VERSION meta.authorList.add("C6H2Cl2") - meta.description = "You can compress cobblestone up to 500 Billion" + meta.authorList.add("Kamesuta") } } \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..de27998 --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,26 @@ +{ + "modListVersion": 2, + "modList": [ + { + "modid": "sccsm", + "name": "SuperCompressedCobblestoneMod", + "description": "You can compress cobblestone up to 500 Billion", + "mcversion": "${mcversion}", + "version": "${version}", + "authorList": [ + "C6H2Cl2", + "Kamesuta" + ], + "credits": "2017 KotlinModdingNetwork", + "dependants": [], + "dependencies": ["Forge@[${minforgeversion},)", "forgelin", "ExtraUtilities"], + "parent": "", + "requiredMods": ["Forge@[${minforgeversion},)", "forgelin"], + "logoFile": "", + "screenshots": [], + "updateUrl": "https://github.com/KotlinModdingNetwork/SuperCompressedCobblestoneMod/releases", + "url": "https://github.com/KotlinModdingNetwork/SuperCompressedCobblestoneMod/", + "useDependencyInformation": true + } + ] +} \ No newline at end of file