@@ -5,6 +5,7 @@ import java.io.File
5
5
import org.gradle.api.DefaultTask
6
6
import org.gradle.api.file.ConfigurableFileCollection
7
7
import org.gradle.api.file.DirectoryProperty
8
+ import org.gradle.api.file.FileType
8
9
import org.gradle.api.tasks.*
9
10
import org.gradle.work.*
10
11
@@ -24,59 +25,71 @@ abstract class FindPlugsTask : DefaultTask() {
24
25
25
26
@TaskAction
26
27
fun findPlugs (inputChanges : InputChanges ) {
28
+ val parser = PlugParser ()
29
+
27
30
// 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 {
29
49
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
31
61
32
- // Make sure our output directory exists
33
- discoveredPlugsDir.get().asFile.mkdirs()
62
+ override fun getChangeType (): ChangeType = ChangeType .ADDED
34
63
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
+ }
50
69
}
51
70
}
52
71
}
53
72
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 )
56
75
if (plugToSocket != null ) {
57
76
// 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
67
78
discoveredFile.writeText(plugToSocket.let { " ${it.first} |${it.second} " })
68
79
} else {
69
80
// If previously discovered, remove it
70
- removeOldMetadata(classFile )
81
+ removeOldMetadata(change )
71
82
}
72
83
}
73
84
74
- private fun removeOldMetadata (classFile : File ) {
85
+ private fun removeOldMetadata (change : FileChange ) {
75
86
// 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
78
88
if (discoveredFile.exists()) {
79
89
discoveredFile.delete()
80
90
}
81
91
}
92
+
93
+ private fun normalizePath (change : FileChange ) =
94
+ change.normalizedPath.removeSuffix(" .class" ).replace(" /" , " _" ).replace(" \\ " , " _" )
82
95
}
0 commit comments