Skip to content

Commit bca0ac4

Browse files
authored
Fix mixed non-incremental builds (#68)
2 parents c01b2e6 + f7d2433 commit bca0ac4

File tree

2 files changed

+49
-34
lines changed

2 files changed

+49
-34
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# AtPlug releases
22

33
## [Unreleased]
4+
### Fixed
5+
- `FindPlugsTask` had an up-to-date issue in projects with mixed Kotlin and Java. ([#68](https://github.com/diffplug/atplug/pull/68))
46

57
## [1.2.0] - 2025-01-27
68
### Added

atplug-plugin-gradle/src/main/java/com/diffplug/atplug/tooling/gradle/FindPlugsTask.kt

+47-34
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import java.io.File
55
import org.gradle.api.DefaultTask
66
import org.gradle.api.file.ConfigurableFileCollection
77
import org.gradle.api.file.DirectoryProperty
8+
import org.gradle.api.file.FileType
89
import org.gradle.api.tasks.*
910
import 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

Comments
 (0)