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
20 changes: 13 additions & 7 deletions gradle-plugin/api/gradle-plugin.api
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,12 @@ public final class kotlinx/rpc/buf/BufGenerateExtension$ErrorFormat : java/lang/

public class kotlinx/rpc/buf/BufTasksExtension {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/gradle/api/provider/Provider;
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lkotlinx/rpc/buf/BufTasksExtension$TaskProvider;
}

public abstract interface class kotlinx/rpc/buf/BufTasksExtension$TaskProvider {
public abstract fun getMainTask ()Lorg/gradle/api/provider/Provider;
public abstract fun getTestTask ()Lorg/gradle/api/provider/Provider;
}

public final class kotlinx/rpc/buf/ConstsKt {
Expand Down Expand Up @@ -149,7 +154,7 @@ public abstract interface class kotlinx/rpc/grpc/GrpcExtension {
}

public final class kotlinx/rpc/proto/ConstsKt {
public static final field KXRPC_PLUGIN_JAR_CONFIGURATION Ljava/lang/String;
public static final field PROTOC_GEN_KOTLIN_MULTIPLATFORM_JAR_CONFIGURATION Ljava/lang/String;
public static final field PROTO_BUILD_DIR Ljava/lang/String;
public static final field PROTO_BUILD_GENERATED Ljava/lang/String;
public static final field PROTO_BUILD_SOURCE_SETS Ljava/lang/String;
Expand All @@ -160,8 +165,8 @@ public final class kotlinx/rpc/proto/ConstsKt {
public static final field PROTO_SOURCE_SETS Ljava/lang/String;
}

public final class kotlinx/rpc/proto/KxrpcPluginJarKt {
public static final fun getKxrpcProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
public final class kotlinx/rpc/proto/KotlinMultiplatformPluginJarKt {
public static final fun getKotlinMultiplatformProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
}

public abstract class kotlinx/rpc/proto/ProcessProtoFiles : org/gradle/api/tasks/Copy {
Expand All @@ -185,7 +190,7 @@ public class kotlinx/rpc/proto/ProtocPlugin {
public static final field Companion Lkotlinx/rpc/proto/ProtocPlugin$Companion;
public static final field GRPC_JAVA Ljava/lang/String;
public static final field GRPC_KOTLIN Ljava/lang/String;
public static final field KXRPC Ljava/lang/String;
public static final field KOTLIN_MULTIPLATFORM Ljava/lang/String;
public static final field PROTOBUF_JAVA Ljava/lang/String;
public fun <init> (Ljava/lang/String;Lorg/gradle/api/Project;)V
public final fun getArtifact ()Lorg/gradle/api/provider/Property;
Expand All @@ -207,6 +212,7 @@ public abstract class kotlinx/rpc/proto/ProtocPlugin$Artifact {
public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Local : kotlinx/rpc/proto/ProtocPlugin$Artifact {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun executor (Lorg/gradle/api/provider/Provider;)V
public final fun executor ([Ljava/lang/String;)V
public final fun getExecutor ()Lorg/gradle/api/provider/ListProperty;
public final fun javaJar (Ljava/lang/String;)V
public final fun javaJar (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;)V
Expand All @@ -231,11 +237,11 @@ public final class kotlinx/rpc/proto/ProtocPlugin$Strategy : java/lang/Enum {
public final class kotlinx/rpc/proto/ProtocPluginKt {
public static final fun getGrpcJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getGrpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getKxrpc (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getKotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getProtobufJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun grpcJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun grpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun kxrpc (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun kotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun protobufJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
}

90 changes: 82 additions & 8 deletions gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,28 @@ kotlin {
}

dependencies {
compileOnly(libs.kotlin.gradle.plugin)
implementation(libs.kotlin.gradle.plugin)

testImplementation(libs.kotlin.gradle.plugin)
testImplementation(gradleTestKit())
testImplementation(platform(libs.junit5.bom))
testImplementation(libs.kotlin.test.junit5)
testImplementation(libs.junit5.jupiter)
testImplementation(libs.junit5.jupiter.api)
testRuntimeOnly(libs.junit5.platform.launcher)

testImplementation(libs.logback.classic)
}

tasks.test {
val forwardOutput: Boolean = (properties.getOrDefault("gradle.test.forward.output", "false")
as String).toBooleanStrictOrNull() ?: false

systemProperty("gradle.test.forward.output", forwardOutput)

useJUnitPlatform()

dependsOn(gradle.includedBuild("protoc-gen").task(":publishAllPublicationsToBuildRepoRepository"))
}

// This block is needed to show plugin tasks on --dry-run
Expand All @@ -46,7 +67,7 @@ gradlePlugin {
}
}

abstract class GeneratePluginVersionTask @Inject constructor(
abstract class GeneratePluginVersionsTask @Inject constructor(
@get:Input val libraryVersion: String,
@get:Input val protobufVersion: String,
@get:Input val grpcVersion: String,
Expand Down Expand Up @@ -96,15 +117,15 @@ public const val BUF_TOOL_VERSION: String = "$bufToolVersion"
)
}

companion object {
const val NAME = "generatePluginVersion"
companion object Companion {
const val NAME = "generatePluginVersions"
}
}

val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/pluginVersion")
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/pluginVersions")

val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
GeneratePluginVersionTask.NAME,
val generatePluginVersionsTask = tasks.register<GeneratePluginVersionsTask>(
GeneratePluginVersionsTask.NAME,
version.toString(),
libs.versions.protobuf.asProvider().get(),
libs.versions.grpc.asProvider().get(),
Expand All @@ -113,10 +134,63 @@ val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
sourcesDir,
)

abstract class GenerateTestVersionTask @Inject constructor(
@get:Input val kotlinVersion: String,
@get:Input val protobufVersion: String,
@get:Input val grpcVersion: String,
@get:Input val grpcKotlinVersion: String,
@get:Input val buildRepo: String,
@get:OutputDirectory val sourcesDir: File
) : DefaultTask() {
@TaskAction
fun generate() {
val sourceFile = File(sourcesDir, "Versions.kt")

sourceFile.writeText(
"""
// This file is generated by a $NAME gradle task. Do not modify manually.

package kotlinx.rpc

const val KOTLIN_VERSION: String = "$kotlinVersion"

const val BUILD_REPO: String = "$buildRepo"

// can't use from generatePluginVersionsTask bacause Gradle messes up caches
const val TEST_PROTOBUF_VERSION: String = "$protobufVersion"
const val TEST_GRPC_VERSION: String = "$grpcVersion"
const val TEST_GRPC_KOTLIN_VERSION: String = "$grpcKotlinVersion"

""".trimIndent()
)
}

companion object {
const val NAME = "generateTestVersions"
}
}

val testSourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/testVersions")

val globalRootDir: String by extra

val generateTestVersionsTask = tasks.register<GenerateTestVersionTask>(
GenerateTestVersionTask.NAME,
libs.versions.kotlin.lang.get(),
libs.versions.protobuf.asProvider().get(),
libs.versions.grpc.asProvider().get(),
libs.versions.grpc.kotlin.get(),
File(globalRootDir).resolve("build/repo").absolutePath,
testSourcesDir,
)

kotlin {
sourceSets {
main {
kotlin.srcDir(generatePluginVersionTask.map { it.sourcesDir })
kotlin.srcDir(generatePluginVersionsTask.map { it.sourcesDir })
}
test {
kotlin.srcDir(generateTestVersionsTask.map { it.sourcesDir })
}
}
}
Expand Down
6 changes: 6 additions & 0 deletions gradle-plugin/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ pluginManagement {
includeBuild("../gradle-conventions-settings")
}

dependencyResolutionManagement {
// for tests
includeBuild("../protoc-gen")
includeBuild("../compiler-plugin")
}

plugins {
id("conventions-repositories")
id("conventions-version-resolution")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ internal fun BufExecTask.execBuf(args: Iterable<Any>) {
val configValue = configFile.orNull
if (configValue != null) {
add("--config")
add(configValue.absolutePath)
add(configValue.path)
}

if (debug.get()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import kotlinx.rpc.buf.BUF_GEN_YAML
import kotlinx.rpc.buf.BUF_YAML
import kotlinx.rpc.buf.BufTasksExtension
import org.gradle.api.logging.LogLevel
import org.gradle.api.tasks.Classpath

/**
* Abstract base class for `buf` tasks.
Expand Down Expand Up @@ -60,6 +61,8 @@ public abstract class BufExecTask : DefaultTask() {
* The working directory for the `buf` command.
*/
@get:InputDirectory
// https://docs.gradle.org/current/userguide/incremental_build.html#sec:configure_input_normalization
@get:Classpath
public abstract val workingDir: Property<File>

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskProvider
import java.io.File
import kotlinx.rpc.buf.BufGenerateExtension
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.InputDirectory

/**
Expand All @@ -24,11 +23,11 @@ import org.gradle.api.tasks.InputDirectory
* @see <a href="https://buf.build/docs/reference/cli/buf/generate/">buf generate</a>
*/
public abstract class BufGenerateTask : BufExecTask() {
// unsued, but required for Gradle to properly recognize inputs
// unsued, but required for Gradle to properly recognise inputs
@get:InputDirectory
internal abstract val protoFilesDir: Property<File>

// unsued, but required for Gradle to properly recognize inputs
// unsued, but required for Gradle to properly recognise inputs
@get:InputDirectory
internal abstract val importFilesDir: Property<File>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ internal data class ResolvedGrpcPlugin(
val type: Type,
val locator: List<String>,
val out: String,
val options: Map<String, Any?>,
val options: Map<String, Any>,
val strategy: String?,
val includeImports: Boolean?,
val includeWkt: Boolean?,
Expand Down Expand Up @@ -91,6 +91,13 @@ public abstract class GenerateBufGenYaml : DefaultTask() {
}

writer.appendLine(" - ${plugin.type.name}: $locatorLine")
writer.appendLine(" out: ${plugin.out}")
if (plugin.options.isNotEmpty()) {
writer.appendLine(" opt:")
plugin.options.forEach { (key, value) ->
writer.appendLine(" - $key=$value")
}
}
if (plugin.strategy != null) {
writer.appendLine(" strategy: ${plugin.strategy}")
}
Expand All @@ -112,13 +119,6 @@ public abstract class GenerateBufGenYaml : DefaultTask() {
writer.appendLine(" - $type")
}
}
writer.appendLine(" out: ${plugin.out}")
if (plugin.options.isNotEmpty()) {
writer.appendLine(" opt:")
plugin.options.forEach { (key, value) ->
writer.appendLine(" - $key${if (value != null) "=$value" else ""}")
}
}
}

writer.appendLine("inputs:")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
Expand All @@ -22,11 +21,11 @@ import java.io.File
* Generates/updates a Buf `buf.yaml` file.
*/
public abstract class GenerateBufYaml : DefaultTask() {
@get:InputDirectory
internal abstract val protoSourceDir: Property<File>
@get:Input
internal abstract val protoSourceDir: Property<String>

@get:InputDirectory
internal abstract val importSourceDir: Property<File>
@get:Input
internal abstract val importSourceDir: Property<String>

@get:Input
internal abstract val withImport: Property<Boolean>
Expand Down Expand Up @@ -61,13 +60,15 @@ public abstract class GenerateBufYaml : DefaultTask() {

writer.appendLine("modules:")

val protoDir = protoSourceDir.get()
val protoDirName = protoSourceDir.get()
val protoDir = file.parentFile.resolve(protoDirName)
if (protoDir.exists()) {
val modulePath = protoDir.relativeTo(file.parentFile)
writer.appendLine(" - path: $modulePath")
}

val importDir = importSourceDir.get()
val importDirName = importSourceDir.get()
val importDir = file.parentFile.resolve(importDirName)
if (withImport.get() && importDir.exists()) {
val modulePath = importDir.relativeTo(file.parentFile)
writer.appendLine(" - path: $modulePath")
Expand All @@ -92,8 +93,8 @@ internal fun Project.registerGenerateBufYamlTask(
): TaskProvider<GenerateBufYaml> {
val capitalizeName = name.replaceFirstChar { it.uppercase() }
return tasks.register<GenerateBufYaml>("${GenerateBufYaml.NAME_PREFIX}$capitalizeName") {
protoSourceDir.set(buildSourceSetsProtoDir)
importSourceDir.set(buildSourceSetsImportDir)
protoSourceDir.set(buildSourceSetsProtoDir.name)
importSourceDir.set(buildSourceSetsImportDir.name)
this.withImport.set(withImport)

val bufYamlFile = buildSourceSetsDir
Expand Down
Loading