@@ -5,6 +5,7 @@ import java.io.File
55import org.gradle.api.DefaultTask
66import org.gradle.api.file.ConfigurableFileCollection
77import org.gradle.api.file.DirectoryProperty
8+ import org.gradle.api.file.FileType
89import org.gradle.api.tasks.*
910import org.gradle.work.*
1011
@@ -24,59 +25,71 @@ abstract class FindPlugsTask : DefaultTask() {
2425
2526 @TaskAction
2627 fun findPlugs (inputChanges : InputChanges ) {
28+ val parser = PlugParser ()
29+
2730 // If not incremental, clear everything and rescan
28- if (! inputChanges.isIncremental) {
31+ if (inputChanges.isIncremental) {
32+ discoveredPlugsDir.get().asFile.mkdirs()
33+ for (change in inputChanges.getFileChanges(classesFolders)) {
34+ if (! change.file.name.endsWith(" .class" )) {
35+ continue
36+ }
37+ when (change.changeType) {
38+ ChangeType .REMOVED -> {
39+ // Remove old discovered data for this file
40+ removeOldMetadata(change)
41+ }
42+ ChangeType .ADDED ,
43+ ChangeType .MODIFIED -> {
44+ parseAndWriteMetadata(parser, change)
45+ }
46+ }
47+ }
48+ } else {
2949 discoveredPlugsDir.get().asFile.deleteRecursively()
30- }
50+ discoveredPlugsDir.get().asFile.mkdirs()
51+ classesFolders.files.forEach { folder ->
52+ folder
53+ .walkTopDown()
54+ .filter { it.isFile && it.name.endsWith(" .class" ) }
55+ .forEach { classFile ->
56+ val relativePath = classFile.toRelativeString(folder)
57+ parseAndWriteMetadata(
58+ parser,
59+ object : FileChange {
60+ override fun getFile (): File = classFile
3161
32- // Make sure our output directory exists
33- discoveredPlugsDir.get().asFile.mkdirs()
62+ override fun getChangeType (): ChangeType = ChangeType .ADDED
3463
35- // For each changed file in classesFolders, determine if it has @Plug
36- val parser = PlugParser ()
37- for (change in inputChanges.getFileChanges(classesFolders)) {
38- if (! change.file.name.endsWith(" .class" )) {
39- continue
40- }
41- when (change.changeType) {
42- ChangeType .REMOVED -> {
43- // Remove old discovered data for this file
44- removeOldMetadata(change.file)
45- }
46- ChangeType .ADDED ,
47- ChangeType .MODIFIED -> {
48- parseAndWriteMetadata(parser, change.file)
49- }
64+ override fun getFileType (): FileType = FileType .FILE
65+
66+ override fun getNormalizedPath (): String = relativePath
67+ })
68+ }
5069 }
5170 }
5271 }
5372
54- private fun parseAndWriteMetadata (parser : PlugParser , classFile : File ) {
55- val plugToSocket = parser.parse(classFile )
73+ private fun parseAndWriteMetadata (parser : PlugParser , change : FileChange ) {
74+ val plugToSocket = parser.parse(change.file )
5675 if (plugToSocket != null ) {
5776 // For example: write a single line containing the discovered plug FQN
58- val discoveredFile = discoveredPlugsDir.file(classFile.nameWithoutExtension).get().asFile
59- if (discoveredFile.exists()) {
60- val existing = discoveredFile.readText().split(" |" )
61- check(existing[0 ] == plugToSocket.first) {
62- " You need to rename one of these plugs because they have the same classfile name: ${existing[0 ]} and $plugToSocket "
63- }
64- } else {
65- discoveredFile.parentFile.mkdirs()
66- }
77+ val discoveredFile = discoveredPlugsDir.file(normalizePath(change)).get().asFile
6778 discoveredFile.writeText(plugToSocket.let { " ${it.first} |${it.second} " })
6879 } else {
6980 // If previously discovered, remove it
70- removeOldMetadata(classFile )
81+ removeOldMetadata(change )
7182 }
7283 }
7384
74- private fun removeOldMetadata (classFile : File ) {
85+ private fun removeOldMetadata (change : FileChange ) {
7586 // Remove any discovered file for the old .class
76- val possibleName = classFile.nameWithoutExtension
77- val discoveredFile = discoveredPlugsDir.file(possibleName).get().asFile
87+ val discoveredFile = discoveredPlugsDir.file(normalizePath(change)).get().asFile
7888 if (discoveredFile.exists()) {
7989 discoveredFile.delete()
8090 }
8191 }
92+
93+ private fun normalizePath (change : FileChange ) =
94+ change.normalizedPath.removeSuffix(" .class" ).replace(" /" , " _" ).replace(" \\ " , " _" )
8295}
0 commit comments