From 15d8d2cce7f052de265e7f96cba3616ae696aad5 Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Fri, 5 Jul 2024 18:20:26 +0200 Subject: [PATCH 1/3] rename modules --- {cli => librarian-cli}/api/cli.api | 0 {cli => librarian-cli}/build.gradle.kts | 3 +- .../gradleup/librarian/cli/CreateCommand.kt | 4 +- .../kotlin/com/gradleup/librarian/cli/Main.kt | 0 .../com/gradleup/librarian/cli/MainCommand.kt | 0 .../librarian/cli/PrepareReleaseCommand.kt | 0 .../gradleup/librarian/cli/ReleaseCommand.kt | 0 .../librarian/cli/SetupGithubCommand.kt | 0 .../com/gradleup/librarian/cli/inquirer.kt | 0 .../com/gradleup/librarian/cli/process.kt | 0 .../src/main/resources/CHANGELOG.md | 0 {cli => librarian-cli}/src/main/resources/MIT | 0 .../resources/actions/check-pull-request.yaml | 0 .../resources/actions/prepare-release.yaml | 0 .../resources/actions/publish-release.yaml | 0 .../resources/actions/publish-snapshot.yaml | 0 .../src/main/resources/codeStyles/Project.xml | 0 .../resources/codeStyles/codeStyleConfig.xml | 0 .../src/main/resources/gitignore | 0 .../src/main/resources/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../src/main/resources/gradlew | 0 .../src/main/resources/gradlew.bat | 0 librarian-core/build.gradle.kts | 14 ++++ .../librarian/core/tooling/changelog.kt | 0 .../librarian/core/tooling/prepare-release.kt | 0 .../gradleup/librarian/core/tooling/semver.kt | 0 .../src/test/kotlin/ChangelogTest.kt | 0 .../api/core.api | 0 .../build.gradle.kts | 2 +- .../librarian/gradle}/LibrarianPlugin.kt | 2 +- .../com/gradleup/librarian/gradle}/bcv.kt | 2 +- .../gradle}/compatibility.android.kt | 4 +- .../librarian/gradle}/compatibility.kotlin.kt | 2 +- .../librarian/gradle}/compatibility.kt | 6 +- .../gradleup/librarian/gradle}/dokkatoo.kt | 4 +- .../librarian/gradle}/generatedVersion.kt | 2 +- .../gradle}/internal/project.android.kt | 2 +- .../librarian/gradle}/internal/project.kt | 2 +- .../gradle}/internal/publishing.android.kt | 6 +- .../gradle}/internal/task/CloseRepoTask.kt | 6 +- .../gradle}/internal/task/CreateRepoTask.kt | 6 +- .../gradle}/internal/task/ReleaseRepoTask.kt | 6 +- .../com/gradleup/librarian/gradle}/kmp.kt | 2 +- .../com/gradleup/librarian/gradle}/maven.kt | 2 +- .../com/gradleup/librarian/gradle}/module.kt | 4 +- .../librarian/gradle}/project.kotlin.kt | 2 +- .../gradleup/librarian/gradle}/publishing.kt | 8 +- .../com/gradleup/librarian/gradle}/root.kt | 4 +- .../com/gradleup/librarian/gradle}/signing.kt | 2 +- .../src/test/kotlin/ChangelogTest.kt | 75 ++++++++++++++++++ settings.gradle.kts | 2 +- 53 files changed, 132 insertions(+), 42 deletions(-) rename {cli => librarian-cli}/api/cli.api (100%) rename {cli => librarian-cli}/build.gradle.kts (91%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt (98%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/Main.kt (100%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt (100%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/PrepareReleaseCommand.kt (100%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/ReleaseCommand.kt (100%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/SetupGithubCommand.kt (100%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/inquirer.kt (100%) rename {cli => librarian-cli}/src/main/kotlin/com/gradleup/librarian/cli/process.kt (100%) rename {cli => librarian-cli}/src/main/resources/CHANGELOG.md (100%) rename {cli => librarian-cli}/src/main/resources/MIT (100%) rename {cli => librarian-cli}/src/main/resources/actions/check-pull-request.yaml (100%) rename {cli => librarian-cli}/src/main/resources/actions/prepare-release.yaml (100%) rename {cli => librarian-cli}/src/main/resources/actions/publish-release.yaml (100%) rename {cli => librarian-cli}/src/main/resources/actions/publish-snapshot.yaml (100%) rename {cli => librarian-cli}/src/main/resources/codeStyles/Project.xml (100%) rename {cli => librarian-cli}/src/main/resources/codeStyles/codeStyleConfig.xml (100%) rename {cli => librarian-cli}/src/main/resources/gitignore (100%) rename {cli => librarian-cli}/src/main/resources/gradle.properties (100%) rename {cli => librarian-cli}/src/main/resources/gradle/wrapper/gradle-wrapper.jar (100%) rename {cli => librarian-cli}/src/main/resources/gradle/wrapper/gradle-wrapper.properties (100%) rename {cli => librarian-cli}/src/main/resources/gradlew (100%) rename {cli => librarian-cli}/src/main/resources/gradlew.bat (100%) create mode 100644 librarian-core/build.gradle.kts rename {core => librarian-core}/src/main/kotlin/com/gradleup/librarian/core/tooling/changelog.kt (100%) rename {core => librarian-core}/src/main/kotlin/com/gradleup/librarian/core/tooling/prepare-release.kt (100%) rename {core => librarian-core}/src/main/kotlin/com/gradleup/librarian/core/tooling/semver.kt (100%) rename {core => librarian-core}/src/test/kotlin/ChangelogTest.kt (100%) rename {core => librarian-gradle-plugin}/api/core.api (100%) rename {core => librarian-gradle-plugin}/build.gradle.kts (91%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/LibrarianPlugin.kt (87%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/bcv.kt (91%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/compatibility.android.kt (90%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/compatibility.kotlin.kt (98%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/compatibility.kt (91%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/dokkatoo.kt (98%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/generatedVersion.kt (97%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/internal/project.android.kt (88%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/internal/project.kt (92%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/internal/publishing.android.kt (83%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/internal/task/CloseRepoTask.kt (85%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/internal/task/CreateRepoTask.kt (92%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/internal/task/ReleaseRepoTask.kt (81%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/kmp.kt (88%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/maven.kt (98%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/module.kt (96%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/project.kotlin.kt (94%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/publishing.kt (98%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/root.kt (95%) rename {core/src/main/kotlin/com/gradleup/librarian/core => librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle}/signing.kt (97%) create mode 100644 librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt diff --git a/cli/api/cli.api b/librarian-cli/api/cli.api similarity index 100% rename from cli/api/cli.api rename to librarian-cli/api/cli.api diff --git a/cli/build.gradle.kts b/librarian-cli/build.gradle.kts similarity index 91% rename from cli/build.gradle.kts rename to librarian-cli/build.gradle.kts index 54a573a..44451d2 100644 --- a/cli/build.gradle.kts +++ b/librarian-cli/build.gradle.kts @@ -9,7 +9,8 @@ plugins { librarianModule() dependencies { - implementation(project(":core")) + implementation(project(":librarian-gradle-plugin")) + implementation(project(":librarian-core")) implementation(libs.clikt) implementation(libs.inquirer) implementation(libs.jsonpath) diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt similarity index 98% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt index e8376f0..c6c0fec 100644 --- a/cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt +++ b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt @@ -94,7 +94,7 @@ internal class CreateCommand : CliktCommand() { ) file("gradle/libs.versions.toml").writeText("[libraries]", false) file("build.gradle.kts").writeText(""" - import com.gradleup.librarian.core.librarianRoot + import com.gradleup.librarian.gradle.librarianRoot plugins { id("org.jetbrains.kotlin.jvm").version("${latestKotlinRelease()}").apply(false) @@ -109,7 +109,7 @@ internal class CreateCommand : CliktCommand() { file(moduleName).let { moduleDir -> moduleDir.mkdirs() moduleDir.resolve("build.gradle.kts").writeText(""" - import com.gradleup.librarian.core.librarianModule + import com.gradleup.librarian.gradle.librarianModule plugins { id("org.jetbrains.kotlin.jvm") diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/Main.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/Main.kt similarity index 100% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/Main.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/Main.kt diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt similarity index 100% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/PrepareReleaseCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/PrepareReleaseCommand.kt similarity index 100% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/PrepareReleaseCommand.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/PrepareReleaseCommand.kt diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/ReleaseCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/ReleaseCommand.kt similarity index 100% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/ReleaseCommand.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/ReleaseCommand.kt diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/SetupGithubCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/SetupGithubCommand.kt similarity index 100% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/SetupGithubCommand.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/SetupGithubCommand.kt diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/inquirer.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/inquirer.kt similarity index 100% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/inquirer.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/inquirer.kt diff --git a/cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt similarity index 100% rename from cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt rename to librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt diff --git a/cli/src/main/resources/CHANGELOG.md b/librarian-cli/src/main/resources/CHANGELOG.md similarity index 100% rename from cli/src/main/resources/CHANGELOG.md rename to librarian-cli/src/main/resources/CHANGELOG.md diff --git a/cli/src/main/resources/MIT b/librarian-cli/src/main/resources/MIT similarity index 100% rename from cli/src/main/resources/MIT rename to librarian-cli/src/main/resources/MIT diff --git a/cli/src/main/resources/actions/check-pull-request.yaml b/librarian-cli/src/main/resources/actions/check-pull-request.yaml similarity index 100% rename from cli/src/main/resources/actions/check-pull-request.yaml rename to librarian-cli/src/main/resources/actions/check-pull-request.yaml diff --git a/cli/src/main/resources/actions/prepare-release.yaml b/librarian-cli/src/main/resources/actions/prepare-release.yaml similarity index 100% rename from cli/src/main/resources/actions/prepare-release.yaml rename to librarian-cli/src/main/resources/actions/prepare-release.yaml diff --git a/cli/src/main/resources/actions/publish-release.yaml b/librarian-cli/src/main/resources/actions/publish-release.yaml similarity index 100% rename from cli/src/main/resources/actions/publish-release.yaml rename to librarian-cli/src/main/resources/actions/publish-release.yaml diff --git a/cli/src/main/resources/actions/publish-snapshot.yaml b/librarian-cli/src/main/resources/actions/publish-snapshot.yaml similarity index 100% rename from cli/src/main/resources/actions/publish-snapshot.yaml rename to librarian-cli/src/main/resources/actions/publish-snapshot.yaml diff --git a/cli/src/main/resources/codeStyles/Project.xml b/librarian-cli/src/main/resources/codeStyles/Project.xml similarity index 100% rename from cli/src/main/resources/codeStyles/Project.xml rename to librarian-cli/src/main/resources/codeStyles/Project.xml diff --git a/cli/src/main/resources/codeStyles/codeStyleConfig.xml b/librarian-cli/src/main/resources/codeStyles/codeStyleConfig.xml similarity index 100% rename from cli/src/main/resources/codeStyles/codeStyleConfig.xml rename to librarian-cli/src/main/resources/codeStyles/codeStyleConfig.xml diff --git a/cli/src/main/resources/gitignore b/librarian-cli/src/main/resources/gitignore similarity index 100% rename from cli/src/main/resources/gitignore rename to librarian-cli/src/main/resources/gitignore diff --git a/cli/src/main/resources/gradle.properties b/librarian-cli/src/main/resources/gradle.properties similarity index 100% rename from cli/src/main/resources/gradle.properties rename to librarian-cli/src/main/resources/gradle.properties diff --git a/cli/src/main/resources/gradle/wrapper/gradle-wrapper.jar b/librarian-cli/src/main/resources/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from cli/src/main/resources/gradle/wrapper/gradle-wrapper.jar rename to librarian-cli/src/main/resources/gradle/wrapper/gradle-wrapper.jar diff --git a/cli/src/main/resources/gradle/wrapper/gradle-wrapper.properties b/librarian-cli/src/main/resources/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from cli/src/main/resources/gradle/wrapper/gradle-wrapper.properties rename to librarian-cli/src/main/resources/gradle/wrapper/gradle-wrapper.properties diff --git a/cli/src/main/resources/gradlew b/librarian-cli/src/main/resources/gradlew similarity index 100% rename from cli/src/main/resources/gradlew rename to librarian-cli/src/main/resources/gradlew diff --git a/cli/src/main/resources/gradlew.bat b/librarian-cli/src/main/resources/gradlew.bat similarity index 100% rename from cli/src/main/resources/gradlew.bat rename to librarian-cli/src/main/resources/gradlew.bat diff --git a/librarian-core/build.gradle.kts b/librarian-core/build.gradle.kts new file mode 100644 index 0000000..423bee4 --- /dev/null +++ b/librarian-core/build.gradle.kts @@ -0,0 +1,14 @@ +import com.gradleup.librarian.core.librarianModule + +plugins { + id("org.jetbrains.kotlin.jvm") +} + +librarianModule() + +dependencies { + implementation(libs.coroutines) + + testImplementation(kotlin("test")) +} + diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/tooling/changelog.kt b/librarian-core/src/main/kotlin/com/gradleup/librarian/core/tooling/changelog.kt similarity index 100% rename from core/src/main/kotlin/com/gradleup/librarian/core/tooling/changelog.kt rename to librarian-core/src/main/kotlin/com/gradleup/librarian/core/tooling/changelog.kt diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/tooling/prepare-release.kt b/librarian-core/src/main/kotlin/com/gradleup/librarian/core/tooling/prepare-release.kt similarity index 100% rename from core/src/main/kotlin/com/gradleup/librarian/core/tooling/prepare-release.kt rename to librarian-core/src/main/kotlin/com/gradleup/librarian/core/tooling/prepare-release.kt diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/tooling/semver.kt b/librarian-core/src/main/kotlin/com/gradleup/librarian/core/tooling/semver.kt similarity index 100% rename from core/src/main/kotlin/com/gradleup/librarian/core/tooling/semver.kt rename to librarian-core/src/main/kotlin/com/gradleup/librarian/core/tooling/semver.kt diff --git a/core/src/test/kotlin/ChangelogTest.kt b/librarian-core/src/test/kotlin/ChangelogTest.kt similarity index 100% rename from core/src/test/kotlin/ChangelogTest.kt rename to librarian-core/src/test/kotlin/ChangelogTest.kt diff --git a/core/api/core.api b/librarian-gradle-plugin/api/core.api similarity index 100% rename from core/api/core.api rename to librarian-gradle-plugin/api/core.api diff --git a/core/build.gradle.kts b/librarian-gradle-plugin/build.gradle.kts similarity index 91% rename from core/build.gradle.kts rename to librarian-gradle-plugin/build.gradle.kts index f40f296..617e3d1 100644 --- a/core/build.gradle.kts +++ b/librarian-gradle-plugin/build.gradle.kts @@ -32,7 +32,7 @@ gradlePlugin { id = "com.gradleup.librarian" description = "The librarian plugin. The plugin is no-op and merely serves for plugin the librarian .jar into the build classpath" - implementationClass = "com.gradleup.librarian.core.LibrarianPlugin" + implementationClass = "com.gradleup.librarian.gradle.LibrarianPlugin" } } } diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/LibrarianPlugin.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianPlugin.kt similarity index 87% rename from core/src/main/kotlin/com/gradleup/librarian/core/LibrarianPlugin.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianPlugin.kt index 0e8bb2c..62a2757 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/LibrarianPlugin.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianPlugin.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import org.gradle.api.Plugin import org.gradle.api.Project diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/bcv.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/bcv.kt similarity index 91% rename from core/src/main/kotlin/com/gradleup/librarian/core/bcv.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/bcv.kt index 6629faa..92c67b7 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/bcv.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/bcv.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import kotlinx.validation.ApiValidationExtension import kotlinx.validation.ExperimentalBCVApi diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/compatibility.android.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.android.kt similarity index 90% rename from core/src/main/kotlin/com/gradleup/librarian/core/compatibility.android.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.android.kt index 585eaab..585e42f 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/compatibility.android.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.android.kt @@ -1,7 +1,7 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import com.android.build.api.dsl.LibraryExtension -import com.gradleup.librarian.core.internal.androidExtension +import com.gradleup.librarian.gradle.internal.androidExtension import org.gradle.api.Incubating import org.gradle.api.JavaVersion import org.gradle.api.Project diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/compatibility.kotlin.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kotlin.kt similarity index 98% rename from core/src/main/kotlin/com/gradleup/librarian/core/compatibility.kotlin.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kotlin.kt index b361047..04bc4f6 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/compatibility.kotlin.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kotlin.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import org.gradle.api.JavaVersion import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.JvmTarget diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/compatibility.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kt similarity index 91% rename from core/src/main/kotlin/com/gradleup/librarian/core/compatibility.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kt index 0637c68..26ac21f 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/compatibility.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kt @@ -1,7 +1,7 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle -import com.gradleup.librarian.core.internal.hasAndroid -import com.gradleup.librarian.core.internal.hasKotlin +import com.gradleup.librarian.gradle.internal.hasAndroid +import com.gradleup.librarian.gradle.internal.hasKotlin import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.tasks.compile.JavaCompile diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/dokkatoo.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/dokkatoo.kt similarity index 98% rename from core/src/main/kotlin/com/gradleup/librarian/core/dokkatoo.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/dokkatoo.kt index d9de442..3c0712f 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/dokkatoo.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/dokkatoo.kt @@ -1,6 +1,6 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle -import com.gradleup.librarian.core.internal.findGradleProperty +import com.gradleup.librarian.gradle.internal.findGradleProperty import dev.adamko.dokkatoo.DokkatooExtension import dev.adamko.dokkatoo.dokka.plugins.DokkaHtmlPluginParameters import dev.adamko.dokkatoo.dokka.plugins.DokkaVersioningPluginParameters diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/generatedVersion.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/generatedVersion.kt similarity index 97% rename from core/src/main/kotlin/com/gradleup/librarian/core/generatedVersion.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/generatedVersion.kt index e454dca..00a0543 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/generatedVersion.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/generatedVersion.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import org.gradle.api.DefaultTask import org.gradle.api.Project diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/internal/project.android.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/project.android.kt similarity index 88% rename from core/src/main/kotlin/com/gradleup/librarian/core/internal/project.android.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/project.android.kt index a2a9dcb..0da5967 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/internal/project.android.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/project.android.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core.internal +package com.gradleup.librarian.gradle.internal import com.android.build.api.dsl.CommonExtension import org.gradle.api.Project diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/internal/project.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/project.kt similarity index 92% rename from core/src/main/kotlin/com/gradleup/librarian/core/internal/project.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/project.kt index 8a96509..8ce23c6 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/internal/project.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/project.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core.internal +package com.gradleup.librarian.gradle.internal import org.gradle.api.Project diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/internal/publishing.android.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/publishing.android.kt similarity index 83% rename from core/src/main/kotlin/com/gradleup/librarian/core/internal/publishing.android.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/publishing.android.kt index c82fe68..585d0bc 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/internal/publishing.android.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/publishing.android.kt @@ -1,9 +1,9 @@ -package com.gradleup.librarian.core.internal +package com.gradleup.librarian.gradle.internal import com.android.build.api.dsl.LibraryExtension import com.android.build.gradle.tasks.SourceJarTask -import com.gradleup.librarian.core.LIBRARIAN_GENERATE_VERSION -import com.gradleup.librarian.core.internal.androidExtension +import com.gradleup.librarian.gradle.LIBRARIAN_GENERATE_VERSION +import com.gradleup.librarian.gradle.internal.androidExtension import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/internal/task/CloseRepoTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CloseRepoTask.kt similarity index 85% rename from core/src/main/kotlin/com/gradleup/librarian/core/internal/task/CloseRepoTask.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CloseRepoTask.kt index 3f0abf6..466b632 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/internal/task/CloseRepoTask.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CloseRepoTask.kt @@ -1,7 +1,7 @@ -package com.gradleup.librarian.core.internal.task +package com.gradleup.librarian.gradle.internal.task -import com.gradleup.librarian.core.SonatypeHost -import com.gradleup.librarian.core.nexusStagingClient +import com.gradleup.librarian.gradle.SonatypeHost +import com.gradleup.librarian.gradle.nexusStagingClient import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout import org.gradle.api.DefaultTask diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/internal/task/CreateRepoTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepoTask.kt similarity index 92% rename from core/src/main/kotlin/com/gradleup/librarian/core/internal/task/CreateRepoTask.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepoTask.kt index 188abe3..14129d4 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/internal/task/CreateRepoTask.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepoTask.kt @@ -1,7 +1,7 @@ -package com.gradleup.librarian.core.internal.task +package com.gradleup.librarian.gradle.internal.task -import com.gradleup.librarian.core.SonatypeHost -import com.gradleup.librarian.core.nexusStagingClient +import com.gradleup.librarian.gradle.SonatypeHost +import com.gradleup.librarian.gradle.nexusStagingClient import kotlinx.coroutines.runBlocking import org.gradle.api.DefaultTask import org.gradle.api.file.RegularFileProperty diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/internal/task/ReleaseRepoTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepoTask.kt similarity index 81% rename from core/src/main/kotlin/com/gradleup/librarian/core/internal/task/ReleaseRepoTask.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepoTask.kt index 9c041da..6470728 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/internal/task/ReleaseRepoTask.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepoTask.kt @@ -1,7 +1,7 @@ -package com.gradleup.librarian.core.internal.task +package com.gradleup.librarian.gradle.internal.task -import com.gradleup.librarian.core.SonatypeHost -import com.gradleup.librarian.core.nexusStagingClient +import com.gradleup.librarian.gradle.SonatypeHost +import com.gradleup.librarian.gradle.nexusStagingClient import kotlinx.coroutines.runBlocking import org.gradle.api.DefaultTask import org.gradle.api.provider.Property diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/kmp.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/kmp.kt similarity index 88% rename from core/src/main/kotlin/com/gradleup/librarian/core/kmp.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/kmp.kt index 160b86c..d9a069e 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/kmp.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/kmp.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/maven.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/maven.kt similarity index 98% rename from core/src/main/kotlin/com/gradleup/librarian/core/maven.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/maven.kt index 0de1788..c05b71b 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/maven.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/maven.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import groovy.util.Node import groovy.util.NodeList diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/module.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/module.kt similarity index 96% rename from core/src/main/kotlin/com/gradleup/librarian/core/module.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/module.kt index 7ddeb91..f59bf29 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/module.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/module.kt @@ -1,6 +1,6 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle -import com.gradleup.librarian.core.internal.findEnvironmentVariable +import com.gradleup.librarian.gradle.internal.findEnvironmentVariable import org.gradle.api.Project import java.util.Properties diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/project.kotlin.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/project.kotlin.kt similarity index 94% rename from core/src/main/kotlin/com/gradleup/librarian/core/project.kotlin.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/project.kotlin.kt index ef96346..6b1a6af 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/project.kotlin.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/project.kotlin.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/publishing.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/publishing.kt similarity index 98% rename from core/src/main/kotlin/com/gradleup/librarian/core/publishing.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/publishing.kt index 7ecdad6..28972d2 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/publishing.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/publishing.kt @@ -1,8 +1,8 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle -import com.gradleup.librarian.core.internal.createAndroidPublication -import com.gradleup.librarian.core.internal.hasAndroid -import com.gradleup.librarian.core.internal.task.CreateRepoTask +import com.gradleup.librarian.gradle.internal.createAndroidPublication +import com.gradleup.librarian.gradle.internal.hasAndroid +import com.gradleup.librarian.gradle.internal.task.CreateRepoTask import net.mbonnin.vespene.lib.NexusStagingClient import org.gradle.api.Project import org.gradle.api.Task diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/root.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/root.kt similarity index 95% rename from core/src/main/kotlin/com/gradleup/librarian/core/root.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/root.kt index f2161a2..521e545 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/root.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/root.kt @@ -1,6 +1,6 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle -import com.gradleup.librarian.core.internal.task.ReleaseRepoTask +import com.gradleup.librarian.gradle.internal.task.ReleaseRepoTask import org.gradle.api.Project import org.gradle.api.publish.maven.MavenPublication diff --git a/core/src/main/kotlin/com/gradleup/librarian/core/signing.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/signing.kt similarity index 97% rename from core/src/main/kotlin/com/gradleup/librarian/core/signing.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/signing.kt index d7a5144..ff6cfda 100644 --- a/core/src/main/kotlin/com/gradleup/librarian/core/signing.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/signing.kt @@ -1,4 +1,4 @@ -package com.gradleup.librarian.core +package com.gradleup.librarian.gradle import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension diff --git a/librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt b/librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt new file mode 100644 index 0000000..44ac54d --- /dev/null +++ b/librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt @@ -0,0 +1,75 @@ +import com.gradleup.librarian.core.tooling.changelogMd +import com.gradleup.librarian.core.tooling.nextVersion +import com.gradleup.librarian.core.tooling.processChangelog +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class ChangelogTest { + @Test + fun process() { + processChangelog(""" + CHANGELOG! + + # Next version (unreleased) + + Bugfix + + # Version 0.0.1 + + Initial release + """.trimIndent().lineSequence(), + "0.0.2" + ).let { + assertEquals(""" + CHANGELOG! + + # Next version (unreleased) + + # Version 0.0.2 + _date_ + + Bugfix + + # Version 0.0.1 + + Initial release + + """.trimIndent(), it.processedChangelog.replaceDate() + ) + + assertEquals(""" + + Bugfix + + + """.trimIndent(), it.versionToReleaseChangelog) + } + } + + @Test + fun missingUnreleased() { + val result = kotlin.runCatching { + processChangelog(""" + # Version 0.0.1 + + Initial release! + + """.trimIndent().lineSequence(), "0.0.2" + ) + } + + assertTrue(result.exceptionOrNull()?.message?.contains("The first H1 heading of $changelogMd must be '# $nextVersion'") == true) + } +} + +private fun String.replaceDate(): String { + return lines().mapIndexed { index: Int, s: String -> + val regex = Regex("_[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}_") + if (regex.matchEntire(s) != null) { + "_date_" + } else { + s + } + }.joinToString("\n") +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 83af0b5..861e5a2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,4 +14,4 @@ pluginManagement { } } -include(":core", ":cli") \ No newline at end of file +include(":librarian-gradle-plugin", ":librarian-cli", ":librarian-core") \ No newline at end of file From 02329a71b74b7993c7b730e64de32f9bb68dea96 Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Mon, 8 Jul 2024 16:58:09 +0200 Subject: [PATCH 2/3] Add support for central portal and update CLI --- README.md | 2 +- gradle/libs.versions.toml | 4 +- librarian-cli/build.gradle.kts | 1 + .../gradleup/librarian/cli/CreateCommand.kt | 214 ++++------------ .../com/gradleup/librarian/cli/InitCommand.kt | 229 ++++++++++++++++++ .../com/gradleup/librarian/cli/MainCommand.kt | 2 +- .../kotlin/com/gradleup/librarian/cli/json.kt | 9 + .../com/gradleup/librarian/cli/license.kt | 26 ++ .../com/gradleup/librarian/cli/process.kt | 13 +- librarian-gradle-plugin/build.gradle.kts | 3 + .../librarian/gradle/LibrarianExtension.kt | 10 + .../librarian/gradle/LibrarianPlugin.kt | 1 + .../librarian/gradle/compatibility.kotlin.kt | 4 +- .../librarian/gradle/compatibility.kt | 11 +- ...ateRepoTask.kt => CreateRepositoryTask.kt} | 16 +- .../internal/task/DeployToPortalTask.kt | 118 +++++++++ .../gradle/internal/task/ReleaseRepoTask.kt | 31 --- ...seRepoTask.kt => ReleaseRepositoryTask.kt} | 13 +- .../gradle/internal/task/UploadFilesTask.kt | 82 +++++++ .../librarian/gradle/internal/task/urls.kt | 30 +++ .../com/gradleup/librarian/gradle/maven.kt | 6 +- .../com/gradleup/librarian/gradle/module.kt | 45 ++-- .../gradleup/librarian/gradle/publishing.kt | 152 +++--------- .../com/gradleup/librarian/gradle/root.kt | 84 ++++--- .../src/test/kotlin/ChangelogTest.kt | 75 ------ .../src/test/kotlin/GradleTest.kt | 73 ++++++ .../testProjects/simple/CHANGELOG.md | 3 + .../testProjects/simple/LICENSE | 21 ++ .../testProjects/simple/build.gradle.kts | 9 + .../testProjects/simple/gradle | 1 + .../testProjects/simple/gradlew | 1 + .../testProjects/simple/gradlew.bat | 1 + .../testProjects/simple/librarian.properties | 18 ++ .../simple/module/build.gradle.kts | 8 + .../src/main/kotlin/com/example/main.kt | 3 + .../testProjects/simple/settings.gradle.kts | 9 + librarian.properties | 2 +- 37 files changed, 871 insertions(+), 459 deletions(-) create mode 100644 librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/InitCommand.kt create mode 100644 librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/json.kt create mode 100644 librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/license.kt create mode 100644 librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianExtension.kt rename librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/{CreateRepoTask.kt => CreateRepositoryTask.kt} (81%) create mode 100644 librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/DeployToPortalTask.kt delete mode 100644 librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepoTask.kt rename librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/{CloseRepoTask.kt => ReleaseRepositoryTask.kt} (70%) create mode 100644 librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/UploadFilesTask.kt create mode 100644 librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/urls.kt delete mode 100644 librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt create mode 100644 librarian-gradle-plugin/src/test/kotlin/GradleTest.kt create mode 100644 librarian-gradle-plugin/testProjects/simple/CHANGELOG.md create mode 100644 librarian-gradle-plugin/testProjects/simple/LICENSE create mode 100644 librarian-gradle-plugin/testProjects/simple/build.gradle.kts create mode 120000 librarian-gradle-plugin/testProjects/simple/gradle create mode 120000 librarian-gradle-plugin/testProjects/simple/gradlew create mode 120000 librarian-gradle-plugin/testProjects/simple/gradlew.bat create mode 100644 librarian-gradle-plugin/testProjects/simple/librarian.properties create mode 100644 librarian-gradle-plugin/testProjects/simple/module/build.gradle.kts create mode 100644 librarian-gradle-plugin/testProjects/simple/module/src/main/kotlin/com/example/main.kt create mode 100644 librarian-gradle-plugin/testProjects/simple/settings.gradle.kts diff --git a/README.md b/README.md index b00be1e..6efef7f 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ librarian.kdoc.olderVersions= librarian.version.packageName=com.apollographql.mockserver # publishing -librarian.sonatype.host=S01 +librarian.sonatype.backend=S01 librarian.pom.groupId=com.apollographql.mockserver librarian.pom.version=0.0.1 librarian.pom.description=Apollo Mockserver diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a60f020..dc1cf28 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,4 +14,6 @@ inquirer = "com.github.kotlin-inquirer:kotlin-inquirer:0.1.0" jsonpath = "com.eygraber:jsonpathkt-kotlinx:3.0.2" okhttp = "com.squareup.okhttp3:okhttp:4.12.0" serialization-json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0" -jansi = "org.fusesource.jansi:jansi:2.4.0" \ No newline at end of file +jansi = "org.fusesource.jansi:jansi:2.4.0" +jsonpathkt = "com.eygraber:jsonpathkt-kotlinx:3.0.2" +mockwebserver = "com.apollographql.mockserver:apollo-mockserver:0.0.3" diff --git a/librarian-cli/build.gradle.kts b/librarian-cli/build.gradle.kts index 44451d2..d964aeb 100644 --- a/librarian-cli/build.gradle.kts +++ b/librarian-cli/build.gradle.kts @@ -15,6 +15,7 @@ dependencies { implementation(libs.inquirer) implementation(libs.jsonpath) implementation(libs.jansi) + implementation(libs.jsonpathkt) implementation(libs.okhttp) implementation(libs.serialization.json) testImplementation(kotlin("test")) diff --git a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt index c6c0fec..6accd52 100644 --- a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt +++ b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/CreateCommand.kt @@ -4,65 +4,21 @@ import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.parameters.arguments.argument import com.github.kinquirer.KInquirer import com.github.kinquirer.components.promptConfirm -import com.github.kinquirer.components.promptInput -import com.github.kinquirer.components.promptList -import com.nfeld.jsonpathkt.kotlinx.resolvePathAsStringOrNull -import kotlinx.serialization.json.Json -import okhttp3.OkHttpClient -import okhttp3.Request import java.io.File -import java.nio.file.Files -import java.nio.file.attribute.PosixFilePermissions internal class CreateCommand : CliktCommand() { private val directory by argument() override fun run() { + requireGh() with(File(directory)) { - check(!exists()) { - "'$directory' already exists" - } - val repositoryName = KInquirer.promptInput(message = "GitHub repository name", File(directory).canonicalFile.name) - val orgs = getAvailableOrganizations() - val repositoryOwner = KInquirer.promptList(message = "GitHub repository owner", orgs) - val developer = "$repositoryName authors" - - val groupId = KInquirer.promptInput("Maven group id", "io.github.$repositoryOwner.$repositoryName") - val sonatypeHost = KInquirer.promptList("Sonatype host", listOf("Default", "S01")) - val moduleName = KInquirer.promptInput("Module name", "module") - - val javaCompatibility = 8 - val kotlinCompatibility = "2.0.0" - - val license = SupportedLicenses.MIT - - mkdirs() - - file("librarian.properties").writeText(""" - java.compatibility=$javaCompatibility - kotlin.compatibility=$kotlinCompatibility - - kdoc.olderVersions= - kdoc.artifactId=kdoc + val gitHubRepository = promptGitHubRepository() + init(gitHubRepository, defaultLicense) - sonatype.host=$sonatypeHost + addLicense(defaultLicense.name, gitHubRepository.name) - git.snapshots=main - - pom.groupId=$groupId - pom.version=0.0.1-SNAPSHOT - pom.description=$repositoryName - pom.vcsUrl=https://github.com/$repositoryOwner/$repositoryName - pom.developer=$developer - pom.license=${license.fullName} - pom.licenseUrl=https://raw.githubusercontent.com/$repositoryOwner/$repositoryName/main/LICENSE - """.trimIndent() - ) - - copyResource(license.name, "LICENSE") copyResource("gitignore", ".gitignore") - copyResource("CHANGELOG.md") - copyResource("gradle.properties") + copyResource("gradle.properties", "gradle.properties") copyResource("codeStyles/codeStyleConfig.xml", ".idea/codeStyles/codeStyleConfig.xml") copyResource("codeStyles/Project.xml", ".idea/codeStyles/Project.xml") @@ -76,39 +32,40 @@ internal class CreateCommand : CliktCommand() { * copied from https://github.com/spring-io/initializr/tree/fbbbe6734e55b4f6393624985c06161b16c9fe8f/initializr-generator-spring/src/main/resources/gradle/8 * TODO: download latest version automatically */ - copyResource("gradlew", "gradlew", true) - copyResource("gradlew.bat", "gradlew.bat", true) - copyResource("gradle/wrapper/gradle-wrapper.jar", "gradle/wrapper/gradle-wrapper.jar") - copyResource("gradle/wrapper/gradle-wrapper.properties", "gradle/wrapper/gradle-wrapper.properties") - - file("gradle").mkdirs() - file("gradle/gradle-wrapper.properties").writeText(""" - distributionBase=GRADLE_USER_HOME - distributionPath=wrapper/dists - distributionUrl=https\://services.gradle.org/distributions/gradle-${latestGradleRelease()}-bin.zip - networkTimeout=10000 - validateDistributionUrl=true - zipStoreBase=GRADLE_USER_HOME - zipStorePath=wrapper/dists - """.trimIndent() - ) - file("gradle/libs.versions.toml").writeText("[libraries]", false) - file("build.gradle.kts").writeText(""" - import com.gradleup.librarian.gradle.librarianRoot - - plugins { - id("org.jetbrains.kotlin.jvm").version("${latestKotlinRelease()}").apply(false) - id("com.gradleup.librarian").version("${latestLibrarianRelease()}").apply(false) + if (resolve("gradlew").exists().not()) { + copyResource("gradlew", "gradlew", true) + copyResource("gradlew.bat", "gradlew.bat", true) + copyResource("gradle/wrapper/gradle-wrapper.jar", "gradle/wrapper/gradle-wrapper.jar") + copyResource("gradle/wrapper/gradle-wrapper.properties", "gradle/wrapper/gradle-wrapper.properties") + } + + if (resolve("gradle/libs.versions.toml").exists().not()) { + resolve("gradle/libs.versions.toml").writeText("[libraries]", false) } - - librarianRoot() - """.trimIndent(), + + println("✅ build.gradle.kts") + resolve("build.gradle.kts").writeText( + """ + import com.gradleup.librarian.gradle.librarianRoot + + plugins { + id("org.jetbrains.kotlin.jvm").version("${latestKotlinRelease()}").apply(false) + id("com.gradleup.librarian").version("${latestLibrarianRelease()}").apply(false) + } + + librarianRoot() + """.trimIndent(), overwrite = false ) - file(moduleName).let { moduleDir -> + val moduleName = "module" + resolve(moduleName).let { moduleDir -> moduleDir.mkdirs() - moduleDir.resolve("build.gradle.kts").writeText(""" + + println("✅ $moduleDir/build.gradle.kts") + + moduleDir.resolve("build.gradle.kts").writeText( + """ import com.gradleup.librarian.gradle.librarianModule plugins { @@ -119,12 +76,18 @@ internal class CreateCommand : CliktCommand() { """.trimIndent() ) - moduleDir.resolve("README.md").writeText(""" + + println("✅ $moduleDir/README.md") + + moduleDir.resolve("README.md").writeText( + """ # Module $moduleName """.trimIndent() ) } - file("settings.gradle.kts").writeText(""" + println("✅ settings.gradle.kts") + resolve("settings.gradle.kts").writeText( + """ pluginManagement { listOf(repositories, dependencyResolutionManagement.repositories).forEach { it.apply { @@ -138,11 +101,15 @@ internal class CreateCommand : CliktCommand() { """.trimIndent(), false ) + print("Initializing git repository...") runCommand("git", "init") runCommand("git", "add", ".") runCommand("git", "commit", "-a", "-m", "initial commit") - val upload = KInquirer.promptConfirm("Upload your project to GitHub at $repositoryOwner/$repositoryName and make it public?", default = true) + val upload = KInquirer.promptConfirm( + "Upload your project to GitHub at ${gitHubRepository.owner}/${gitHubRepository.name} and make it public?", + default = true + ) if (upload) { runCommand("gh", "repo", "create", "--public", "-s", ".", "--push") setupGitHub() @@ -153,90 +120,3 @@ internal class CreateCommand : CliktCommand() { } } -private fun getAvailableOrganizations(): List { - return with(File(".")) { - var result = runCommandAndCaptureStdout("gh", "api", "user", "--jq", ".login") - check(result.code == 0) { - "Cannot run 'gh api user', make sure you have 'gh' installed. See https://cli.github.com/." - } - val username = result.stdout.trim() - result = runCommandAndCaptureStdout("gh", "org", "list") - check(result.code == 0) { - "Cannot run 'gh org list', make sure you have 'gh' installed. See https://cli.github.com/." - } - - listOf(username) + result.stdout.lines().filter { - it.isNotBlank() && !it.startsWith("Showing ") - } - } -} - -private fun File.writeText(text: String, overwrite: Boolean) { - if (exists() && !overwrite) { - return - } - writeText(text) -} - -private fun latestLibrarianRelease(): String = latestTag("GradleUp", "librarian").substring(1) // drop the v -private fun latestKotlinRelease(): String = latestTag("JetBrains", "kotlin").substring(1) // drop the v -private fun latestGradleRelease(): String = latestTag("gradle", "gradle").toGradleRelease() - -private fun latestTag(owner: String, name: String): String { - return Request.Builder() - .get() - .url("https://api.github.com/repos/$owner/$name/releases") - .build() - .let { - OkHttpClient().newCall(it).execute() - }.let { - check(it.isSuccessful) { - "Cannot get ${it.request.url} (${it.code}): ${it.body?.string()}" - } - Json.parseToJsonElement(it.body!!.string()) - }.let { - it.resolvePathAsStringOrNull("$[0].tag_name") ?: "Cannot locate tag_name in response: $it" - } -} - -private fun String.toGradleRelease(): String { - // tag names look like v8.7.0-RC3 - return Regex("v([0-9]*.[0-9]*).[0-9]*(.*)").matchEntire(this).let { - check(it != null) { - "Unexpected tag: '$this" - } - "${it.groupValues.get(1)}${it.groupValues.get(2).lowercase()}" - } -} - -private fun File.copyResource(resourceName: String) { - copyResource(resourceName, resourceName) -} - -private fun File.file(path: String): File = resolve(path) - -private fun File.copyResource(resourceName: String, destinationPath: String, makeExecutable: Boolean = false) { - val stream = CreateCommand::class.java.classLoader.getResourceAsStream(resourceName) - require(stream != null) { - "Cannot open resource '$resourceName'" - } - stream.buffered().use { inputStream -> - file(destinationPath).let { - it.parentFile?.mkdirs() - it.outputStream().use { outputStream -> - inputStream.copyTo(outputStream) - } - } - } - if (makeExecutable) { - Files.setPosixFilePermissions( - file(destinationPath).toPath(), - PosixFilePermissions.fromString("rwxr-xr-x") - ) - } -} - -// See https://spdx.org/licenses/ -enum class SupportedLicenses(val fullName: String) { - MIT("MIT License") -} diff --git a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/InitCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/InitCommand.kt new file mode 100644 index 0000000..d225b6c --- /dev/null +++ b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/InitCommand.kt @@ -0,0 +1,229 @@ +package com.gradleup.librarian.cli + +import com.github.ajalt.clikt.core.CliktCommand +import com.github.kinquirer.KInquirer +import com.github.kinquirer.components.promptConfirm +import com.github.kinquirer.components.promptInput +import com.github.kinquirer.components.promptList +import com.gradleup.librarian.gradle.SonatypeBackend +import com.nfeld.jsonpathkt.kotlinx.resolvePathAsStringOrNull +import kotlinx.serialization.json.Json +import okhttp3.OkHttpClient +import okhttp3.Request +import java.io.File +import java.io.IOException +import java.nio.file.Files +import java.nio.file.attribute.PosixFilePermissions + +internal fun File.addLibrarian( + javaCompatibility: Int, + kotlinCompatibility: String, + sonatypeBackend: SonatypeBackend, + groupId: String, + repositoryOwner: String, + repositoryName: String, + license: SupportedLicense, +) { + val developer = "$repositoryName authors" + + println("✅ librarian.properties") + + resolve("librarian.properties").writeText( + """ + java.compatibility=$javaCompatibility + kotlin.compatibility=$kotlinCompatibility + + kdoc.olderVersions= + kdoc.artifactId=kdoc + + sonatype.backend=$sonatypeBackend + + git.snapshots=main + + pom.groupId=$groupId + pom.version=0.0.1-SNAPSHOT + pom.description=$repositoryName + pom.vcsUrl=https://github.com/$repositoryOwner/$repositoryName + pom.developer=$developer + pom.license=${license.fullName} + pom.licenseUrl=https://raw.githubusercontent.com/$repositoryOwner/$repositoryName/main/LICENSE + """.trimIndent() + ) +} + +internal val javaCompatibility = 8 +internal val kotlinCompatibility = "2.0.0" +internal val defaultLicense = SupportedLicense.MIT + +internal class GitHubRepository(val owner: String, val name: String) + +internal fun requireGh() { + try { + File(".").runCommandAndCaptureStdout("gh", "--version") + } catch (e: IOException) { + throw Exception("Cannot run 'gh --version'. Is it installed? See https://cli.github.com/ for more details.", e) + } +} + +internal fun File.gitHubRepositoryOrNull(): GitHubRepository? { + return runCommandAndCaptureStdout("gh", "repo", "view", "--json", "owner,name") + .let { + if (it.code != 0) { + /* + * Assume it's because we have no GitHub remote in this repository + * XXX: fine tune error handling + */ + return null + } + it.stdout + } + .toJsonElement() + .run { + GitHubRepository( + owner = resolvePathAsStringOrNull("$.owner.login") ?: error("No repository owner found in '${this}'"), + name = resolvePathAsStringOrNull("$.name") ?: error("No repository name found in '${this}'"), + ) + } +} + +internal fun File.promptGitHubRepository(): GitHubRepository { + return GitHubRepository( + KInquirer.promptInput(message = "GitHub repository name", canonicalFile.name), + KInquirer.promptList(message = "GitHub repository owner", getAvailableOrganizations()) + ) +} + +internal fun File.init(repository: GitHubRepository, license: SupportedLicense?) { + var license2 = license + var addLicense = false + if (license2 == null) { + val r = KInquirer.promptConfirm("No LICENSE found. Add a ${defaultLicense.name} license?", default = true) + check(r) { + "librarian requires a LICENSE" + } + license2 = defaultLicense + addLicense = true + } + + require(resolve("librarian.properties").exists().not()) { + "This project already contains a librarian.properties file. Not overwriting." + } + + val groupId = KInquirer.promptInput("Maven group id", "io.github.${repository.owner}.${repository.name}") + val sonatypeBackend = KInquirer.promptList("Sonatype backend", SonatypeBackend.entries.map { it.name }) + + println("Adding files:") + addLibrarian(javaCompatibility, kotlinCompatibility, SonatypeBackend.valueOf(sonatypeBackend), groupId, repository.owner, repository.name, license2) + copyResource("CHANGELOG.md", "CHANGELOG.md") + if (addLicense) { + addLicense(license2.name, repository.name) + } +} + +internal fun File.addLicense(name: String, projectName: String) { + CreateCommand::class.java.classLoader.getResourceAsStream(name)!! + .reader() + .buffered() + .readText() + .replace("__COPYRIGHT_LINE__", "Copyright (c) $projectName authors") + .let { + resolve("LICENSE").writeText(it) + } +} + +internal class InitCommand : CliktCommand() { + override fun run() { + requireGh() + + with(File(".")) { + init(gitHubRepositoryOrNull() ?: promptGitHubRepository(), guessLicense()) + } + } +} + +private fun getAvailableOrganizations(): List { + return with(File(".")) { + + val username = runCommandAndCaptureStdout("gh", "api", "user", "--jq", ".login").stdoutOrThrow().trim() + val organisations = runCommandAndCaptureStdout("gh", "org", "list").stdoutOrThrow().lines().filter { + it.isNotBlank() && !it.startsWith("Showing ") + } + listOf(username) + organisations + } +} + +internal fun File.writeText(text: String, overwrite: Boolean) { + if (exists() && !overwrite) { + return + } + writeText(text) +} + +internal fun latestLibrarianRelease(): String = latestTag("GradleUp", "librarian").substring(1) // drop the v +internal fun latestKotlinRelease(): String = latestTag("JetBrains", "kotlin").substring(1) // drop the v + +private fun latestTag(owner: String, name: String): String { + return Request.Builder() + .get() + .url("https://api.github.com/repos/$owner/$name/releases") + .build() + .let { + OkHttpClient().newCall(it).execute() + }.let { + check(it.isSuccessful) { + "Cannot get ${it.request.url} (${it.code}): ${it.body?.string()}" + } + Json.parseToJsonElement(it.body!!.string()) + }.let { + it.resolvePathAsStringOrNull("$[0].tag_name") ?: "Cannot locate tag_name in response: $it" + } +} + +private fun String.toGradleRelease(): String { + // tag names look like v8.7.0-RC3 + return Regex("v([0-9]*.[0-9]*).[0-9]*(.*)").matchEntire(this).let { + check(it != null) { + "Unexpected tag: '$this" + } + "${it.groupValues.get(1)}${it.groupValues.get(2).lowercase()}" + } +} + + +internal fun File.copyResource( + resourceName: String, + destinationPath: String, + makeExecutable: Boolean = false, + overwrite: Boolean = false, +) { + val destination = resolve(destinationPath) + if (!overwrite && destination.exists()) { + return + } + + println("✅ ${destination.name}") + + val stream = CreateCommand::class.java.classLoader.getResourceAsStream(resourceName) + require(stream != null) { + "Cannot open resource '$resourceName'" + } + stream.buffered().use { inputStream -> + destination.let { + it.parentFile?.mkdirs() + it.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + } + } + if (makeExecutable) { + Files.setPosixFilePermissions( + resolve(destinationPath).toPath(), + PosixFilePermissions.fromString("rwxr-xr-x") + ) + } +} + +// See https://spdx.org/licenses/ +internal enum class SupportedLicense(val fullName: String) { + MIT("MIT License") +} diff --git a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt index ea7ec49..ba73743 100644 --- a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt +++ b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/MainCommand.kt @@ -5,7 +5,7 @@ import com.github.ajalt.clikt.core.subcommands internal class MainCommand: CliktCommand() { init { - subcommands(PrepareReleaseCommand(), CreateCommand(), ReleaseCommand(), SetupGithubCommand()) + subcommands(PrepareReleaseCommand(), CreateCommand(), ReleaseCommand(), SetupGithubCommand(), InitCommand()) } override fun run() { diff --git a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/json.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/json.kt new file mode 100644 index 0000000..58f7f0e --- /dev/null +++ b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/json.kt @@ -0,0 +1,9 @@ +package com.gradleup.librarian.cli + +import kotlinx.serialization.json.Json + +internal val json = Json + +fun String.toJsonElement() = json.parseToJsonElement(this) + + diff --git a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/license.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/license.kt new file mode 100644 index 0000000..a2ed375 --- /dev/null +++ b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/license.kt @@ -0,0 +1,26 @@ +package com.gradleup.librarian.cli + +import java.io.File + +internal fun File.guessLicense(): SupportedLicense? { + listFiles()?.forEach { + require(!it.name.startsWith("LICENSE.")) { + "The LICENSE file must not have an extension (found '${it.path}'). Please rename your LICENSE file" + } + } + + resolve("LICENSE").apply { + if (!exists()) { + return null + } + useLines { + it.take(5).forEach { line -> + if (line.contains("MIT License")) { + return SupportedLicense.MIT + } + } + } + } + + error("Cannot guess license") +} \ No newline at end of file diff --git a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt index 291582a..e72db8e 100644 --- a/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt +++ b/librarian-cli/src/main/kotlin/com/gradleup/librarian/cli/process.kt @@ -18,9 +18,18 @@ internal fun File.runCommand(vararg arg: String) { internal class ProcessResult( + private val command: String, val code: Int, val stdout: String -) +) { + fun stdoutOrThrow(): String { + check(code == 0) { + "Cannot run '$command' ($code):\n$stdout" + } + + return stdout + } +} internal fun File.runCommandAndCaptureStdout(vararg args: String): ProcessResult { val builder = ProcessBuilder(*args) @@ -31,5 +40,5 @@ internal fun File.runCommandAndCaptureStdout(vararg args: String): ProcessResult val ret = process.waitFor() val output = process.inputStream.bufferedReader().readText() - return ProcessResult(ret, output) + return ProcessResult(args.joinToString(" "), ret, output) } diff --git a/librarian-gradle-plugin/build.gradle.kts b/librarian-gradle-plugin/build.gradle.kts index 617e3d1..5eee626 100644 --- a/librarian-gradle-plugin/build.gradle.kts +++ b/librarian-gradle-plugin/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { implementation(libs.coroutines) implementation(libs.vespene) implementation(libs.maven.sympathy) + implementation(libs.okhttp) api(libs.dokkatoo) api(libs.bcv) @@ -20,6 +21,8 @@ dependencies { compileOnly(libs.kgp) testImplementation(kotlin("test")) + testImplementation(gradleTestKit()) + testImplementation(libs.mockwebserver) } configurations.getByName("api").dependencies.removeIf { diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianExtension.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianExtension.kt new file mode 100644 index 0000000..1d09762 --- /dev/null +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianExtension.kt @@ -0,0 +1,10 @@ +package com.gradleup.librarian.gradle + +import org.gradle.api.Project + +abstract class LibrarianExtension(private val project: Project) { + fun root() = project.librarianRoot() + + @JvmOverloads + fun module(publish: Boolean = true) = project.librarianModule(publish) +} \ No newline at end of file diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianPlugin.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianPlugin.kt index 62a2757..c56e3a5 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianPlugin.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/LibrarianPlugin.kt @@ -8,5 +8,6 @@ import org.gradle.api.Project */ class LibrarianPlugin: Plugin { override fun apply(target: Project) { + target.extensions.create("librarian", LibrarianExtension::class.java, target) } } \ No newline at end of file diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kotlin.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kotlin.kt index 04bc4f6..e40c9bd 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kotlin.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kotlin.kt @@ -15,12 +15,12 @@ internal fun Project.configureKotlinJvmTarget(javaVersion: JavaVersion) { if (kotlin == null) { return } - kotlin.forEachCompilerOptions { + kotlin.forEachCompilerOptions { platformType -> when (this) { is KotlinJvmCompilerOptions -> { val version = javaVersion.toInt() - if (it != KotlinPlatformType.androidJvm) { + if (platformType != KotlinPlatformType.androidJvm) { // See https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/JavaCompileUtils.kt;l=410?q=Using%20%27--release%27%20option%20for%20JavaCompile%20is%20not%20supported%20because%20it%20prevents%20the%20Android%20Gradle%20plugin freeCompilerArgs.add("-Xjdk-release=${version}") } diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kt index 26ac21f..d895a59 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/compatibility.kt @@ -48,11 +48,16 @@ fun Project.configureKotlinCompatibility( } internal fun Project.configureJavaCompatibilityInternal(javaVersion: JavaVersion) { - tasks.withType(JavaCompile::class.java) { - it.options.release.set(javaVersion.majorVersion.toInt()) - } if (hasAndroid) { androidJavaVersion(javaVersion) + tasks.withType(JavaCompile::class.java) { + it.sourceCompatibility = javaVersion.toString() + it.targetCompatibility = javaVersion.toString() + } + } else { + tasks.withType(JavaCompile::class.java) { + it.options.release.set(javaVersion.majorVersion.toInt()) + } } configureKotlinJvmTarget(javaVersion) } diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepoTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepositoryTask.kt similarity index 81% rename from librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepoTask.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepositoryTask.kt index 14129d4..2137597 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepoTask.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CreateRepositoryTask.kt @@ -1,6 +1,6 @@ package com.gradleup.librarian.gradle.internal.task -import com.gradleup.librarian.gradle.SonatypeHost +import com.gradleup.librarian.gradle.SonatypeBackend import com.gradleup.librarian.gradle.nexusStagingClient import kotlinx.coroutines.runBlocking import org.gradle.api.DefaultTask @@ -11,7 +11,7 @@ import org.gradle.api.tasks.Optional import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -abstract class CreateRepoTask: DefaultTask() { +abstract class CreateRepositoryTask: DefaultTask() { @get:Input @get:Optional abstract val username: Property @@ -21,7 +21,10 @@ abstract class CreateRepoTask: DefaultTask() { abstract val password: Property @get:Input - abstract val sonatypeHost: Property + abstract val baseUrl: Property + + @get:Input + abstract val version: Property @get:Input abstract val groupId: Property @@ -48,8 +51,13 @@ abstract class CreateRepoTask: DefaultTask() { if (!password.isPresent) { error("No sonatype password found, double check your LIBRARIAN_SONATYPE_PASSWORD environment variable") } + + check(version.get().endsWith("-SNAPSHOT").not()) { + "Cannot deploy a SNAPSHOT version ('${version.get()}') to the central portal)." + } + val repoId = runBlocking { - val nexusStagingClient = nexusStagingClient(sonatypeHost.get(), username.get(), password.get()) + val nexusStagingClient = nexusStagingClient(baseUrl.get(), username.get(), password.get()) val candidates = nexusStagingClient.getProfiles() val profileId = when { candidates.isEmpty() -> error("No staging profile found") diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/DeployToPortalTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/DeployToPortalTask.kt new file mode 100644 index 0000000..99a6e7a --- /dev/null +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/DeployToPortalTask.kt @@ -0,0 +1,118 @@ +package com.gradleup.librarian.gradle.internal.task + +import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody +import okio.Buffer +import okio.BufferedSink +import okio.Timeout +import okio.buffer +import okio.use +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.FileCollection +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.TaskAction +import java.io.IOException +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream +import kotlin.math.sin + +abstract class DeployToPortalTask : DefaultTask() { + @get:Input + @get:Optional + abstract val username: Property + + @get:Input + @get:Optional + abstract val password: Property + + @get:Input + abstract val version: Property + + @get:Input + abstract val baseUrl: Property + + @get:Input + abstract val deploymentDescription: Property + + @get:InputFiles + abstract val files: ConfigurableFileCollection + + @get:Input + abstract val automatic: Property + + @TaskAction + fun taskAction() { + if (!username.isPresent) { + error("No sonatype username found, double check your LIBRARIAN_SONATYPE_USERNAME environment variable") + } + if (!password.isPresent) { + error("No sonatype password found, double check your LIBRARIAN_SONATYPE_PASSWORD environment variable") + } + + val username = username.get() + val password = password.get() + + check(version.get().endsWith("-SNAPSHOT").not()) { + "Cannot deploy a SNAPSHOT version ('${version.get()}') to the central portal)." + } + val token = "$username:$password".let { + Buffer().writeUtf8(it).readByteString().base64() + } + + val body = MultipartBody.Builder() + .addFormDataPart( + "bundle", + deploymentDescription.get(), + MyBody(files) + ) + .build() + + val publicationType = if (automatic.get()) "AUTOMATIC" else "USER_MANAGED" + + Request.Builder() + .post(body) + .addHeader("Authorization", "UserToken $token") + .url("${baseUrl.get()}/api/v1/publisher/upload?publishingType=$publicationType") + .build() + .let { + try { + OkHttpClient.Builder() + .build() + .newCall(it).execute() + } catch (e: IOException) { + throw Exception("Cannot publish to maven central", e) + } + }.use { + if (!it.isSuccessful) { + error("Cannot publish to maven central (status='${it.code}'): ${it.body?.string()}") + } + } + } +} + +internal class MyBody(val files: FileCollection) : RequestBody() { + override fun contentType(): MediaType { + return "application/zip".toMediaType() + } + + override fun writeTo(sink: BufferedSink) { + val stream = ZipOutputStream(sink.outputStream()) + files.toInputFiles().forEach { + stream.putNextEntry(ZipEntry(it.path)) + it.file.inputStream().use { + it.copyTo(stream) + } + stream.closeEntry() + } + stream.flush() + sink.flush() + } +} \ No newline at end of file diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepoTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepoTask.kt deleted file mode 100644 index 6470728..0000000 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepoTask.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.gradleup.librarian.gradle.internal.task - -import com.gradleup.librarian.gradle.SonatypeHost -import com.gradleup.librarian.gradle.nexusStagingClient -import kotlinx.coroutines.runBlocking -import org.gradle.api.DefaultTask -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction - -abstract class ReleaseRepoTask: DefaultTask() { - @get:Input - abstract val username: Property - - @get:Input - abstract val password: Property - - @get:Input - abstract val host: Property - - @get:Input - abstract val repoId: Property - - @TaskAction - fun taskAction() { - runBlocking { - val nexusStagingClient = nexusStagingClient(host.get(), username.get(), password.get()) - nexusStagingClient.releaseRepositories(listOf(repoId.get()), true) - } - } -} \ No newline at end of file diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CloseRepoTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepositoryTask.kt similarity index 70% rename from librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CloseRepoTask.kt rename to librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepositoryTask.kt index 466b632..9046c83 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/CloseRepoTask.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/ReleaseRepositoryTask.kt @@ -1,6 +1,5 @@ package com.gradleup.librarian.gradle.internal.task -import com.gradleup.librarian.gradle.SonatypeHost import com.gradleup.librarian.gradle.nexusStagingClient import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout @@ -11,7 +10,7 @@ import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction import kotlin.time.Duration.Companion.minutes -abstract class CloseRepoTask: DefaultTask() { +abstract class ReleaseRepositoryTask: DefaultTask() { @get:Input abstract val username: Property @@ -19,21 +18,27 @@ abstract class CloseRepoTask: DefaultTask() { abstract val password: Property @get:Input - abstract val host: Property + abstract val baseUrl: Property @get:Input abstract val repoId: Property + @get:Input + abstract val automatic: Property + @TaskAction fun taskAction() { runBlocking { - val nexusStagingClient = nexusStagingClient(host.get(), username.get(), password.get()) + val nexusStagingClient = nexusStagingClient(baseUrl.get(), username.get(), password.get()) nexusStagingClient.closeRepositories(listOf(repoId.get())) withTimeout(30.minutes) { nexusStagingClient.waitForClose(repoId.get(), 1000) { logger.log(LogLevel.INFO, ".") } } + if (automatic.get()) { + nexusStagingClient.releaseRepositories(listOf(repoId.get()), true) + } } } } \ No newline at end of file diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/UploadFilesTask.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/UploadFilesTask.kt new file mode 100644 index 0000000..1dc0718 --- /dev/null +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/UploadFilesTask.kt @@ -0,0 +1,82 @@ +package com.gradleup.librarian.gradle.internal.task + +import kotlinx.coroutines.runBlocking +import net.mbonnin.vespene.lib.OkHttpClient +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Request +import okhttp3.RequestBody.Companion.asRequestBody +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.FileCollection +import org.gradle.api.logging.Logger +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.TaskAction +import java.io.File +import java.io.IOException + +abstract class UploadFilesTask : DefaultTask() { + @get:Input + abstract val username: Property + + @get:Input + abstract val password: Property + + @get:Input + abstract val url: Property + + @get:InputFiles + abstract val files: ConfigurableFileCollection + + @TaskAction + fun taskAction() { + runBlocking { + uploadNexus(logger, url.get(), username.get(), password.get(), files) + } + } +} + +internal class InputFile(val file: File, val path: String) + +internal fun FileCollection.toInputFiles(): List { + val inputFiles = mutableListOf() + + asFileTree.visit { + if (it.file.isFile) { + inputFiles.add(InputFile(it.file, it.path)) + } + } + + return inputFiles +} + +private fun uploadNexus( + logger: Logger, + url: String, + username: String, + password: String, + files: FileCollection, +) { + val okHttpClient = OkHttpClient(username, password) + files.toInputFiles().forEachIndexed { index, inputFile -> + // add progress + // See https://github.com/gradle/gradle/issues/3654 + val fileUrl = "${url}/${inputFile.path}" + logger.info("Uploading $fileUrl") + + val request = Request.Builder() + .put(inputFile.file.asRequestBody("application/octet-stream".toMediaType())) + .url(fileUrl) + .build() + + try { + val uploadResponse = okHttpClient.newCall(request).execute() + check(uploadResponse.isSuccessful) { + "Cannot put $fileUrl (${uploadResponse.code}):\n${uploadResponse.body?.string()}" + } + } catch (e: IOException) { + throw Exception("Error while uploading $fileUrl", e) + } + } +} \ No newline at end of file diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/urls.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/urls.kt new file mode 100644 index 0000000..df5ddef --- /dev/null +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/internal/task/urls.kt @@ -0,0 +1,30 @@ +package com.gradleup.librarian.gradle.internal.task + +import com.gradleup.librarian.gradle.SonatypeBackend +import com.gradleup.librarian.gradle.toBaseUrl + +internal fun stagingRepositoryUrl(sonatypeBackend: SonatypeBackend, baseUrl: String?, repoId: String): String { + check(sonatypeBackend != SonatypeBackend.Portal) { + "The Central portal does not have a staging url" + } + return "${baseUrl ?: sonatypeBackend.toBaseUrl()}/service/local/staging/deployByRepositoryId/${repoId}/" +} + +internal fun stagingBaseUrl(sonatypeBackend: SonatypeBackend, baseUrl: String?): String { + check(sonatypeBackend != SonatypeBackend.Portal) { + "The Central portal does not have a staging url" + } + return baseUrl ?: sonatypeBackend.toBaseUrl() +} + +internal fun snapshotsUrl(sonatypeBackend: SonatypeBackend, baseUrl: String?): String { + check(sonatypeBackend != SonatypeBackend.Portal) { + "The Central portal does not support snapshots" + } + return "${baseUrl ?: sonatypeBackend.toBaseUrl()}/content/repositories/snapshots/" +} + +internal fun deployBaseUrl(baseUrl: String?): String { + return baseUrl ?: "https://central.sonatype.com" +} + diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/maven.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/maven.kt index c05b71b..0a0f8c5 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/maven.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/maven.kt @@ -18,7 +18,11 @@ fun Project.publishPlatformArtifactsInRootModule() = afterEvaluate { } val platformPublication = extensions.getByType(PublishingExtension::class.java) .publications - .getByName("jvm") as MavenPublication + .findByName("jvm") as MavenPublication? + + if (platformPublication == null) { + return@afterEvaluate + } lateinit var platformXml: XmlProvider platformPublication.pom?.withXml { platformXml = it } diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/module.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/module.kt index f59bf29..9e69b13 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/module.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/module.kt @@ -26,7 +26,7 @@ internal fun Properties.kdocArtifactId(): String { internal fun Properties.olderVersions(): List { return getProperty("kdoc.olderVersions")?.split(",") - .orEmpty() + .orEmpty() .filter { it.isNotEmpty() } @@ -39,7 +39,6 @@ fun Project.configureMavenFriendlyDependencies() { pluginManager.apply("com.gradleup.maven-sympathy") } - internal fun Project.rootProperties(): Properties { val propertiesFile = rootProject.file("librarian.properties") check(propertiesFile.exists()) { @@ -55,7 +54,7 @@ internal fun Project.rootProperties(): Properties { internal fun Project.moduleProperties(): Properties { val propertiesFile = file("librarian.properties") - if(!propertiesFile.exists()) { + if (!propertiesFile.exists()) { return Properties() } @@ -66,7 +65,7 @@ internal fun Project.moduleProperties(): Properties { } } -fun Project.librarianModule() { +fun Project.librarianModule(publish: Boolean) { val rootProperties = rootProperties() val moduleProperties = moduleProperties() @@ -84,15 +83,26 @@ fun Project.librarianModule() { configureGeneratedVersion(it, pomMetadata.version) } - configureDokkatoo() + if (publish) { + configureDokkatoo() - configurePublishing( - createMissingPublications = true, - publishPlatformArtifactsInRootModule = true, - pomMetadata = pomMetadata, - sonatype = Sonatype(project, rootProperties), - signing = Signing(project, rootProperties) - ) + configurePublishing( + createMissingPublications = true, + publishPlatformArtifactsInRootModule = true, + pomMetadata = pomMetadata, + signing = Signing(project, rootProperties) + ) + } +} + +private fun String.toSonatypeHost(): SonatypeBackend { + SonatypeBackend.entries.forEach { + if (it.name == this) { + return it + } + } + + error("You must set sonatype.backend to one of: '${SonatypeBackend.entries.joinToString(",")}'") } internal fun Sonatype(project: Project, properties: Properties): Sonatype { @@ -102,13 +112,20 @@ internal fun Sonatype(project: Project, properties: Properties): Sonatype { return Sonatype( username = project.findEnvironmentVariable(usernameVariable), password = project.findEnvironmentVariable(passwordVariable), - host = SonatypeHost.valueOf(properties.getRequiredProperty("sonatype.host")) + backend = properties.getRequiredProperty("sonatype.backend").toSonatypeHost(), + release = properties.getProperty("sonatype.release").toSonatypeRelease(), + baseUrl = properties.getProperty("sonatype.baseUrl")?.takeIf { it.isNotBlank() } ) } +private fun String?.toSonatypeRelease(): SonatypeRelease { + return SonatypeRelease.entries.firstOrNull { it.name == this } ?: SonatypeRelease.Automatic +} + internal fun Signing(project: Project, properties: Properties): Signing { val usernameVariable = properties.getProperty("signing.privateKey.environmentVariable") ?: "LIBRARIAN_SIGNING_PRIVATE_KEY" - val passwordVariable = properties.getProperty("signing.privateKeyPassword.environmentVariable") ?: "LIBRARIAN_SIGNING_PRIVATE_KEY_PASSWORD" + val passwordVariable = + properties.getProperty("signing.privateKeyPassword.environmentVariable") ?: "LIBRARIAN_SIGNING_PRIVATE_KEY_PASSWORD" return Signing( privateKey = project.findEnvironmentVariable(usernameVariable), privateKeyPassword = project.findEnvironmentVariable(passwordVariable) diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/publishing.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/publishing.kt index 28972d2..db6d702 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/publishing.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/publishing.kt @@ -2,42 +2,41 @@ package com.gradleup.librarian.gradle import com.gradleup.librarian.gradle.internal.createAndroidPublication import com.gradleup.librarian.gradle.internal.hasAndroid -import com.gradleup.librarian.gradle.internal.task.CreateRepoTask import net.mbonnin.vespene.lib.NexusStagingClient import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.UnknownTaskException import org.gradle.api.artifacts.dsl.DependencyHandler -import org.gradle.api.artifacts.dsl.RepositoryHandler import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.provider.Provider import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven -import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.jvm.tasks.Jar -import java.util.Date import java.util.Properties -internal const val CONFIGURATION_REPO_ID = "librarianRepoId" -internal const val CONFIGURATION_RELEASE_DATE = "librarianReleaseDate" -internal const val CONFIGURATION_SNAPSHOT_DATE = "librarianSnapshotDate" +internal const val librarianPublication = "librarianPublication" internal fun Project.configurePublishingInternal(block: PublishingExtension.() -> Unit) { plugins.apply("maven-publish") block(extensions.getByType(PublishingExtension::class.java)) } -enum class SonatypeHost { +enum class SonatypeBackend { Default, S01, + Portal +} + +enum class SonatypeRelease { + Automatic, + Manual } class Sonatype( val username: String?, val password: String?, - val host: SonatypeHost, + val backend: SonatypeBackend, + val release: SonatypeRelease, + val baseUrl: String? ) fun PomMetadata(artifactId: String, properties: Properties): PomMetadata { @@ -75,7 +74,6 @@ fun Project.configurePublishing( createMissingPublications: Boolean, publishPlatformArtifactsInRootModule: Boolean, pomMetadata: PomMetadata, - sonatype: Sonatype, signing: Signing, ) { if (createMissingPublications) { @@ -87,59 +85,32 @@ fun Project.configurePublishing( } configureSigning(signing) - val repoIdConfiguration = configurations.detachedConfiguration( - dependencies.project(rootProject.path, CONFIGURATION_REPO_ID) - ) - + val librarianRepository = layout.buildDirectory.dir("librarian/repo").get() extensions.getByType(PublishingExtension::class.java).apply { repositories { - it.mavenSonatypeSnapshot(sonatype) - it.mavenSonatypeStaging(sonatype = sonatype, repoIdConfiguration.elements.map { - val repoId = it.single().asFile.readText() - "${sonatype.host.toBaseUrl()}/service/local/staging/deployByRepositoryId/$repoId/" - }) - } - } - - tasks.configureEach { - if (it is AbstractPublishToMaven) { - if (it.name.endsWith("SonatypeStagingRepository")) { - // We need that to avoid error like this: - // Querying the mapped value of provider(java.util.Set) before task ':librarianCreateStagingRepo' has completed is not supported - it.inputs.files(repoIdConfiguration) - } else if (it.name.endsWith("SonatypeSnapshotsRepository")) { - it.enabled = pomMetadata.version.endsWith("-SNAPSHOT") + it.maven { + it.name = "librarian" + it.setUrl(uri(librarianRepository.asFile.path)) } } } - val releaseConfiguration = configurations.create(CONFIGURATION_RELEASE_DATE) { - it.isVisible = false - } - val snapshotConfiguration = configurations.create(CONFIGURATION_SNAPSHOT_DATE) { + val librarianPublication = configurations.create(librarianPublication) { it.isVisible = false } - tasks.named("publishAllPublicationsToSonatypeStagingRepository").apply { - configure { task -> - task.outputs.file(layout.buildDirectory.file("${task.name}Date.txt")) - task.doLast { - it.outputs.files.singleFile.writeText("${it.name}: ${Date()}") - } - } - artifacts { - it.add(releaseConfiguration.name, this) + val librarianCleanup = tasks.register("librarianCleanup") { + it.doLast { + librarianRepository.asFile.deleteRecursively() } } - tasks.named("publishAllPublicationsToSonatypeSnapshotsRepository").apply { - configure { task -> - task.outputs.file(layout.buildDirectory.file("${task.name}Date.txt")) - task.doLast { - it.outputs.files.singleFile.writeText("${it.name}: ${Date()}") - } - } - artifacts { - it.add(snapshotConfiguration.name, this) + tasks.withType(AbstractPublishToMaven::class.java).configureEach { + it.dependsOn(librarianCleanup) + } + + artifacts { + it.add(librarianPublication.name, librarianRepository) { + it.builtBy("publishAllPublicationsToLibrarianRepository") } } } @@ -237,15 +208,6 @@ fun Project.createMissingPublications( } } -fun Project.configureRepositoriesRoot(sonatype: Sonatype, createRepoTask: TaskProvider) = configurePublishingInternal { - repositories { - it.mavenSonatypeSnapshot(sonatype) - it.mavenSonatypeStaging(sonatype = sonatype, createRepoTask.map { - val repoId = it.output.asFile.get().readText() - "${sonatype.host.toBaseUrl()}/service/local/staging/deployByRepositoryId/$repoId/" - }) - } -} /** * Configures pom * @@ -305,73 +267,23 @@ fun Project.configurePom( } } -internal fun SonatypeHost.toBaseUrl(): String { +internal fun SonatypeBackend.toBaseUrl(): String { return when (this) { - SonatypeHost.S01 -> "https://s01.oss.sonatype.org" - SonatypeHost.Default -> "https://oss.sonatype.org" - } -} - -private fun RepositoryHandler.mavenSonatypeSnapshot( - sonatype: Sonatype, -) = maven { - it.name = "SonatypeSnapshots" - it.setUrl("${sonatype.host.toBaseUrl()}/content/repositories/snapshots/") - it.credentials { - it.username = sonatype.username - it.password = sonatype.password + SonatypeBackend.S01 -> "https://s01.oss.sonatype.org" + SonatypeBackend.Default -> "https://oss.sonatype.org" + SonatypeBackend.Portal -> TODO() } } -internal fun RepositoryHandler.mavenSonatypeStaging( - sonatype: Sonatype, - url: Provider, -) = maven { - it.name = "SonatypeStaging" - it.setUrl(url) - it.credentials { - it.username = sonatype.username - it.password = sonatype.password - } -} - -internal fun TaskContainer.providerByName(name: String): TaskProvider? { - return try { - this.named(name) - } catch (e: UnknownTaskException) { - null - } -} internal fun DependencyHandler.project(path: String, configuration: String) = project( mapOf("path" to path, "configuration" to configuration) ) -internal fun Project.registerCreateRepoIdTask( - sonatype: Sonatype, - group: String, - version: String, -): TaskProvider { - return rootProject.tasks.register("librarianCreateStagingRepo", CreateRepoTask::class.java) { - it.output.set(rootProject.layout.buildDirectory.file("librarianRepoId")) - it.repoDescription.set("$group:${project.name}:$version") - it.sonatypeHost.set(sonatype.host) - it.groupId.set(group) - it.username.set(sonatype.username) - it.password.set(sonatype.password) - } -} - -internal fun nexusStagingClient(host: SonatypeHost, username: String, password: String): NexusStagingClient { +internal fun nexusStagingClient(host: String, username: String, password: String): NexusStagingClient { return NexusStagingClient( - baseUrl = "${host.toBaseUrl()}/service/local/", + baseUrl = "${host}/service/local/", username = username, password = password ) } - -fun TaskProvider.dependsOn(other: Any) { - configure { - it.dependsOn(other) - } -} diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/root.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/root.kt index 521e545..3ed02aa 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/root.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/root.kt @@ -1,6 +1,8 @@ package com.gradleup.librarian.gradle -import com.gradleup.librarian.gradle.internal.task.ReleaseRepoTask +import com.gradleup.librarian.gradle.internal.task.* +import com.gradleup.librarian.gradle.internal.task.snapshotsUrl +import com.gradleup.librarian.gradle.internal.task.stagingRepositoryUrl import org.gradle.api.Project import org.gradle.api.publish.maven.MavenPublication @@ -22,52 +24,70 @@ fun Project.librarianRoot() { } } configurePom(pomMetadata) - - val createRepoTask = registerCreateRepoIdTask(sonatype, pomMetadata.groupId, pomMetadata.version) - - val configuration = configurations.create(CONFIGURATION_REPO_ID) { - it.isCanBeConsumed = true - it.isVisible = false - } - artifacts.add(configuration.name, createRepoTask) - - configureRepositoriesRoot(sonatype, createRepoTask) configureSigning(signing) - val publishToStaging = tasks.register("librarianPublishToStaging") - val publishToSnapshots = tasks.register("librarianPublishToSnapshots") { - it.enabled = pomMetadata.version.endsWith("-SNAPSHOT") + val deploymentDescription = "${pomMetadata.groupId}:${project.name}:${pomMetadata.version}" + val createRepoTask = tasks.register("librarianCreateStagingRepo", CreateRepositoryTask::class.java) { + it.output.set(layout.buildDirectory.file("librarian/repositoryId")) + it.repoDescription.set(deploymentDescription) + it.baseUrl.set(stagingBaseUrl(sonatype.backend, sonatype.baseUrl)) + it.groupId.set(pomMetadata.groupId) + it.username.set(sonatype.username) + it.password.set(sonatype.password) + it.version.set(pomMetadata.version) } - val releaseConfiguration = configurations.detachedConfiguration() - val snapshotConfiguration = configurations.detachedConfiguration() - + val allFilesConfiguration = configurations.detachedConfiguration() subprojects { - releaseConfiguration.dependencies.add(dependencies.project(it.path, CONFIGURATION_RELEASE_DATE)) - snapshotConfiguration.dependencies.add(dependencies.project(it.path, CONFIGURATION_SNAPSHOT_DATE)) + allFilesConfiguration.dependencies.add(dependencies.project(it.path, librarianPublication)) } + val allFiles = allFilesConfiguration.incoming.artifactView { it.lenient(true) }.files - publishToStaging.configure { - it.inputs.files(releaseConfiguration.incoming.artifactView { it.lenient(true) }.files) - } - publishToSnapshots.configure { - it.inputs.files(snapshotConfiguration.incoming.artifactView { it.lenient(true) }.files) + val repoId = createRepoTask.map { it.output.get().asFile.readText() } + + val uploadToStaging = tasks.register("librarianUploadFilesToStaging", UploadFilesTask::class.java) { + it.url.set(repoId.map { stagingRepositoryUrl(sonatype.backend, sonatype.baseUrl, it) }) + it.username.set(sonatype.username) + it.password.set(sonatype.password) + it.files.from(allFiles) } - val repoId = createRepoTask.map { it.output.get().asFile.readText() } - val closeRepoTask = tasks.register("librarianCloseStagingRepo", ReleaseRepoTask::class.java) { - it.host.set(sonatype.host) + tasks.register("librarianReleaseRepository", ReleaseRepositoryTask::class.java) { + it.baseUrl.set(stagingBaseUrl(sonatype.backend, sonatype.baseUrl)) it.username.set(sonatype.username) it.password.set(sonatype.password) it.repoId.set(repoId) - it.dependsOn(publishToStaging) + it.automatic.set(sonatype.release == SonatypeRelease.Automatic) + it.dependsOn(uploadToStaging) } - tasks.register("librarianReleaseStagingRepo", ReleaseRepoTask::class.java) { - it.host.set(sonatype.host) + val uploadToSnapshots = tasks.register("librarianUploadFilesToSnapshots", UploadFilesTask::class.java) { + it.url.set(snapshotsUrl(sonatype.backend, sonatype.baseUrl)) it.username.set(sonatype.username) it.password.set(sonatype.password) - it.repoId.set(repoId) - it.dependsOn(closeRepoTask) + it.files.from(allFiles) + + it.enabled = pomMetadata.version.endsWith("-SNAPSHOT") + } + + val deployToPortal = tasks.register("librarianDeployToPortal", DeployToPortalTask::class.java) { + it.username.set(sonatype.username) + it.password.set(sonatype.password) + it.files.from(allFiles) + it.deploymentDescription.set(deploymentDescription) + it.automatic.set(SonatypeRelease.Automatic == sonatype.release) + it.version.set(pomMetadata.version) + it.baseUrl.set(deployBaseUrl(sonatype.baseUrl)) + } + + tasks.register("librarianPublishToMavenCentral") { + if (sonatype.backend == SonatypeBackend.Portal) { + it.dependsOn("librarianDeployToPortal") + } else { + it.dependsOn("librarianReleaseRepository") + } + } + tasks.register("librarianPublishToMavenSnapshots") { + it.dependsOn("librarianUploadFilesToSnapshots") } } diff --git a/librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt b/librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt deleted file mode 100644 index 44ac54d..0000000 --- a/librarian-gradle-plugin/src/test/kotlin/ChangelogTest.kt +++ /dev/null @@ -1,75 +0,0 @@ -import com.gradleup.librarian.core.tooling.changelogMd -import com.gradleup.librarian.core.tooling.nextVersion -import com.gradleup.librarian.core.tooling.processChangelog -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -class ChangelogTest { - @Test - fun process() { - processChangelog(""" - CHANGELOG! - - # Next version (unreleased) - - Bugfix - - # Version 0.0.1 - - Initial release - """.trimIndent().lineSequence(), - "0.0.2" - ).let { - assertEquals(""" - CHANGELOG! - - # Next version (unreleased) - - # Version 0.0.2 - _date_ - - Bugfix - - # Version 0.0.1 - - Initial release - - """.trimIndent(), it.processedChangelog.replaceDate() - ) - - assertEquals(""" - - Bugfix - - - """.trimIndent(), it.versionToReleaseChangelog) - } - } - - @Test - fun missingUnreleased() { - val result = kotlin.runCatching { - processChangelog(""" - # Version 0.0.1 - - Initial release! - - """.trimIndent().lineSequence(), "0.0.2" - ) - } - - assertTrue(result.exceptionOrNull()?.message?.contains("The first H1 heading of $changelogMd must be '# $nextVersion'") == true) - } -} - -private fun String.replaceDate(): String { - return lines().mapIndexed { index: Int, s: String -> - val regex = Regex("_[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}_") - if (regex.matchEntire(s) != null) { - "_date_" - } else { - s - } - }.joinToString("\n") -} diff --git a/librarian-gradle-plugin/src/test/kotlin/GradleTest.kt b/librarian-gradle-plugin/src/test/kotlin/GradleTest.kt new file mode 100644 index 0000000..96535eb --- /dev/null +++ b/librarian-gradle-plugin/src/test/kotlin/GradleTest.kt @@ -0,0 +1,73 @@ +import com.apollographql.mockserver.MockServer +import com.apollographql.mockserver.MultipartBody +import com.apollographql.mockserver.enqueueString +import kotlinx.coroutines.runBlocking +import okhttp3.MultipartReader +import okio.Buffer +import okio.use +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import java.io.File +import java.util.zip.ZipInputStream +import kotlin.test.Test +import kotlin.test.assertEquals + +class GradleTest { + @Test + fun process() = runBlocking { + val mockWebServer = MockServer() + mockWebServer.enqueueString("ok") + + withTestProject("simple") { projectDir -> + + projectDir.resolve("librarian.properties") + .replace(Regex("sonatype.baseUrl=.*"), "sonatype.baseUrl=http://127.0.0.1:${mockWebServer.port()}") + + GradleRunner.create() + .withProjectDir(projectDir) + .withArguments("librarianPublishToMavenCentral", "--stacktrace") + .forwardOutput() + .withEnvironment(mapOf( + "LIBRARIAN_SONATYPE_USERNAME" to "fake_user", + "LIBRARIAN_SONATYPE_PASSWORD" to "fake_password" + ) + ) + .run() + .apply { + assertEquals(TaskOutcome.SUCCESS, task(":librarianDeployToPortal")?.outcome) + } + + mockWebServer.takeRequest().apply { + /* + * XXX: better parsing + */ + val boundary = headers.get("Content-Type")?.substringAfterLast("boundary=") ?: error("no Content-Type") + MultipartReader(Buffer().write(body), boundary = boundary).use { + it.nextPart()!!.use { + ZipInputStream(it.body.inputStream()).use { + var entry = it.nextEntry + while (entry != null) { + println("Got ${entry.name}") + entry = it.nextEntry + } + } + } + } + + } + } + } +} + +private suspend fun withTestProject(name: String, block: suspend (File) -> Unit) { + val dest = File("build/testProject") + dest.deleteRecursively() + + File("testProjects/$name").copyRecursively(dest) + + block(dest) +} + +fun File.replace(regex: Regex, replacement: String) { + writeText(readText().replace(regex, replacement)) +} \ No newline at end of file diff --git a/librarian-gradle-plugin/testProjects/simple/CHANGELOG.md b/librarian-gradle-plugin/testProjects/simple/CHANGELOG.md new file mode 100644 index 0000000..0148fec --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/CHANGELOG.md @@ -0,0 +1,3 @@ +# Next version (unreleased) + +Initial release 🎉 diff --git a/librarian-gradle-plugin/testProjects/simple/LICENSE b/librarian-gradle-plugin/testProjects/simple/LICENSE new file mode 100644 index 0000000..697b191 --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) librarian authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/librarian-gradle-plugin/testProjects/simple/build.gradle.kts b/librarian-gradle-plugin/testProjects/simple/build.gradle.kts new file mode 100644 index 0000000..8dc6d7f --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("org.jetbrains.kotlin.jvm").version("2.0.0").apply(false) + id("com.gradleup.librarian") +} + +librarian { + root() +} + diff --git a/librarian-gradle-plugin/testProjects/simple/gradle b/librarian-gradle-plugin/testProjects/simple/gradle new file mode 120000 index 0000000..84b694e --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/gradle @@ -0,0 +1 @@ +../../../gradle \ No newline at end of file diff --git a/librarian-gradle-plugin/testProjects/simple/gradlew b/librarian-gradle-plugin/testProjects/simple/gradlew new file mode 120000 index 0000000..ab9334b --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/gradlew @@ -0,0 +1 @@ +../../../gradlew \ No newline at end of file diff --git a/librarian-gradle-plugin/testProjects/simple/gradlew.bat b/librarian-gradle-plugin/testProjects/simple/gradlew.bat new file mode 120000 index 0000000..b284c30 --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/gradlew.bat @@ -0,0 +1 @@ +../../../gradlew.bat \ No newline at end of file diff --git a/librarian-gradle-plugin/testProjects/simple/librarian.properties b/librarian-gradle-plugin/testProjects/simple/librarian.properties new file mode 100644 index 0000000..e69233c --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/librarian.properties @@ -0,0 +1,18 @@ +java.compatibility=8 +kotlin.compatibility=2.0.0 + +kdoc.olderVersions= +kdoc.artifactId=kdoc + +sonatype.backend=Portal +sonatype.baseUrl= + +git.snapshots=main + +pom.groupId=com.example.test +pom.version=0.0.1 +pom.description=librarian +pom.vcsUrl=https://github.com/GradleUp/librarian +pom.developer=librarian authors +pom.license=MIT License +pom.licenseUrl=https://raw.githubusercontent.com/GradleUp/librarian/main/LICENSE \ No newline at end of file diff --git a/librarian-gradle-plugin/testProjects/simple/module/build.gradle.kts b/librarian-gradle-plugin/testProjects/simple/module/build.gradle.kts new file mode 100644 index 0000000..23eefe4 --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/module/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id("org.jetbrains.kotlin.jvm") + id("com.gradleup.librarian") +} + +librarian { + module() +} \ No newline at end of file diff --git a/librarian-gradle-plugin/testProjects/simple/module/src/main/kotlin/com/example/main.kt b/librarian-gradle-plugin/testProjects/simple/module/src/main/kotlin/com/example/main.kt new file mode 100644 index 0000000..76aabe3 --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/module/src/main/kotlin/com/example/main.kt @@ -0,0 +1,3 @@ +fun main() { + println("Hello world") +} \ No newline at end of file diff --git a/librarian-gradle-plugin/testProjects/simple/settings.gradle.kts b/librarian-gradle-plugin/testProjects/simple/settings.gradle.kts new file mode 100644 index 0000000..092a607 --- /dev/null +++ b/librarian-gradle-plugin/testProjects/simple/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + listOf(repositories, dependencyResolutionManagement.repositories).forEach { + it.mavenCentral() + } +} + +include(":module") + +includeBuild("../../../") \ No newline at end of file diff --git a/librarian.properties b/librarian.properties index 421b0d8..cd89b7b 100644 --- a/librarian.properties +++ b/librarian.properties @@ -4,7 +4,7 @@ kotlin.compatibility=2.0.0 kdoc.olderVersions= kdoc.artifactId=kdoc -sonatype.host=Default +sonatype.host=S01 git.snapshots=main From 6465b9bcf4ff554688113983d0dfeebfa443d2c8 Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Mon, 8 Jul 2024 17:02:52 +0200 Subject: [PATCH 3/3] update apiDump --- .../api/{cli.api => librarian-cli.api} | 12 +- librarian-core/api/librarian-core.api | 8 ++ .../{core.api => librarian-gradle-plugin.api} | 131 ++++++++++-------- 3 files changed, 89 insertions(+), 62 deletions(-) rename librarian-cli/api/{cli.api => librarian-cli.api} (52%) create mode 100644 librarian-core/api/librarian-core.api rename librarian-gradle-plugin/api/{core.api => librarian-gradle-plugin.api} (54%) diff --git a/librarian-cli/api/cli.api b/librarian-cli/api/librarian-cli.api similarity index 52% rename from librarian-cli/api/cli.api rename to librarian-cli/api/librarian-cli.api index 1bc42d6..d9a2955 100644 --- a/librarian-cli/api/cli.api +++ b/librarian-cli/api/librarian-cli.api @@ -1,3 +1,7 @@ +public final class com/gradleup/librarian/cli/JsonKt { + public static final fun toJsonElement (Ljava/lang/String;)Lkotlinx/serialization/json/JsonElement; +} + public final class com/gradleup/librarian/cli/MainKt { public static final fun main ([Ljava/lang/String;)V } @@ -11,11 +15,3 @@ public final class com/gradleup/librarian/cli/MultilineSecretComponent : com/git public fun value ()Ljava/lang/String; } -public final class com/gradleup/librarian/cli/SupportedLicenses : java/lang/Enum { - public static final field MIT Lcom/gradleup/librarian/cli/SupportedLicenses; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getFullName ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lcom/gradleup/librarian/cli/SupportedLicenses; - public static fun values ()[Lcom/gradleup/librarian/cli/SupportedLicenses; -} - diff --git a/librarian-core/api/librarian-core.api b/librarian-core/api/librarian-core.api new file mode 100644 index 0000000..02ed7cd --- /dev/null +++ b/librarian-core/api/librarian-core.api @@ -0,0 +1,8 @@ +public final class com/gradleup/librarian/core/tooling/ChangelogKt { + public static final fun processChangelog (Ljava/lang/String;)Ljava/lang/String; +} + +public final class com/gradleup/librarian/core/tooling/Prepare_releaseKt { + public static final fun prepareRelease (Ljava/lang/String;)V +} + diff --git a/librarian-gradle-plugin/api/core.api b/librarian-gradle-plugin/api/librarian-gradle-plugin.api similarity index 54% rename from librarian-gradle-plugin/api/core.api rename to librarian-gradle-plugin/api/librarian-gradle-plugin.api index a0477e8..448d8c9 100644 --- a/librarian-gradle-plugin/api/core.api +++ b/librarian-gradle-plugin/api/librarian-gradle-plugin.api @@ -1,20 +1,20 @@ -public final class com/gradleup/librarian/core/BcvKt { +public final class com/gradleup/librarian/gradle/BcvKt { public static final fun configureBcv (Lorg/gradle/api/Project;Lkotlin/jvm/functions/Function1;)V public static synthetic fun configureBcv$default (Lorg/gradle/api/Project;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V } -public final class com/gradleup/librarian/core/CompatibilityKt { +public final class com/gradleup/librarian/gradle/CompatibilityKt { public static final fun configureAndroidCompatibility (Lorg/gradle/api/Project;III)V public static final fun configureJavaCompatibility (Lorg/gradle/api/Project;I)V public static final fun configureJavaCompatibility (Lorg/gradle/api/Project;Lorg/gradle/api/JavaVersion;)V public static final fun configureKotlinCompatibility (Lorg/gradle/api/Project;Ljava/lang/String;)V } -public final class com/gradleup/librarian/core/Compatibility_kotlinKt { +public final class com/gradleup/librarian/gradle/Compatibility_kotlinKt { public static final fun forEachCompilerOptions (Lorg/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension;Lkotlin/jvm/functions/Function2;)V } -public final class com/gradleup/librarian/core/Coordinates { +public final class com/gradleup/librarian/gradle/Coordinates { public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public final fun getArtifactId ()Ljava/lang/String; public final fun getGroupId ()Ljava/lang/String; @@ -22,13 +22,13 @@ public final class com/gradleup/librarian/core/Coordinates { public fun toString ()Ljava/lang/String; } -public final class com/gradleup/librarian/core/DokkatooKt { - public static final fun Coordinates (Ljava/lang/String;)Lcom/gradleup/librarian/core/Coordinates; +public final class com/gradleup/librarian/gradle/DokkatooKt { + public static final fun Coordinates (Ljava/lang/String;)Lcom/gradleup/librarian/gradle/Coordinates; public static final fun configureDokkatoo (Lorg/gradle/api/Project;)V public static final fun configureDokkatooAggregate (Lorg/gradle/api/Project;Ljava/lang/String;Ljava/util/List;)Lorg/gradle/api/tasks/TaskProvider; } -public abstract class com/gradleup/librarian/core/GeneratePluginVersion : org/gradle/api/DefaultTask { +public abstract class com/gradleup/librarian/gradle/GeneratePluginVersion : org/gradle/api/DefaultTask { public fun ()V public abstract fun getOutputDir ()Lorg/gradle/api/file/DirectoryProperty; public abstract fun getPackageName ()Lorg/gradle/api/provider/Property; @@ -36,18 +36,18 @@ public abstract class com/gradleup/librarian/core/GeneratePluginVersion : org/gr public final fun taskAction ()V } -public final class com/gradleup/librarian/core/GeneratedVersionKt { +public final class com/gradleup/librarian/gradle/GeneratedVersionKt { public static final fun configureGeneratedVersion (Lorg/gradle/api/Project;Ljava/lang/String;Ljava/lang/String;)V } -public final class com/gradleup/librarian/core/KdocAggregate { +public final class com/gradleup/librarian/gradle/KdocAggregate { public fun (Ljava/lang/String;Ljava/util/List;)V public final fun getCurrentVersion ()Ljava/lang/String; public final fun getOlderVersions ()Ljava/util/List; } -public final class com/gradleup/librarian/core/KdocAggregate$Builder { - public final fun build ()Lcom/gradleup/librarian/core/KdocAggregate; +public final class com/gradleup/librarian/gradle/KdocAggregate$Builder { + public final fun build ()Lcom/gradleup/librarian/gradle/KdocAggregate; public final fun fromGradleProperties ()V public final fun getCurrentVersion ()Ljava/lang/String; public final fun getOlderVersions ()Ljava/util/List; @@ -55,26 +55,34 @@ public final class com/gradleup/librarian/core/KdocAggregate$Builder { public final fun setOlderVersions (Ljava/util/List;)V } -public final class com/gradleup/librarian/core/KmpKt { +public final class com/gradleup/librarian/gradle/KmpKt { public static final fun allAppleTargets (Lorg/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension;)V } -public final class com/gradleup/librarian/core/LibrarianPlugin : org/gradle/api/Plugin { +public abstract class com/gradleup/librarian/gradle/LibrarianExtension { + public fun (Lorg/gradle/api/Project;)V + public final fun module ()V + public final fun module (Z)V + public static synthetic fun module$default (Lcom/gradleup/librarian/gradle/LibrarianExtension;ZILjava/lang/Object;)V + public final fun root ()V +} + +public final class com/gradleup/librarian/gradle/LibrarianPlugin : org/gradle/api/Plugin { public fun ()V public synthetic fun apply (Ljava/lang/Object;)V public fun apply (Lorg/gradle/api/Project;)V } -public final class com/gradleup/librarian/core/MavenKt { +public final class com/gradleup/librarian/gradle/MavenKt { public static final fun publishPlatformArtifactsInRootModule (Lorg/gradle/api/Project;)V } -public final class com/gradleup/librarian/core/ModuleKt { +public final class com/gradleup/librarian/gradle/ModuleKt { public static final fun configureMavenFriendlyDependencies (Lorg/gradle/api/Project;)V - public static final fun librarianModule (Lorg/gradle/api/Project;)V + public static final fun librarianModule (Lorg/gradle/api/Project;Z)V } -public final class com/gradleup/librarian/core/PomMetadata { +public final class com/gradleup/librarian/gradle/PomMetadata { public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public final fun getArtifactId ()Ljava/lang/String; public final fun getDescription ()Ljava/lang/String; @@ -86,93 +94,108 @@ public final class com/gradleup/librarian/core/PomMetadata { public final fun getVersion ()Ljava/lang/String; } -public final class com/gradleup/librarian/core/Project_kotlinKt { +public final class com/gradleup/librarian/gradle/Project_kotlinKt { public static final fun forEachKotlinCompilerOptions (Lorg/gradle/api/Project;Lkotlin/jvm/functions/Function2;)V public static final fun getKotlinExtension (Lorg/gradle/api/Project;)Lorg/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension; } -public final class com/gradleup/librarian/core/PublishingKt { - public static final fun PomMetadata (Ljava/lang/String;Ljava/util/Properties;)Lcom/gradleup/librarian/core/PomMetadata; - public static final fun configurePom (Lorg/gradle/api/Project;Lcom/gradleup/librarian/core/PomMetadata;)V - public static final fun configurePublishing (Lorg/gradle/api/Project;ZZLcom/gradleup/librarian/core/PomMetadata;Lcom/gradleup/librarian/core/Sonatype;Lcom/gradleup/librarian/core/Signing;)V - public static final fun configureRepositoriesRoot (Lorg/gradle/api/Project;Lcom/gradleup/librarian/core/Sonatype;Lorg/gradle/api/tasks/TaskProvider;)V +public final class com/gradleup/librarian/gradle/PublishingKt { + public static final fun PomMetadata (Ljava/lang/String;Ljava/util/Properties;)Lcom/gradleup/librarian/gradle/PomMetadata; + public static final fun configurePom (Lorg/gradle/api/Project;Lcom/gradleup/librarian/gradle/PomMetadata;)V + public static final fun configurePublishing (Lorg/gradle/api/Project;ZZLcom/gradleup/librarian/gradle/PomMetadata;Lcom/gradleup/librarian/gradle/Signing;)V public static final fun createMissingPublications (Lorg/gradle/api/Project;Ljava/lang/String;)V public static synthetic fun createMissingPublications$default (Lorg/gradle/api/Project;Ljava/lang/String;ILjava/lang/Object;)V - public static final fun dependsOn (Lorg/gradle/api/tasks/TaskProvider;Ljava/lang/Object;)V } -public final class com/gradleup/librarian/core/RootKt { +public final class com/gradleup/librarian/gradle/RootKt { public static final fun librarianRoot (Lorg/gradle/api/Project;)V } -public final class com/gradleup/librarian/core/Signing { +public final class com/gradleup/librarian/gradle/Signing { public fun (Ljava/lang/String;Ljava/lang/String;)V public final fun getPrivateKey ()Ljava/lang/String; public final fun getPrivateKeyPassword ()Ljava/lang/String; } -public final class com/gradleup/librarian/core/SigningKt { - public static final fun configureSigning (Lorg/gradle/api/Project;Lcom/gradleup/librarian/core/Signing;)V +public final class com/gradleup/librarian/gradle/SigningKt { + public static final fun configureSigning (Lorg/gradle/api/Project;Lcom/gradleup/librarian/gradle/Signing;)V } -public final class com/gradleup/librarian/core/Sonatype { - public fun (Ljava/lang/String;Ljava/lang/String;Lcom/gradleup/librarian/core/SonatypeHost;)V - public final fun getHost ()Lcom/gradleup/librarian/core/SonatypeHost; +public final class com/gradleup/librarian/gradle/Sonatype { + public fun (Ljava/lang/String;Ljava/lang/String;Lcom/gradleup/librarian/gradle/SonatypeBackend;Lcom/gradleup/librarian/gradle/SonatypeRelease;Ljava/lang/String;)V + public final fun getBackend ()Lcom/gradleup/librarian/gradle/SonatypeBackend; + public final fun getBaseUrl ()Ljava/lang/String; public final fun getPassword ()Ljava/lang/String; + public final fun getRelease ()Lcom/gradleup/librarian/gradle/SonatypeRelease; public final fun getUsername ()Ljava/lang/String; } -public final class com/gradleup/librarian/core/SonatypeHost : java/lang/Enum { - public static final field Default Lcom/gradleup/librarian/core/SonatypeHost; - public static final field S01 Lcom/gradleup/librarian/core/SonatypeHost; +public final class com/gradleup/librarian/gradle/SonatypeBackend : java/lang/Enum { + public static final field Default Lcom/gradleup/librarian/gradle/SonatypeBackend; + public static final field Portal Lcom/gradleup/librarian/gradle/SonatypeBackend; + public static final field S01 Lcom/gradleup/librarian/gradle/SonatypeBackend; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/gradleup/librarian/gradle/SonatypeBackend; + public static fun values ()[Lcom/gradleup/librarian/gradle/SonatypeBackend; +} + +public final class com/gradleup/librarian/gradle/SonatypeRelease : java/lang/Enum { + public static final field Automatic Lcom/gradleup/librarian/gradle/SonatypeRelease; + public static final field Manual Lcom/gradleup/librarian/gradle/SonatypeRelease; public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lcom/gradleup/librarian/core/SonatypeHost; - public static fun values ()[Lcom/gradleup/librarian/core/SonatypeHost; + public static fun valueOf (Ljava/lang/String;)Lcom/gradleup/librarian/gradle/SonatypeRelease; + public static fun values ()[Lcom/gradleup/librarian/gradle/SonatypeRelease; } -public final class com/gradleup/librarian/core/internal/Project_androidKt { +public final class com/gradleup/librarian/gradle/internal/Project_androidKt { public static final fun getAndroidExtension (Lorg/gradle/api/Project;)Lcom/android/build/api/dsl/CommonExtension; public static final fun getAndroidExtensionOrNull (Lorg/gradle/api/Project;)Lcom/android/build/api/dsl/CommonExtension; } -public final class com/gradleup/librarian/core/internal/Publishing_androidKt { +public final class com/gradleup/librarian/gradle/internal/Publishing_androidKt { public static final fun createAndroidPublication (Lorg/gradle/api/Project;Ljava/lang/String;)V } -public abstract class com/gradleup/librarian/core/internal/task/CloseRepoTask : org/gradle/api/DefaultTask { +public abstract class com/gradleup/librarian/gradle/internal/task/CreateRepositoryTask : org/gradle/api/DefaultTask { public fun ()V - public abstract fun getHost ()Lorg/gradle/api/provider/Property; + public abstract fun getBaseUrl ()Lorg/gradle/api/provider/Property; + public abstract fun getGroupId ()Lorg/gradle/api/provider/Property; + public abstract fun getOutput ()Lorg/gradle/api/file/RegularFileProperty; public abstract fun getPassword ()Lorg/gradle/api/provider/Property; - public abstract fun getRepoId ()Lorg/gradle/api/provider/Property; + public abstract fun getRepoDescription ()Lorg/gradle/api/provider/Property; public abstract fun getUsername ()Lorg/gradle/api/provider/Property; + public abstract fun getVersion ()Lorg/gradle/api/provider/Property; public final fun taskAction ()V } -public abstract class com/gradleup/librarian/core/internal/task/CreateRepoTask : org/gradle/api/DefaultTask { +public abstract class com/gradleup/librarian/gradle/internal/task/DeployToPortalTask : org/gradle/api/DefaultTask { public fun ()V - public abstract fun getGroupId ()Lorg/gradle/api/provider/Property; - public abstract fun getOutput ()Lorg/gradle/api/file/RegularFileProperty; + public abstract fun getAutomatic ()Lorg/gradle/api/provider/Property; + public abstract fun getBaseUrl ()Lorg/gradle/api/provider/Property; + public abstract fun getDeploymentDescription ()Lorg/gradle/api/provider/Property; + public abstract fun getFiles ()Lorg/gradle/api/file/ConfigurableFileCollection; public abstract fun getPassword ()Lorg/gradle/api/provider/Property; - public abstract fun getRepoDescription ()Lorg/gradle/api/provider/Property; - public abstract fun getSonatypeHost ()Lorg/gradle/api/provider/Property; public abstract fun getUsername ()Lorg/gradle/api/provider/Property; + public abstract fun getVersion ()Lorg/gradle/api/provider/Property; public final fun taskAction ()V } -public abstract class com/gradleup/librarian/core/internal/task/ReleaseRepoTask : org/gradle/api/DefaultTask { +public abstract class com/gradleup/librarian/gradle/internal/task/ReleaseRepositoryTask : org/gradle/api/DefaultTask { public fun ()V - public abstract fun getHost ()Lorg/gradle/api/provider/Property; + public abstract fun getAutomatic ()Lorg/gradle/api/provider/Property; + public abstract fun getBaseUrl ()Lorg/gradle/api/provider/Property; public abstract fun getPassword ()Lorg/gradle/api/provider/Property; public abstract fun getRepoId ()Lorg/gradle/api/provider/Property; public abstract fun getUsername ()Lorg/gradle/api/provider/Property; public final fun taskAction ()V } -public final class com/gradleup/librarian/core/tooling/ChangelogKt { - public static final fun processChangelog (Ljava/lang/String;)Ljava/lang/String; -} - -public final class com/gradleup/librarian/core/tooling/Prepare_releaseKt { - public static final fun prepareRelease (Ljava/lang/String;)V +public abstract class com/gradleup/librarian/gradle/internal/task/UploadFilesTask : org/gradle/api/DefaultTask { + public fun ()V + public abstract fun getFiles ()Lorg/gradle/api/file/ConfigurableFileCollection; + public abstract fun getPassword ()Lorg/gradle/api/provider/Property; + public abstract fun getUrl ()Lorg/gradle/api/provider/Property; + public abstract fun getUsername ()Lorg/gradle/api/provider/Property; + public final fun taskAction ()V }