# HG changeset patch # User Da Risk # Date 1761969648 14400 # Node ID f42cdc67a8e7ad266ef7f144629a0bc0ee91caec # Parent 5c0e958ee34702034a37e846e260154244a11d42 build: SourceLicenseChecker exclude checks on generated files diff -r 5c0e958ee347 -r f42cdc67a8e7 buildSrc/src/main/kotlin/SourceLicenseChecker.kt --- a/buildSrc/src/main/kotlin/SourceLicenseChecker.kt Wed Oct 29 15:21:23 2025 -0400 +++ b/buildSrc/src/main/kotlin/SourceLicenseChecker.kt Sat Nov 01 00:00:48 2025 -0400 @@ -24,6 +24,7 @@ import com.android.build.api.dsl.AndroidSourceSet import com.android.build.gradle.BaseExtension import com.android.build.gradle.DynamicFeaturePlugin +import com.android.build.gradle.TestPlugin import com.hierynomus.gradle.license.LicenseBasePlugin import com.hierynomus.gradle.license.tasks.LicenseCheck import com.hierynomus.gradle.license.tasks.LicenseFormat @@ -39,7 +40,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper import org.jetbrains.kotlin.gradle.plugin.KotlinJsPluginWrapper import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper -import java.util.* +import java.util.Locale internal fun Project.configureSourceLicenseChecker() { apply() @@ -57,6 +58,13 @@ plugins.withType(DynamicFeaturePlugin::class.java) { configureAndroid() } + + // the LicensePlugin doesn't configure itself properly on Android Test plugin + // Copied the code to configure it + plugins.withType(TestPlugin::class.java) { + configureAndroid() + } + // make the license tasks looks for kotlin files in an Android project plugins.withType(KotlinAndroidPluginWrapper::class.java) { configureKotlinAndroid() @@ -80,19 +88,42 @@ val kotlinSource = this val sourceSetTaskName = "${LicenseBasePlugin.getLICENSE_TASK_BASE_NAME()}${taskInfix}${name.capitalize()}" - logger.info("Adding $sourceSetTaskName task for sourceSet ${kotlinSource.name}") + if (name.startsWith("generated")) { + logger.info("Skip sourceSet $name because it's generated code") + return@configureEach + } + val configureLicenseCheckTaskLambda: LicenseCheck.() -> Unit = { + source(kotlinSource.kotlin) + exclude { + // exclude generated files, notably protobuf, ksp, hilt + "/generated/" in it.file.path + } + } if (sourceSetTaskName in tasks.names) { // tasks may have already been added by configuration for the Android plugin - logger.info("Tasks $sourceSetTaskName already exists. Skip") - return@configureEach + logger.info("Tasks $sourceSetTaskName already exists. configure it") + tasks.named(sourceSetTaskName, LicenseCheck::class.java, configureLicenseCheckTaskLambda) + } else { + logger.info("Adding ${project.name}:$sourceSetTaskName task for sourceSet ${kotlinSource.name}") + tasks.register(sourceSetTaskName, LicenseCheck::class.java, configureLicenseCheckTaskLambda) } - tasks.register(sourceSetTaskName, LicenseCheck::class.java) { + + val configureLicenseFormatTaskLambda: LicenseFormat.() -> Unit = { source(kotlinSource.kotlin) + exclude { + // exclude generated files, notably protobuf, ksp, hilt + "/generated/" in it.file.path + } } val sourceSetFormatTaskName = "${LicenseBasePlugin.getFORMAT_TASK_BASE_NAME()}${taskInfix}${name.capitalize()}" - tasks.register(sourceSetFormatTaskName, LicenseFormat::class.java) { - source(kotlinSource.kotlin) + if (sourceSetFormatTaskName in tasks.names) { + // tasks may have already been added by configuration for the Android plugin + logger.info("Tasks $sourceSetFormatTaskName already exists. configure it") + tasks.named(sourceSetFormatTaskName, LicenseFormat::class.java, configureLicenseFormatTaskLambda) + } else { + logger.info("Adding ${project.name}:$sourceSetFormatTaskName task for sourceSet ${kotlinSource.name}") + tasks.register(sourceSetFormatTaskName, LicenseFormat::class.java, configureLicenseFormatTaskLambda) } } } @@ -109,11 +140,19 @@ "${LicenseBasePlugin.getLICENSE_TASK_BASE_NAME()}${taskInfix}${name.capitalize()}" tasks.named(sourceSetTaskName, LicenseCheck::class.java) { source(kotlinSource.kotlin, manifest.srcFile) + exclude { + // exclude generated files, notably protobuf + "/generated/" in it.file.path + } } val sourceSetFormatTaskName = "${LicenseBasePlugin.getFORMAT_TASK_BASE_NAME()}${taskInfix}${name.capitalize()}" tasks.named(sourceSetFormatTaskName, LicenseFormat::class.java) { source(kotlinSource.kotlin, manifest.srcFile) + exclude { + // exclude generated files, notably protobuf + "/generated/" in it.file.path + } } } }