Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import com.gradleup.librarian.gradle.Librarian
plugins {
alias(libs.plugins.kgp).apply(false)
alias(libs.plugins.ksp).apply(false)
alias(libs.plugins.gratatouille.wiring).apply(false)
alias(libs.plugins.gratatouille).apply(false)
alias(libs.plugins.librarian).apply(false)
alias(libs.plugins.nmcp).apply(false)
alias(libs.plugins.compat).apply(false)
Expand Down
8 changes: 4 additions & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[versions]
kgp = "2.2.20"
ksp = "2.3.2"
gratatouille-runtime = "0.1.3"
gratatouille-plugin = "0.1.3"
gratatouille-runtime = "0.2.0"
gratatouille-plugin = "0.2.0"

[libraries]
json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1"
Expand All @@ -14,14 +14,14 @@ kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test" }
xmlutil = "io.github.pdvrieze.xmlutil:serialization:0.91.1"
kgp = { module = "org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin", version.ref = "kgp" }
coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2"
gratatouille-wiring-runtime = { module = "com.gradleup.gratatouille:gratatouille-wiring-runtime", version.ref = "gratatouille-runtime" }
gratatouille-runtime = { module = "com.gradleup.gratatouille:gratatouille-runtime", version.ref = "gratatouille-runtime" }
gratatouille-tasks-runtime = { module = "com.gradleup.gratatouille:gratatouille-tasks-runtime", version.ref = "gratatouille-runtime" }

[plugins]
kgp = { id = "org.jetbrains.kotlin.jvm", version.ref = "kgp" }
serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kgp" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
gratatouille-wiring = { id = "com.gradleup.gratatouille.wiring", version.ref = "gratatouille-plugin" }
gratatouille = { id = "com.gradleup.gratatouille", version.ref = "gratatouille-plugin" }
librarian = { id = "com.gradleup.librarian", version = "0.2.2-SNAPSHOT-6898196f1f9759091ae6fa9bbe84154ec28a9331" }
nmcp = { id = "com.gradleup.nmcp", version = "1.3.0" }
compat = { id = "com.gradleup.compat.patrouille", version = "0.0.1-SNAPSHOT-9da44b3b93e36a196ae5afc9f7a79a46a82763cd" }
7 changes: 1 addition & 6 deletions nmcp-tasks/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,7 @@ plugins {
Librarian.module(project)

gratatouille {
codeGeneration {
addDependencies.set(false)
classLoaderIsolation {
configurationName.set("nmcpTasks")
}
}
configurationName.set("nmcpTasks")
}

dependencies {
Expand Down
26 changes: 18 additions & 8 deletions nmcp/api/nmcp.api
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,34 @@ public abstract interface class nmcp/NmcpAggregationExtension {
public abstract fun publishAllProjectsProbablyBreakingProjectIsolation ()V
}

public abstract class nmcp/NmcpAggregationPlugin : org/gradle/api/Plugin {
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/Project;)V
}

public abstract interface class nmcp/NmcpExtension {
public abstract fun extraFiles (Ljava/lang/Object;)V
public abstract fun publishAllPublicationsToCentralPortal (Lorg/gradle/api/Action;)V
}

public abstract class nmcp/NmcpPlugin : org/gradle/api/Plugin {
public abstract interface class nmcp/NmcpSettings {
public abstract fun centralPortal (Lorg/gradle/api/Action;)V
}

public abstract class nmcp/internal/DefaultNmcpAggregationExtensionPlugin : org/gradle/api/Plugin {
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/Project;)V
}

public abstract class nmcp/NmcpSettingsPlugin : org/gradle/api/Plugin {
public abstract class nmcp/internal/DefaultNmcpExtensionPlugin : org/gradle/api/Plugin {
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/Project;)V
}

public abstract class nmcp/internal/DefaultNmcpSettings : nmcp/NmcpSettings {
public fun <init> (Lorg/gradle/api/initialization/Settings;)V
public fun centralPortal (Lorg/gradle/api/Action;)V
public abstract fun getObjects ()Lorg/gradle/api/model/ObjectFactory;
}

public abstract class nmcp/internal/DefaultNmcpSettingsPlugin : org/gradle/api/Plugin {
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/initialization/Settings;)V
Expand Down
8 changes: 3 additions & 5 deletions nmcp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,19 @@ import com.gradleup.librarian.gradle.Librarian
plugins {
alias(libs.plugins.kgp)
alias(libs.plugins.ksp)
id("com.gradleup.gratatouille.wiring")
id("com.gradleup.gratatouille")
}

Librarian.module(project)

gratatouille {
codeGeneration {
addDependencies.set(false)
}
addDependencies = false
pluginLocalPublication("com.gradleup.nmcp.settings")
}

dependencies {
gratatouille(project(":nmcp-tasks"))
compileOnly(libs.gradle.min)
implementation(libs.gratatouille.wiring.runtime)
implementation(libs.gratatouille.runtime)
testImplementation(libs.kotlin.test)
}
13 changes: 11 additions & 2 deletions nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,22 @@ interface NmcpAggregationExtension {
*
* This function is not compatible with breaking project isolation. To be compatible with project isolation,
* add each subproject to the `nmcpAggregation` configuration dependencies.
*
* This was provided as a helper function but indirectly encouraged using non-project isolation compatible practices.
*
* Moving forward, use the `com.gradleup.nmcp.settings` or make a convention plugin that applies `com.gradleup.nmcp`
* to all your projects.
*/
@Deprecated("Use the settings plugin or a convention plugin instead")
fun publishAllProjectsProbablyBreakingProjectIsolation()

/**
* [allFiles] contains all the files present in the "nmcpAggregation" configuration
* [allFiles] contains all the files present in the "nmcpAggregation" configuration.
*
* This [FileCollection] is a multi-rooted [org.gradle.api.file.FileTree] containing only files.
*
* This [FileCollection] is a multi-rooted [org.gradle.api.file.FileTree] containing only files
* [allFiles] may be used to publish manually to other repositories than Maven Central, such as Google Cloud
* Storage and or AWS S3.
*/
val allFiles: FileCollection
}
15 changes: 15 additions & 0 deletions nmcp/src/main/kotlin/nmcp/NmcpSettings.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package nmcp

import org.gradle.api.Action
import org.gradle.api.file.FileCollection

interface NmcpSettings {
/**
* Configures publishing to central portal releases (Maven Central) and central portal snapshots.
*
* Adds the following tasks:
* - nmcpPublishAggregationToCentralPortal
* - nmcpPublishAggregationToCentralPortalSnapshots
*/
fun centralPortal(action: Action<CentralPortalOptions>)
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package nmcp.internal

import gratatouille.GExtension
import gratatouille.GPlugin
import nmcp.CentralPortalOptions
import nmcp.NmcpAggregationExtension
import nmcp.nmcpAggregationExtensionName
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.file.FileCollection

@GExtension(pluginId = "com.gradleup.nmcp.aggregation", publicType = NmcpAggregationExtension::class, extensionName = nmcpAggregationExtensionName)
internal abstract class DefaultNmcpAggregationExtension(private val project: Project) : NmcpAggregationExtension {
private val spec = project.objects.newInstance(CentralPortalOptions::class.java)

Expand All @@ -30,6 +34,7 @@ internal abstract class DefaultNmcpAggregationExtension(private val project: Pro
action.execute(spec)
}

@Deprecated("Use the settings plugin or a convention plugin instead")
override fun publishAllProjectsProbablyBreakingProjectIsolation() {
check(project === project.rootProject) {
"publishAllProjectsProbablyBreakingProjectIsolation() must be called from root project"
Expand Down
6 changes: 4 additions & 2 deletions nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package nmcp.internal

import gratatouille.wiring.capitalizeFirstLetter
import gratatouille.GExtension
import gratatouille.capitalizeFirstLetter
import nmcp.CentralPortalOptions
import nmcp.NmcpExtension
import nmcp.internal.task.registerCleanupDirectoryTask
import nmcp.nmcpExtensionName
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication

@GExtension(pluginId = "com.gradleup.nmcp", publicType = NmcpExtension::class, extensionName = nmcpExtensionName)
internal abstract class DefaultNmcpExtension(private val project: Project): NmcpExtension {
private var centralPortalConfigured = false
private val m2Dir = project.layout.buildDirectory.file("nmcp/m2")
private val spec = project.objects.newInstance(CentralPortalOptions::class.java)

Expand Down
49 changes: 49 additions & 0 deletions nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpSettings.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package nmcp.internal

import gratatouille.GExtension
import javax.inject.Inject
import nmcp.CentralPortalOptions
import nmcp.NmcpAggregationExtension
import nmcp.NmcpSettings
import org.gradle.api.Action
import org.gradle.api.initialization.Settings
import org.gradle.api.model.ObjectFactory

@Suppress("UnstableApiUsage")
@GExtension(pluginId = "com.gradleup.nmcp.settings", extensionName = "nmcpSettings", publicType = NmcpSettings::class)
abstract class DefaultNmcpSettings(settings: Settings): NmcpSettings {
@get:Inject
abstract val objects: ObjectFactory

private val spec = objects.newInstance(CentralPortalOptions::class.java)

init {
settings.gradle.lifecycle.beforeProject { project ->
if (project.rootProject == project) {
project.pluginManager.apply("com.gradleup.nmcp.aggregation")

project.extensions.getByType(NmcpAggregationExtension::class.java).centralPortal {
it.username.set(spec.username)
it.password.set(spec.password)
it.publishingType.set(spec.publishingType)
it.publicationName.set(spec.publicationName)
it.validationTimeout.set(spec.validationTimeout)
it.publishingTimeout.set(spec.publishingTimeout)
it.baseUrl.set(spec.baseUrl)
it.uploadSnapshotsParallelism.set(spec.uploadSnapshotsParallelism)
}

project.allprojects {
project.dependencies.add(nmcpConsumerConfigurationName, project.dependencies.create(it))
}
}
project.pluginManager.withPlugin("maven-publish") {
project.pluginManager.apply("com.gradleup.nmcp")
}
}
}

override fun centralPortal(action: Action<CentralPortalOptions>) {
action.execute(spec)
}
}
2 changes: 1 addition & 1 deletion nmcp/src/main/kotlin/nmcp/internal/utils.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package nmcp.internal

import gratatouille.wiring.capitalizeFirstLetter
import gratatouille.capitalizeFirstLetter
import java.io.File
import nmcp.CentralPortalOptions
import nmcp.internal.task.registerNmcpFindDeploymentNameTask
Expand Down
42 changes: 2 additions & 40 deletions nmcp/src/main/kotlin/nmcp/plugins.kt
Original file line number Diff line number Diff line change
@@ -1,43 +1,5 @@
package nmcp

import gratatouille.wiring.GPlugin
import nmcp.internal.DefaultNmcpAggregationExtension
import nmcp.internal.DefaultNmcpExtension
import nmcp.internal.nmcpConsumerConfigurationName
import org.gradle.api.Project
import org.gradle.api.initialization.Settings
internal const val nmcpExtensionName = "nmcp"
internal const val nmcpAggregationExtensionName = "nmcpAggregation"

internal val nmcpExtensionName = "nmcp"
internal val nmcpAggregationExtensionName = "nmcpAggregation"

@GPlugin(id = "com.gradleup.nmcp")
internal fun nmcp(project: Project) {
project.extensions.create(NmcpExtension::class.java, nmcpExtensionName, DefaultNmcpExtension::class.java, project)
}

@GPlugin(id = "com.gradleup.nmcp.aggregation")
internal fun nmcpAggregation(project: Project) {
project.extensions.create(
NmcpAggregationExtension::class.java,
nmcpAggregationExtensionName,
DefaultNmcpAggregationExtension::class.java,
project,
)
}

@Suppress("UnstableApiUsage")
@GPlugin(id = "com.gradleup.nmcp.settings")
internal fun nmcpSettings(settings: Settings) {
settings.gradle.lifecycle.beforeProject { project ->
if (project.rootProject == project) {
project.pluginManager.apply("com.gradleup.nmcp.aggregation")

project.allprojects {
project.dependencies.add(nmcpConsumerConfigurationName, project.dependencies.create(it))
}
}
project.pluginManager.withPlugin("maven-publish") {
project.pluginManager.apply("com.gradleup.nmcp")
}
}
}
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ pluginManagement {
rootProject.name = "nmcp-root"

include(":nmcp", ":nmcp-tasks")

4 changes: 3 additions & 1 deletion tests/kmp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@ nmcpAggregation {
password = System.getenv("MAVEN_CENTRAL_PASSWORD")
}
publishingType = "USER_MANAGED"
check(publicationName.get() == "test") {
"Error, expected 'test', got '${publicationName.get()}'."
}
}
}


tasks.register("checkZip") {
dependsOn("publishAggregationToCentralPortal")
doLast {
Expand Down
6 changes: 6 additions & 0 deletions tests/kmp/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ plugins {
id("com.gradleup.nmcp.settings")
}

nmcpSettings {
centralPortal {
publicationName.set("test")
}
}

includeBuild("../../")
include(":module1")
include(":module2")
Expand Down