diff --git a/build.gradle.kts b/build.gradle.kts index 0a7c5b16de..d2bc664880 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,9 @@ +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.runBlocking + plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false @@ -76,6 +82,7 @@ tasks.register("qa") { description = "Quality Assurance. Run before pushing." dependsOn( "clean", + "checkStopship", "buildQa", ":Signal-Android:testPlayProdReleaseUnitTest", ":Signal-Android:lintPlayProdRelease", @@ -103,3 +110,40 @@ tasks.register("format") { *subprojects.mapNotNull { tasks.findByPath(":${it.name}:ktlintFormat") }.toTypedArray() ) } + +tasks.register("checkStopship") { + doLast { + val excludedFiles = listOf( + "build.gradle.kts", + "app/lint.xml" + ) + + val allowedExtensions = setOf("kt", "kts", "java", "xml") + + val allFiles = projectDir.walkTopDown() + .asSequence() + .filter { it.isFile && it.extension in allowedExtensions } + .filterNot { excludedFiles.contains(it.relativeTo(projectDir).path) } + .toList() + + println("[STOPSHIP Check] There are ${allFiles.size} relevant files.") + + val scope = CoroutineScope(Dispatchers.IO) + val stopshipFiles = mutableSetOf() + + runBlocking { + allFiles.map { file -> + scope.async { + if (file.readText().contains("STOPSHIP")) { + stopshipFiles += file.relativeTo(projectDir).path + } + } + } + .awaitAll() + } + + if (stopshipFiles.isNotEmpty()) { + throw GradleException("STOPSHIP found! Files: $stopshipFiles") + } + } +} \ No newline at end of file