Skip to content

Commit d507040

Browse files
authored
Merge pull request #1 from StringCare/develop
v3.1
2 parents 42e6758 + 976ce56 commit d507040

File tree

10 files changed

+325
-57
lines changed

10 files changed

+325
-57
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
}
77

88
group 'com.stringcare'
9-
version '3.0'
9+
version '3.1'
1010

1111
def siteUrl = 'https://github.com/StringCare/KotlinGradlePlugin'
1212
def gitUrl = 'https://github.com/StringCare/KotlinGradlePlugin.git'

src/main/kotlin/StringCare.kt

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,43 @@
11
import components.*
2+
import org.gradle.api.DefaultTask
23
import org.gradle.api.NamedDomainObjectContainer
34
import org.gradle.api.Plugin
45
import org.gradle.api.Project
56
import org.gradle.api.internal.plugins.DslObject
7+
import org.gradle.api.tasks.Input
8+
import org.gradle.api.tasks.TaskAction
9+
import java.io.File
610

711
open class StringCare : Plugin<Project> {
812

913
companion object {
1014
@JvmStatic
11-
private lateinit var absoluteProjectPath: String
15+
internal lateinit var absoluteProjectPath: String
1216

13-
internal var internalTempDir: String? = null
17+
private var internalTempDir: String? = null
1418
@JvmStatic
1519
var tempFolder: String
16-
get() = internalTempDir?: tempPath()
20+
get() = internalTempDir ?: tempPath()
1721
set(value) {
1822
internalTempDir = value
1923
}
2024

2125
fun resetFolder() {
2226
internalTempDir = null
2327
}
28+
29+
@JvmStatic
30+
internal val moduleMap: MutableMap<String, Configuration> = mutableMapOf()
31+
32+
@JvmStatic
33+
internal var mainModule: String = defaultMainModule
34+
35+
@JvmStatic
36+
internal var debug: Boolean = defaultDebug
2437
}
2538

2639
private lateinit var project: Project
2740
private lateinit var extension: Extension
28-
private val moduleMap: MutableMap<String, Configuration> = mutableMapOf()
29-
3041

3142
override fun apply(target: Project) {
3243
this@StringCare.project = target
@@ -41,28 +52,36 @@ open class StringCare : Plugin<Project> {
4152
moduleMap[module.name!!] = Configuration(module.name).apply {
4253
stringFiles.addAll(module.stringFiles)
4354
srcFolders.addAll(module.srcFolders)
55+
debug = extension.debug
4456
}
4557
}
4658
module.srcFolders.isNotEmpty() -> {
4759
moduleMap[module.name!!] = Configuration(module.name).apply {
4860
stringFiles.addAll(defaultConfig().stringFiles)
4961
srcFolders.addAll(module.srcFolders)
62+
debug = extension.debug
5063
}
5164
}
5265
module.stringFiles.isNotEmpty() -> {
5366
moduleMap[module.name!!] = Configuration(module.name).apply {
5467
stringFiles.addAll(module.stringFiles)
5568
srcFolders.addAll(defaultConfig().srcFolders)
69+
debug = extension.debug
5670
}
5771
}
5872
}
5973
}
74+
if (moduleMap.isEmpty()) {
75+
moduleMap[defaultMainModule] = defaultConfig().normalize()
76+
}
77+
this.project.registerTask()
6078
}
6179
this.project.gradle.addBuildListener(ExecutionListener(
6280
debug = extension.debug,
6381
dataFound = { _, _ ->
6482
// nothing to do here
65-
}, mergeResourcesStart = { module, variant ->
83+
},
84+
mergeResourcesStart = { module, variant ->
6685
fingerPrint(module, variant, extension.debug) { key ->
6786
if ("none" == key) {
6887
return@fingerPrint
@@ -98,11 +117,13 @@ open class StringCare : Plugin<Project> {
98117
}
99118
}
100119

101-
}, mergeResourcesFinish = { module, _ ->
120+
},
121+
mergeResourcesFinish = { module, _ ->
102122
restoreFiles(absoluteProjectPath, module)
103123
}
104124
))
105125
}
126+
106127
open class Extension {
107128
var debug: Boolean = false
108129
var main_module: String = "app"
@@ -117,7 +138,9 @@ open class StringCare : Plugin<Project> {
117138
open class Configuration(var name: String?) {
118139
var stringFiles = mutableListOf<String>()
119140
var srcFolders = mutableListOf<String>()
141+
var debug = false
120142
}
143+
121144
}
122145

123146

src/main/kotlin/components/Extensions.kt

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package components
22

3+
import StringCare
34
import StringCare.Configuration
45
import StringCare.Extension
56
import groovy.json.StringEscapeUtils
@@ -11,6 +12,8 @@ import org.slf4j.LoggerFactory
1112
import org.w3c.dom.Document
1213
import org.w3c.dom.Node
1314
import org.xml.sax.InputSource
15+
import task.SCPreview
16+
import task.SCTestObfuscation
1417
import java.io.*
1518
import javax.xml.parsers.DocumentBuilderFactory
1619
import javax.xml.transform.TransformerFactory
@@ -33,6 +36,28 @@ fun String.normalize(): String {
3336
return com.joinToString(" ")
3437
}
3538

39+
fun String.normalizePath(): String {
40+
val unixPath = this.replace("\\", "/")
41+
.replace("\\\\", "/")
42+
.replace("//", "/")
43+
return when (getOs()) {
44+
Os.OSX -> unixPath
45+
Os.WINDOWS -> unixPath.replace("/", "\\")
46+
}
47+
}
48+
49+
fun String.uncapitalize(): String {
50+
val original = this.trim()
51+
if (original.isEmpty()) {
52+
return ""
53+
}
54+
val char = original[0].toLowerCase()
55+
return when {
56+
original.length == 1 -> char.toString()
57+
else -> char + original.substring(1, original.length)
58+
}
59+
}
60+
3661
fun String.escape(): String = Regex.escape(this)
3762
fun String.unescape(): String = StringEscapeUtils.unescapeJava(this)
3863
fun String.removeNewLines(): String = this.replace("\n", "")
@@ -49,7 +74,7 @@ fun String.androidTreatment(): String {
4974

5075
fun File.validForConfiguration(configuration: Configuration): Boolean {
5176
var valid = this.absolutePath.contains("${File.separator}${configuration.name}${File.separator}")
52-
77+
&& excluded().not()
5378
if (valid) {
5479
valid = false
5580
configuration.srcFolders.forEach { folder ->
@@ -78,9 +103,28 @@ fun File.validForConfiguration(configuration: Configuration): Boolean {
78103
}
79104
}
80105
}
106+
if (configuration.debug && excluded().not()) {
107+
println("${if (valid) "" else "❌ not"} valid file ${this.absolutePath}")
108+
}
81109
return valid
82110
}
83111

112+
fun File.excluded(): Boolean {
113+
val exclude = listOf(
114+
"/build/",
115+
"/.git/",
116+
"/.gradle/",
117+
"/gradle/"
118+
)
119+
var valid = true
120+
exclude.forEach { value ->
121+
when {
122+
this.absolutePath.contains(value.normalizePath()) -> valid = false
123+
}
124+
}
125+
return (valid && this.isDirectory.not() && this.absolutePath.contains(".xml")).not()
126+
}
127+
84128
fun File.resourceFile(configuration: Configuration): ResourceFile? {
85129
var sourceFolder = ""
86130
var validFile: File? = null
@@ -123,9 +167,32 @@ fun Project.absolutePath(): String = this.file(wrapperWindows).absolutePath.repl
123167
fun Project.createExtension(): Extension {
124168
val extension = this.extensions.create(extensionName, Extension::class.java)
125169
extension.modules = this.container<Configuration>(Configuration::class.java)
170+
StringCare.mainModule = extension.main_module
171+
StringCare.debug = extension.debug
126172
return extension
127173
}
128174

175+
fun Project.registerTask() {
176+
this.tasks.addRule("Pattern: $gradleTaskNameObfuscate<variant>") { taskName ->
177+
if (taskName.startsWith(gradleTaskNameObfuscate)) {
178+
println("taskname $taskName")
179+
task(taskName) {
180+
it.doLast {
181+
val variant = taskName.replace(gradleTaskNameObfuscate, "").uncapitalize()
182+
println("variant $variant")
183+
val task = this.tasks.getByName(gradleTaskNameObfuscate) as SCTestObfuscation
184+
task.variant = variant
185+
task.module = StringCare.mainModule
186+
task.debug = StringCare.debug
187+
task.greet()
188+
}
189+
}
190+
}
191+
}
192+
this.tasks.register(gradleTaskNameDoctor, SCPreview::class.java)
193+
this.tasks.register(gradleTaskNameObfuscate, SCTestObfuscation::class.java)
194+
}
195+
129196
fun Process.outputString(): String {
130197
val input = this.inputStream.bufferedReader().use { it.readText() }
131198
val error = this.errorStream.bufferedReader().use { it.readText() }
@@ -135,13 +202,16 @@ fun Process.outputString(): String {
135202
fun defaultConfig(): Configuration {
136203
return Configuration("app").apply {
137204
stringFiles.add("strings.xml")
138-
srcFolders.add("src${File.separator}main")
205+
srcFolders.add("src/main")
139206
}
140207
}
141208

142209
fun ResourceFile.backup(): File {
143-
val cleanPath = "${StringCare.tempFolder}${File.separator}${this.module}${File.separator}${this.sourceFolder}${this.file.absolutePath.split(this.sourceFolder)[1]}"
144-
.replace("${File.separator}${File.separator}", File.separator)
210+
val cleanPath =
211+
"${StringCare.tempFolder}${File.separator}${this.module}${File.separator}${this.sourceFolder}${this.file.absolutePath.split(
212+
this.sourceFolder
213+
)[1]}"
214+
.replace("${File.separator}${File.separator}", File.separator)
145215

146216
val backupFile = File(cleanPath)
147217
this.file.copyTo(backupFile, true)
@@ -294,3 +364,17 @@ fun Node.getType(): StringType {
294364
else -> StringType.TEXT
295365
}
296366
}
367+
368+
fun Configuration.normalize(): Configuration {
369+
val stringFiles = mutableListOf<String>()
370+
val sourceFolders = mutableListOf<String>()
371+
this.stringFiles.forEach { file ->
372+
stringFiles.add(file.normalizePath())
373+
}
374+
this.srcFolders.forEach { folder ->
375+
sourceFolders.add(folder.normalizePath())
376+
}
377+
this.stringFiles = stringFiles
378+
this.srcFolders = sourceFolders
379+
return this
380+
}

src/main/kotlin/components/Tasks.kt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ internal fun pluginBuildTask(): String = "${when (getOs()) {
1919

2020
internal val librarySetupTask = """
2121
${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 &&
22-
${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
22+
${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 &&
23+
${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 &&
24+
${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
2325
""".trimIndent()
2426

2527
internal fun prepareTask(directory: String): String {
@@ -37,6 +39,20 @@ internal fun buildTask(directory: String): String {
3739
""".trimIndent()
3840
}
3941

42+
internal fun basicGradleTask(directory: String): String {
43+
return """
44+
cd $directory &&
45+
${gradleWrapper()} $gradleTaskNameDoctor
46+
""".trimIndent()
47+
}
48+
49+
internal fun obfuscationTestGradleTask(directory: String): String {
50+
return """
51+
cd $directory &&
52+
${gradleWrapper()} ${gradleTaskNameObfuscate}Debug
53+
""".trimIndent()
54+
}
55+
4056
// gradlew task needs export ANDROID_SDK_ROOT=/Users/efrainespada/Library/Android/sdk
4157
// echo "sdk.dir=${System.getenv("ANDROID_SDK_ROOT")}" > local.properties &&
4258
internal fun signingReportTask(directory: String): String {
@@ -46,13 +62,6 @@ internal fun signingReportTask(directory: String): String {
4662
""".trimIndent()
4763
}
4864

49-
internal fun resetCommand(directory: String): String {
50-
return when(getOs()) {
51-
Os.OSX -> "rm -rf $directory && "
52-
Os.WINDOWS -> "rmdir /q/s $directory & "
53-
}
54-
}
55-
5665
internal fun copyCommand(): String = when (getOs()) {
5766
Os.WINDOWS -> copyCommandWindows
5867
Os.OSX -> copyCommandOsX

src/main/kotlin/components/Vars.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ package components
22

33
import java.io.File
44

5+
internal const val version = "3.1"
56
internal const val testProjectName = "KotlinSample"
7+
internal const val defaultDebug = false
68
internal const val defaultMainModule = "app"
9+
internal const val defaultVariant = "debug"
710
internal val mainModuleTest = "$testProjectName${File.separator}$defaultMainModule"
11+
internal const val gradleTaskNameDoctor = "stringcarePreview"
12+
internal const val gradleTaskNameObfuscate = "stringcareTestObfuscate"
813
internal const val extensionName = "stringcare"
914
internal const val winLib = "libsignKey.dll"
1015
internal const val osxLib = "libsignKey.dylib"

src/main/kotlin/components/XParser.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,20 @@ import models.SAttribute
66
import models.StringEntity
77
import java.io.File
88

9-
fun locateFiles(projectPath: String, configuration: Configuration): List<ResourceFile> = File(projectPath).walkTopDown()
10-
.filterIndexed { _, file ->
11-
file.validForConfiguration(configuration)
12-
}.map {
13-
it.resourceFile(configuration)!!
14-
}.toList()
9+
fun locateFiles(projectPath: String, configuration: Configuration): List<ResourceFile> {
10+
if (configuration.debug) {
11+
println("== FILES FOUND ======================================")
12+
}
13+
return File(projectPath).walkTopDown()
14+
.filterIndexed { _, file ->
15+
file.validForConfiguration(configuration.normalize())
16+
}.map {
17+
it.resourceFile(configuration.normalize())!!
18+
}.toList()
19+
}
1520

1621
fun backupFiles(projectPath: String, configuration: Configuration): List<ResourceFile> {
17-
val files = locateFiles(projectPath, configuration)
22+
val files = locateFiles(projectPath, configuration.normalize())
1823
files.forEach { resource ->
1924
resource.backup()
2025
}

0 commit comments

Comments
 (0)