diff --git a/README.md b/README.md index 2e8df645..fc249433 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,13 @@ About This is a set of Gradle plugins to simplify release tasks +Gradle version compatibilty +=========================== + +* 3.x requires Gradle 7.2, Kotlin 1.5, Java 8 +* 2.x requires Gradle 4.1, Kotlin 1.4, Java 8 +* 1.x requires Gradle 4.1, Kotlin 1.4, Java 8 + Checksum Dependency Plugin ========================== diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index da71e03a..85fad09f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,6 @@ import org.gradle.kotlin.dsl.support.expectedKotlinDslPluginsVersion import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile /* @@ -62,8 +63,13 @@ fun Project.applyKotlinProjectConventions() { tasks.withType().configureEach { options.release.set(11) } - tasks.withType().configureEach { + kotlin { + @Suppress("DEPRECATION") + val targetKotlinVersion = KotlinVersion.KOTLIN_1_5 + compilerOptions { + apiVersion.set(targetKotlinVersion) + languageVersion.set(targetKotlinVersion) jvmTarget = JvmTarget.JVM_11 freeCompilerArgs.add("-Xjdk-release=11") } diff --git a/buildSrc/src/main/kotlin/build.kotlin-conventions.gradle.kts b/buildSrc/src/main/kotlin/build.kotlin-conventions.gradle.kts index 50164047..f019f0eb 100644 --- a/buildSrc/src/main/kotlin/build.kotlin-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/build.kotlin-conventions.gradle.kts @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinVersion -import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile plugins { id("build.java-conventions") @@ -25,12 +24,16 @@ plugins { kotlin("jvm") } -tasks.withType().configureEach { +kotlin { + @Suppress("DEPRECATION") + val targetKotlinVersion = KotlinVersion.KOTLIN_1_5 + + coreLibrariesVersion = "1.5.31" compilerOptions { - freeCompilerArgs.add("-Xjdk-release=8") - @Suppress("DEPRECATION") - apiVersion.set(KotlinVersion.KOTLIN_1_4) jvmTarget = JvmTarget.JVM_1_8 + freeCompilerArgs.add("-Xjdk-release=8") + apiVersion.set(targetKotlinVersion) + languageVersion.set(targetKotlinVersion) } } diff --git a/plugins/gettext-plugin/src/main/kotlin/com/github/vlsi/gradle/gettext/BaseGettextEditTask.kt b/plugins/gettext-plugin/src/main/kotlin/com/github/vlsi/gradle/gettext/BaseGettextEditTask.kt index e16cfb20..ec52ec21 100644 --- a/plugins/gettext-plugin/src/main/kotlin/com/github/vlsi/gradle/gettext/BaseGettextEditTask.kt +++ b/plugins/gettext-plugin/src/main/kotlin/com/github/vlsi/gradle/gettext/BaseGettextEditTask.kt @@ -55,7 +55,7 @@ abstract class BaseGettextEditTask @Inject constructor( searchBytes.withIndex().all { (j, v) -> v == potBytes[i + j] } } ?: return val headerEnd = - (headerStart..potBytes.size).find { potBytes[it] == '"'.toByte() } ?: return + (headerStart..potBytes.size).find { potBytes[it] == '"'.code.toByte() } ?: return outputStream().use { it.write(potBytes, 0, headerStart) diff --git a/plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/publishing/dsl/PublicationContainerExtensions.kt b/plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/publishing/dsl/PublicationContainerExtensions.kt index d7164bfa..51f8d97d 100644 --- a/plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/publishing/dsl/PublicationContainerExtensions.kt +++ b/plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/publishing/dsl/PublicationContainerExtensions.kt @@ -21,11 +21,16 @@ import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.named +import java.util.Locale fun Project.extraMavenPublications() = extraMavenPublications("Maven", name) fun Project.extraMavenPublications(configurationName: String, publicationName: String) { - val configuration = configurations.create("extra${configurationName.capitalize()}Publications") { + val configuration = configurations.create("extra${ + configurationName.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }Publications") { isVisible = false isCanBeResolved = false isCanBeConsumed = false diff --git a/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/TfIdf.kt b/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/TfIdf.kt index 7010ceef..8cd49f3c 100644 --- a/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/TfIdf.kt +++ b/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/TfIdf.kt @@ -69,7 +69,7 @@ class TfIdfBuilder { .associateTo(mutableMapOf()) { (index, term) -> index to termCount.getValue(term) * idf.getValue(term) } - val k = 1 / sqrt(terms.values.sumByDouble { it * it }) + val k = 1 / sqrt(terms.values.sumOf { it * it }) terms.replaceAll { _, value -> value * k } docVec[document] = terms } @@ -236,7 +236,7 @@ class Tokenizer { fun getTokens(input: String): List { val text = input .replace(SPDX_TAG, " ") - .toLowerCase() + .lowercase() .replace(COPYRIGHT, "copyright ") val words = WHITESPACE.split(text) @@ -276,7 +276,7 @@ class Predictor( ) } - val norm = 1 / sqrt(testVec.values.sumByDouble { it * it }) + val norm = 1 / sqrt(testVec.values.sumOf { it * it }) testVec.replaceAll { _, value -> value * norm } return docVec.mapValues { (_, docTerms) -> cross(testVec, docTerms) } diff --git a/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/api/LicenseExpressionParser.kt b/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/api/LicenseExpressionParser.kt index 62e13680..b73f01c4 100644 --- a/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/api/LicenseExpressionParser.kt +++ b/plugins/license-gather-plugin/src/main/kotlin/com/github/vlsi/gradle/license/api/LicenseExpressionParser.kt @@ -57,7 +57,7 @@ class LicenseExpressionParser(private val titleParser: LicenseParser = DefaultLi .map { Token( position = it.range, value = it.value, - type = when (it.value.toUpperCase()) { + type = when (it.value.uppercase()) { "(" -> TokenType.LBRACE ")" -> TokenType.RBRACE "+" -> TokenType.PLUS diff --git a/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/ReleaseExtension.kt b/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/ReleaseExtension.kt index eb07fd72..b4429333 100644 --- a/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/ReleaseExtension.kt +++ b/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/ReleaseExtension.kt @@ -32,6 +32,7 @@ import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.bundling.AbstractArchiveTask import org.gradle.kotlin.dsl.* import java.time.Duration +import java.util.Locale /** * Setting up local release environment: @@ -296,7 +297,7 @@ open class GitConfig @Inject constructor( val pushRepositoryProvider = objects.property() .convention(ext.prefixForProperties.map { prefix -> project.stringProperty("$prefix.git.pushRepositoryProvider") - ?.let { GitPushRepositoryProvider.valueOf(it.toUpperCase()) } + ?.let { GitPushRepositoryProvider.valueOf(it.uppercase()) } ?: GitPushRepositoryProvider.GITHUB }) @@ -313,7 +314,9 @@ open class GitConfig @Inject constructor( val branch = objects.property() - val credentials = objects.newInstance("Git" + name.capitalize(), ext) + val credentials = objects.newInstance("Git" + name.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + }, ext) override fun toString() = "${urls.get().pushUrl}, branch: ${branch.get()}" } @@ -349,7 +352,7 @@ open class Credentials @Inject constructor( private val kebabDelimeters = Regex("""(\p{Lower})\s*(\p{Upper})""") private fun String.toKebabCase() = replace(kebabDelimeters) { "${it.groupValues[1]}-${it.groupValues[2]}" } - .toLowerCase() + .lowercase() class ReleaseArtifact( val name: String, @@ -375,7 +378,7 @@ class ReleaseParams( get() = gitSha.subSequence(0, 10) val tlpUrl - get() = tlp.toLowerCase() + get() = tlp.lowercase() } internal fun Project.validate(credentials: () -> Credentials) = listOf( diff --git a/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/StageVoteReleasePlugin.kt b/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/StageVoteReleasePlugin.kt index 40ad130e..6445137c 100644 --- a/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/StageVoteReleasePlugin.kt +++ b/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/StageVoteReleasePlugin.kt @@ -62,6 +62,7 @@ import java.io.File import java.net.URI import java.nio.charset.StandardCharsets import java.time.Duration +import java.util.Locale import javax.inject.Inject class StageVoteReleasePlugin @Inject constructor( @@ -155,8 +156,16 @@ class StageVoteReleasePlugin @Inject constructor( hideMavenPublishTasks() // Tasks from NexusStagingPlugin - val closeRepository = tasks.named("close${REPOSITORY_NAME.capitalize()}StagingRepository") - val releaseRepository = tasks.named("release${REPOSITORY_NAME.capitalize()}StagingRepository") + val closeRepository = tasks.named("close${ + REPOSITORY_NAME.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }StagingRepository") + val releaseRepository = tasks.named("release${ + REPOSITORY_NAME.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }StagingRepository") val pushRcTag = createPushRcTag(releaseExt, validateRcIndexSpecified, validateBeforeBuildingReleaseArtifacts, closeRepository) val pushReleaseTag = createPushReleaseTag(releaseExt, validateRcIndexSpecified, releaseRepository) @@ -204,7 +213,11 @@ class StageVoteReleasePlugin @Inject constructor( } closeRepository.hide() releaseRepository.hide() - tasks.named("closeAndRelease${REPOSITORY_NAME.capitalize()}StagingRepository").hide() + tasks.named("closeAndRelease${ + REPOSITORY_NAME.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }StagingRepository").hide() releaseRepository { // Note: publishSvnDist might fail, and it is easier to rollback than "rollback Nexus" @@ -231,7 +244,11 @@ class StageVoteReleasePlugin @Inject constructor( allprojects { plugins.withType { stageDist { - dependsOn(tasks.named("publishAllPublicationsTo${REPOSITORY_NAME.capitalize()}Repository")) + dependsOn(tasks.named("publishAllPublicationsTo${ + REPOSITORY_NAME.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }Repository")) } } } @@ -400,7 +417,11 @@ class StageVoteReleasePlugin @Inject constructor( tasks.withType().hide() tasks.withType().hide() tasks.withType().hide() - tasks.named("publishAllPublicationsTo${REPOSITORY_NAME.capitalize()}Repository").hide() + tasks.named("publishAllPublicationsTo${ + REPOSITORY_NAME.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }Repository").hide() val generatePomTasks = tasks.withType() generatePomTasks.hide() tasks.register("generatePom") { @@ -577,16 +598,28 @@ class StageVoteReleasePlugin @Inject constructor( } }) - tasks.named("release${REPOSITORY_NAME.capitalize()}StagingRepository") { + tasks.named("release${ + REPOSITORY_NAME.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }StagingRepository") { stagingRepositoryId.set(project.provider { releaseExt.repositoryIdStore.getOrLoad(REPOSITORY_NAME) }) } - tasks.named("initialize${repo.name.capitalize()}StagingRepository") { + tasks.named("initialize${ + repo.name.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }StagingRepository") { dependsOn(validateBeforeBuildingReleaseArtifacts) dependsOn(validateNexusCredentials) doLast { val repoName = repository.get().name val closeRepoTask = - rootProject.tasks.named("close${repoName.capitalize()}StagingRepository") + rootProject.tasks.named("close${ + repoName.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() + } + }StagingRepository") val stagingRepositoryId = closeRepoTask.get().stagingRepositoryId.get() releaseExt.repositoryIdStore[repoName] = stagingRepositoryId diff --git a/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/svn/Svn.kt b/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/svn/Svn.kt index 92810425..5a128d12 100644 --- a/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/svn/Svn.kt +++ b/plugins/stage-vote-release-plugin/src/main/kotlin/com/github/vlsi/gradle/release/svn/Svn.kt @@ -25,7 +25,6 @@ import java.io.ByteArrayOutputStream import java.net.URI import java.time.OffsetDateTime import org.gradle.api.GradleException -import org.gradle.api.Project import org.gradle.api.logging.Logger import org.gradle.process.ExecOperations import java.io.File @@ -46,7 +45,7 @@ class Svn(val execOperations: ExecOperations, val logger: Logger, val projectDir // // ... private fun GPathResult.toSvnEntry(path: String) = SvnEntry( - kind = attr("kind").let { EntryKind.valueOf(it.toUpperCase()) }, + kind = attr("kind").let { EntryKind.valueOf(it.uppercase()) }, path = path, name = get("name").text(), size = get("size").text().ifBlank { null }?.toLong(), @@ -106,7 +105,7 @@ class Svn(val execOperations: ExecOperations, val logger: Logger, val projectDir val stderr = ByteArrayOutputStream() val result = execOperations.exec { workingDir = projectDir - commandLine("svn", "ls", "--xml", "--depth", opts.depth.name.toLowerCase()) + commandLine("svn", "ls", "--xml", "--depth", opts.depth.name.lowercase()) for (folder in opts.folders) { args("$uri/$folder/") } diff --git a/testkit/src/main/kotlin/com/github/vlsi/gradle/BaseGradleTest.kt b/testkit/src/main/kotlin/com/github/vlsi/gradle/BaseGradleTest.kt index 6277d8e2..ff9cbadb 100644 --- a/testkit/src/main/kotlin/com/github/vlsi/gradle/BaseGradleTest.kt +++ b/testkit/src/main/kotlin/com/github/vlsi/gradle/BaseGradleTest.kt @@ -57,18 +57,9 @@ open class BaseGradleTest { return listOf(arguments(TestCase(GradleVersion.version("8.10.2"), ConfigurationCache.ON))) } return mutableListOf().apply { - if (JavaVersion.current() <= JavaVersion.VERSION_1_8) { - add(arguments(TestCase(GradleVersion.version("4.1"), ConfigurationCache.OFF))) - add(arguments(TestCase(GradleVersion.version("4.4.1"), ConfigurationCache.OFF))) - add(arguments(TestCase(GradleVersion.version("4.10.2"), ConfigurationCache.OFF))) - } // Java 11 requires Gradle 5.0+ if (JavaVersion.current() <= JavaVersion.VERSION_11) { - add(arguments(TestCase(GradleVersion.version("5.6.2"), ConfigurationCache.OFF))) - add(arguments(TestCase(GradleVersion.version("5.4.1"), ConfigurationCache.OFF))) - add(arguments(TestCase(GradleVersion.version("6.0"), ConfigurationCache.OFF))) - add(arguments(TestCase(GradleVersion.version("6.5"), ConfigurationCache.OFF))) - add(arguments(TestCase(GradleVersion.version("7.0"), ConfigurationCache.OFF))) + add(arguments(TestCase(GradleVersion.version("7.2"), ConfigurationCache.OFF))) } // Java 17 requires Gradle 7.3+ if (JavaVersion.current() <= JavaVersion.VERSION_17) {