Skip to content

Commit f5a7500

Browse files
committed
Ensure instrumentation naming validation recurses into nested modules
1 parent 4a86a6f commit f5a7500

File tree

1 file changed

+26
-35
lines changed

1 file changed

+26
-35
lines changed

buildSrc/src/main/kotlin/datadog/gradle/plugin/naming/InstrumentationNamingPlugin.kt

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -82,49 +82,40 @@ class InstrumentationNamingPlugin : Plugin<Project> {
8282
): List<NamingViolation> {
8383
val violations = mutableListOf<NamingViolation>()
8484

85-
// Get all subdirectories in the instrumentations directory
86-
instrumentationsDir.listFiles { file -> file.isDirectory }?.forEach parentLoop@{ parentDir ->
87-
val parentName = parentDir.name
85+
fun hasBuildFile(dir: File): Boolean = dir.listFiles()?.any {
86+
it.name == "build.gradle" || it.name == "build.gradle.kts"
87+
} ?: false
8888

89-
// Skip build directories and other non-instrumentation directories
90-
if (parentName in setOf("build", "src", ".gradle")) {
91-
return@parentLoop
92-
}
89+
fun traverseModules(currentDir: File, parentName: String?) {
90+
currentDir.listFiles { file -> file.isDirectory }?.forEach childLoop@{ childDir ->
91+
val moduleName = childDir.name
9392

94-
val hasBuildFile = parentDir.listFiles()?.any {
95-
it.name == "build.gradle" || it.name == "build.gradle.kts"
96-
} ?: false
97-
98-
// Check for subdirectories that are modules
99-
val subModules = parentDir.listFiles { file -> file.isDirectory }
100-
?.filter { subDir ->
101-
val name = subDir.name
102-
// Skip build and other non-module directories
103-
name !in setOf("build", "src", ".gradle") &&
104-
// Check if it has a build file
105-
subDir.listFiles()?.any { it.name == "build.gradle" || it.name == "build.gradle.kts" } == true
106-
} ?: emptyList()
107-
108-
if (subModules.isEmpty()) {
109-
// No submodules, this is a leaf module
110-
if (hasBuildFile && parentName !in exclusions) {
111-
validateLeafModuleName(parentName, parentDir.relativeTo(instrumentationsDir).path, suffixes)?.let {
112-
violations.add(it)
113-
}
93+
// Skip build directories and other non-instrumentation directories
94+
if (moduleName in setOf("build", "src", ".gradle")) {
95+
return@childLoop
11496
}
115-
} else {
116-
// Has submodules, validate each one
117-
subModules.forEach { moduleDir ->
118-
val moduleName = moduleDir.name
119-
if (moduleName !in exclusions) {
120-
validateModuleName(moduleName, parentName, moduleDir.relativeTo(instrumentationsDir).path, suffixes)?.let {
121-
violations.add(it)
122-
}
97+
98+
val childHasBuildFile = hasBuildFile(childDir)
99+
val nestedModules = childDir.listFiles { file -> file.isDirectory }?.filter { hasBuildFile(it) } ?: emptyList()
100+
101+
if (childHasBuildFile && moduleName !in exclusions) {
102+
val relativePath = childDir.relativeTo(instrumentationsDir).path
103+
if (parentName == null && nestedModules.isEmpty()) {
104+
validateLeafModuleName(moduleName, relativePath, suffixes)?.let { violations.add(it) }
105+
} else if (parentName != null) {
106+
validateModuleName(moduleName, parentName, relativePath, suffixes)?.let { violations.add(it) }
123107
}
124108
}
109+
110+
// Continue traversing to validate deeply nested modules
111+
if (nestedModules.isNotEmpty() || !childHasBuildFile) {
112+
traverseModules(childDir, moduleName)
113+
}
125114
}
126115
}
127116

117+
traverseModules(instrumentationsDir, null)
118+
128119
return violations
129120
}
130121

0 commit comments

Comments
 (0)