From 087bd792b12e6d9cf724bae32d44e80428e3b294 Mon Sep 17 00:00:00 2001 From: Tim Oltjenbruns Date: Wed, 11 May 2022 14:03:47 -0400 Subject: [PATCH 1/2] Fix multiple versions.properties files #4830 --- .../detekt/extensions/DetektExtension.kt | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt index 7b8937f0ef8..da7e8786ce0 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt @@ -107,17 +107,21 @@ open class DetektExtension @Inject constructor(objects: ObjectFactory) : CodeQua } } -internal fun loadDetektVersion(classLoader: ClassLoader): String = Properties().run { - val inputStream = classLoader.getResource("versions.properties")!!.openConnection() - /* - * Due to https://bugs.openjdk.java.net/browse/JDK-6947916 and https://bugs.openjdk.java.net/browse/JDK-8155607, - * it is necessary to disallow caches to maintain stability on JDK 8 and 11 (and possibly more). - * Otherwise, simultaneous invocations of Detekt in the same VM can fail spuriously. A similar bug is referenced in - * https://github.com/detekt/detekt/issues/3396. The performance regression is likely unnoticeable. - * Due to https://github.com/detekt/detekt/issues/4332 it is included for all JDKs. - */ - .apply { useCaches = false } - .getInputStream() - load(inputStream) - getProperty("detektVersion") -} +internal fun loadDetektVersion(classLoader: ClassLoader): String = + // Other Gradle plugins can also have a versions.properties. + classLoader.getResources("versions.properties").toList().mapNotNull { versions -> + Properties().run { + val inputStream = versions.openConnection() + /* + * Due to https://bugs.openjdk.java.net/browse/JDK-6947916 and https://bugs.openjdk.java.net/browse/JDK-8155607, + * it is necessary to disallow caches to maintain stability on JDK 8 and 11 (and possibly more). + * Otherwise, simultaneous invocations of Detekt in the same VM can fail spuriously. A similar bug is referenced in + * https://github.com/detekt/detekt/issues/3396. The performance regression is likely unnoticeable. + * Due to https://github.com/detekt/detekt/issues/4332 it is included for all JDKs. + */ + .apply { useCaches = false } + .getInputStream() + load(inputStream) + getProperty("detektVersion") + } + }.distinct().single() From df7bff699f981ab6766fe73dba4210af6db8d861 Mon Sep 17 00:00:00 2001 From: Tim Oltjenbruns Date: Wed, 18 May 2022 15:30:45 -0400 Subject: [PATCH 2/2] Improve build error when multiple Detekt versions are present --- .../arturbosch/detekt/extensions/DetektExtension.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt index da7e8786ce0..cd5e24e1d66 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/extensions/DetektExtension.kt @@ -107,9 +107,9 @@ open class DetektExtension @Inject constructor(objects: ObjectFactory) : CodeQua } } -internal fun loadDetektVersion(classLoader: ClassLoader): String = +internal fun loadDetektVersion(classLoader: ClassLoader): String { // Other Gradle plugins can also have a versions.properties. - classLoader.getResources("versions.properties").toList().mapNotNull { versions -> + val distinctVersions = classLoader.getResources("versions.properties").toList().mapNotNull { versions -> Properties().run { val inputStream = versions.openConnection() /* @@ -124,4 +124,9 @@ internal fun loadDetektVersion(classLoader: ClassLoader): String = load(inputStream) getProperty("detektVersion") } - }.distinct().single() + }.distinct() + return distinctVersions.singleOrNull() ?: error( + "You're importing two Detekt plugins which have different versions. " + + "(${distinctVersions.joinToString()}) Make sure to align the versions." + ) +}