Skip to content

Commit

Permalink
Merge pull request #1 from StringCare/develop
Browse files Browse the repository at this point in the history
v3.1
  • Loading branch information
efraespada committed Jun 19, 2019
2 parents 42e6758 + 976ce56 commit d507040
Show file tree
Hide file tree
Showing 10 changed files with 325 additions and 57 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group 'com.stringcare'
version '3.0'
version '3.1'

def siteUrl = 'https://github.com/StringCare/KotlinGradlePlugin'
def gitUrl = 'https://github.com/StringCare/KotlinGradlePlugin.git'
Expand Down
37 changes: 30 additions & 7 deletions src/main/kotlin/StringCare.kt
Original file line number Diff line number Diff line change
@@ -1,32 +1,43 @@
import components.*
import org.gradle.api.DefaultTask
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.internal.plugins.DslObject
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import java.io.File

open class StringCare : Plugin<Project> {

companion object {
@JvmStatic
private lateinit var absoluteProjectPath: String
internal lateinit var absoluteProjectPath: String

internal var internalTempDir: String? = null
private var internalTempDir: String? = null
@JvmStatic
var tempFolder: String
get() = internalTempDir?: tempPath()
get() = internalTempDir ?: tempPath()
set(value) {
internalTempDir = value
}

fun resetFolder() {
internalTempDir = null
}

@JvmStatic
internal val moduleMap: MutableMap<String, Configuration> = mutableMapOf()

@JvmStatic
internal var mainModule: String = defaultMainModule

@JvmStatic
internal var debug: Boolean = defaultDebug
}

private lateinit var project: Project
private lateinit var extension: Extension
private val moduleMap: MutableMap<String, Configuration> = mutableMapOf()


override fun apply(target: Project) {
this@StringCare.project = target
Expand All @@ -41,28 +52,36 @@ open class StringCare : Plugin<Project> {
moduleMap[module.name!!] = Configuration(module.name).apply {
stringFiles.addAll(module.stringFiles)
srcFolders.addAll(module.srcFolders)
debug = extension.debug
}
}
module.srcFolders.isNotEmpty() -> {
moduleMap[module.name!!] = Configuration(module.name).apply {
stringFiles.addAll(defaultConfig().stringFiles)
srcFolders.addAll(module.srcFolders)
debug = extension.debug
}
}
module.stringFiles.isNotEmpty() -> {
moduleMap[module.name!!] = Configuration(module.name).apply {
stringFiles.addAll(module.stringFiles)
srcFolders.addAll(defaultConfig().srcFolders)
debug = extension.debug
}
}
}
}
if (moduleMap.isEmpty()) {
moduleMap[defaultMainModule] = defaultConfig().normalize()
}
this.project.registerTask()
}
this.project.gradle.addBuildListener(ExecutionListener(
debug = extension.debug,
dataFound = { _, _ ->
// nothing to do here
}, mergeResourcesStart = { module, variant ->
},
mergeResourcesStart = { module, variant ->
fingerPrint(module, variant, extension.debug) { key ->
if ("none" == key) {
return@fingerPrint
Expand Down Expand Up @@ -98,11 +117,13 @@ open class StringCare : Plugin<Project> {
}
}

}, mergeResourcesFinish = { module, _ ->
},
mergeResourcesFinish = { module, _ ->
restoreFiles(absoluteProjectPath, module)
}
))
}

open class Extension {
var debug: Boolean = false
var main_module: String = "app"
Expand All @@ -117,7 +138,9 @@ open class StringCare : Plugin<Project> {
open class Configuration(var name: String?) {
var stringFiles = mutableListOf<String>()
var srcFolders = mutableListOf<String>()
var debug = false
}

}


92 changes: 88 additions & 4 deletions src/main/kotlin/components/Extensions.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package components

import StringCare
import StringCare.Configuration
import StringCare.Extension
import groovy.json.StringEscapeUtils
Expand All @@ -11,6 +12,8 @@ import org.slf4j.LoggerFactory
import org.w3c.dom.Document
import org.w3c.dom.Node
import org.xml.sax.InputSource
import task.SCPreview
import task.SCTestObfuscation
import java.io.*
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.TransformerFactory
Expand All @@ -33,6 +36,28 @@ fun String.normalize(): String {
return com.joinToString(" ")
}

fun String.normalizePath(): String {
val unixPath = this.replace("\\", "/")
.replace("\\\\", "/")
.replace("//", "/")
return when (getOs()) {
Os.OSX -> unixPath
Os.WINDOWS -> unixPath.replace("/", "\\")
}
}

fun String.uncapitalize(): String {
val original = this.trim()
if (original.isEmpty()) {
return ""
}
val char = original[0].toLowerCase()
return when {
original.length == 1 -> char.toString()
else -> char + original.substring(1, original.length)
}
}

fun String.escape(): String = Regex.escape(this)
fun String.unescape(): String = StringEscapeUtils.unescapeJava(this)
fun String.removeNewLines(): String = this.replace("\n", "")
Expand All @@ -49,7 +74,7 @@ fun String.androidTreatment(): String {

fun File.validForConfiguration(configuration: Configuration): Boolean {
var valid = this.absolutePath.contains("${File.separator}${configuration.name}${File.separator}")

&& excluded().not()
if (valid) {
valid = false
configuration.srcFolders.forEach { folder ->
Expand Down Expand Up @@ -78,9 +103,28 @@ fun File.validForConfiguration(configuration: Configuration): Boolean {
}
}
}
if (configuration.debug && excluded().not()) {
println("${if (valid) "" else "❌ not"} valid file ${this.absolutePath}")
}
return valid
}

fun File.excluded(): Boolean {
val exclude = listOf(
"/build/",
"/.git/",
"/.gradle/",
"/gradle/"
)
var valid = true
exclude.forEach { value ->
when {
this.absolutePath.contains(value.normalizePath()) -> valid = false
}
}
return (valid && this.isDirectory.not() && this.absolutePath.contains(".xml")).not()
}

fun File.resourceFile(configuration: Configuration): ResourceFile? {
var sourceFolder = ""
var validFile: File? = null
Expand Down Expand Up @@ -123,9 +167,32 @@ fun Project.absolutePath(): String = this.file(wrapperWindows).absolutePath.repl
fun Project.createExtension(): Extension {
val extension = this.extensions.create(extensionName, Extension::class.java)
extension.modules = this.container<Configuration>(Configuration::class.java)
StringCare.mainModule = extension.main_module
StringCare.debug = extension.debug
return extension
}

fun Project.registerTask() {
this.tasks.addRule("Pattern: $gradleTaskNameObfuscate<variant>") { taskName ->
if (taskName.startsWith(gradleTaskNameObfuscate)) {
println("taskname $taskName")
task(taskName) {
it.doLast {
val variant = taskName.replace(gradleTaskNameObfuscate, "").uncapitalize()
println("variant $variant")
val task = this.tasks.getByName(gradleTaskNameObfuscate) as SCTestObfuscation
task.variant = variant
task.module = StringCare.mainModule
task.debug = StringCare.debug
task.greet()
}
}
}
}
this.tasks.register(gradleTaskNameDoctor, SCPreview::class.java)
this.tasks.register(gradleTaskNameObfuscate, SCTestObfuscation::class.java)
}

fun Process.outputString(): String {
val input = this.inputStream.bufferedReader().use { it.readText() }
val error = this.errorStream.bufferedReader().use { it.readText() }
Expand All @@ -135,13 +202,16 @@ fun Process.outputString(): String {
fun defaultConfig(): Configuration {
return Configuration("app").apply {
stringFiles.add("strings.xml")
srcFolders.add("src${File.separator}main")
srcFolders.add("src/main")
}
}

fun ResourceFile.backup(): File {
val cleanPath = "${StringCare.tempFolder}${File.separator}${this.module}${File.separator}${this.sourceFolder}${this.file.absolutePath.split(this.sourceFolder)[1]}"
.replace("${File.separator}${File.separator}", File.separator)
val cleanPath =
"${StringCare.tempFolder}${File.separator}${this.module}${File.separator}${this.sourceFolder}${this.file.absolutePath.split(
this.sourceFolder
)[1]}"
.replace("${File.separator}${File.separator}", File.separator)

val backupFile = File(cleanPath)
this.file.copyTo(backupFile, true)
Expand Down Expand Up @@ -294,3 +364,17 @@ fun Node.getType(): StringType {
else -> StringType.TEXT
}
}

fun Configuration.normalize(): Configuration {
val stringFiles = mutableListOf<String>()
val sourceFolders = mutableListOf<String>()
this.stringFiles.forEach { file ->
stringFiles.add(file.normalizePath())
}
this.srcFolders.forEach { folder ->
sourceFolders.add(folder.normalizePath())
}
this.stringFiles = stringFiles
this.srcFolders = sourceFolders
return this
}
25 changes: 17 additions & 8 deletions src/main/kotlin/components/Tasks.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ internal fun pluginBuildTask(): String = "${when (getOs()) {

internal val librarySetupTask = """
${copyCommand()} src${File.separator}main${File.separator}kotlin${File.separator}components${File.separator}jni${File.separator}$osxLib out${File.separator}production${File.separator}classes${File.separator}$osxLib &&
${copyCommand()} src${File.separator}main${File.separator}kotlin${File.separator}components${File.separator}jni${File.separator}$winLib out${File.separator}production${File.separator}classes${File.separator}$winLib
${copyCommand()} src${File.separator}main${File.separator}kotlin${File.separator}components${File.separator}jni${File.separator}$winLib out${File.separator}production${File.separator}classes${File.separator}$winLib &&
${copyCommand()} src${File.separator}main${File.separator}kotlin${File.separator}components${File.separator}jni${File.separator}$osxLib build${File.separator}classes${File.separator}kotlin${File.separator}main${File.separator}$osxLib &&
${copyCommand()} src${File.separator}main${File.separator}kotlin${File.separator}components${File.separator}jni${File.separator}$winLib build${File.separator}classes${File.separator}kotlin${File.separator}main${File.separator}$winLib
""".trimIndent()

internal fun prepareTask(directory: String): String {
Expand All @@ -37,6 +39,20 @@ internal fun buildTask(directory: String): String {
""".trimIndent()
}

internal fun basicGradleTask(directory: String): String {
return """
cd $directory &&
${gradleWrapper()} $gradleTaskNameDoctor
""".trimIndent()
}

internal fun obfuscationTestGradleTask(directory: String): String {
return """
cd $directory &&
${gradleWrapper()} ${gradleTaskNameObfuscate}Debug
""".trimIndent()
}

// gradlew task needs export ANDROID_SDK_ROOT=/Users/efrainespada/Library/Android/sdk
// echo "sdk.dir=${System.getenv("ANDROID_SDK_ROOT")}" > local.properties &&
internal fun signingReportTask(directory: String): String {
Expand All @@ -46,13 +62,6 @@ internal fun signingReportTask(directory: String): String {
""".trimIndent()
}

internal fun resetCommand(directory: String): String {
return when(getOs()) {
Os.OSX -> "rm -rf $directory && "
Os.WINDOWS -> "rmdir /q/s $directory & "
}
}

internal fun copyCommand(): String = when (getOs()) {
Os.WINDOWS -> copyCommandWindows
Os.OSX -> copyCommandOsX
Expand Down
5 changes: 5 additions & 0 deletions src/main/kotlin/components/Vars.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@ package components

import java.io.File

internal const val version = "3.1"
internal const val testProjectName = "KotlinSample"
internal const val defaultDebug = false
internal const val defaultMainModule = "app"
internal const val defaultVariant = "debug"
internal val mainModuleTest = "$testProjectName${File.separator}$defaultMainModule"
internal const val gradleTaskNameDoctor = "stringcarePreview"
internal const val gradleTaskNameObfuscate = "stringcareTestObfuscate"
internal const val extensionName = "stringcare"
internal const val winLib = "libsignKey.dll"
internal const val osxLib = "libsignKey.dylib"
Expand Down
19 changes: 12 additions & 7 deletions src/main/kotlin/components/XParser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@ import models.SAttribute
import models.StringEntity
import java.io.File

fun locateFiles(projectPath: String, configuration: Configuration): List<ResourceFile> = File(projectPath).walkTopDown()
.filterIndexed { _, file ->
file.validForConfiguration(configuration)
}.map {
it.resourceFile(configuration)!!
}.toList()
fun locateFiles(projectPath: String, configuration: Configuration): List<ResourceFile> {
if (configuration.debug) {
println("== FILES FOUND ======================================")
}
return File(projectPath).walkTopDown()
.filterIndexed { _, file ->
file.validForConfiguration(configuration.normalize())
}.map {
it.resourceFile(configuration.normalize())!!
}.toList()
}

fun backupFiles(projectPath: String, configuration: Configuration): List<ResourceFile> {
val files = locateFiles(projectPath, configuration)
val files = locateFiles(projectPath, configuration.normalize())
files.forEach { resource ->
resource.backup()
}
Expand Down
Loading

0 comments on commit d507040

Please sign in to comment.