From be86a6e412d9a18b7543b9e75fa6ede65d7363d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 01/29] Move filtering of proto dirs to the caller --- .../kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 7051f46a..5b9b9651 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -154,18 +154,19 @@ private fun Project.androidProtoSourceSetDirs() = } .orEmpty() .flatMap { it.projectProtoSourceSetDirs() } + .filter { anyProtos(it) } .toSet() // Returns all proto source set directories that the protobuf-gradle-plugin will codegen. private fun Project.projectProtoSourceSetDirs() = the().flatMap { it.projectProtoSourceSetDirs() } + .filter { anyProtos(it) } .toSet() // Returns all directories within the "proto" source set of the receiver that actually contain proto files. This includes // directories explicitly added to the source set, as well as directories containing files from "protobuf" dependencies. private fun ExtensionAware.projectProtoSourceSetDirs() = extensions.getByName("proto").srcDirs - .filter { anyProtos(it) } .toSet() internal fun Project.makeMangledRelativizedPathStr(file: File) = mangle(projectDir.toPath().relativize(file.toPath())) From 60f9e160dd9df9869243aca6d9d0bfe68b64981d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 02/29] Move filtering of proto dirs to the caller --- .../kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 5b9b9651..afc4eac9 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -142,7 +142,7 @@ private fun Task.allProtoDirs() = internal fun Project.projectDefinedProtoDirs() = allProtoSourceSetDirs() - file(Paths.get(BUILD_EXTRACTED_PROTOS_MAIN)) // Returns deduplicated list of all proto source set directories. -private fun Project.allProtoSourceSetDirs() = projectProtoSourceSetDirs() + androidProtoSourceSetDirs() +private fun Project.allProtoSourceSetDirs() = projectProtoSourceSetDirs().filter { anyProtos(it) } + androidProtoSourceSetDirs() // Returns android proto source set directories that protobuf-gradle-plugin will codegen. private fun Project.androidProtoSourceSetDirs() = @@ -160,7 +160,6 @@ private fun Project.androidProtoSourceSetDirs() = // Returns all proto source set directories that the protobuf-gradle-plugin will codegen. private fun Project.projectProtoSourceSetDirs() = the().flatMap { it.projectProtoSourceSetDirs() } - .filter { anyProtos(it) } .toSet() // Returns all directories within the "proto" source set of the receiver that actually contain proto files. This includes From 1ac666592882062fb2b8a6193fc60db5b723b168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 03/29] Move filtering of proto dirs to the caller --- .../kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index afc4eac9..5aeba84f 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -142,7 +142,10 @@ private fun Task.allProtoDirs() = internal fun Project.projectDefinedProtoDirs() = allProtoSourceSetDirs() - file(Paths.get(BUILD_EXTRACTED_PROTOS_MAIN)) // Returns deduplicated list of all proto source set directories. -private fun Project.allProtoSourceSetDirs() = projectProtoSourceSetDirs().filter { anyProtos(it) } + androidProtoSourceSetDirs() +private fun Project.allProtoSourceSetDirs() = + projectProtoSourceSetDirs().filter { + anyProtos(it) + } + androidProtoSourceSetDirs().filter { anyProtos(it) } // Returns android proto source set directories that protobuf-gradle-plugin will codegen. private fun Project.androidProtoSourceSetDirs() = @@ -154,7 +157,6 @@ private fun Project.androidProtoSourceSetDirs() = } .orEmpty() .flatMap { it.projectProtoSourceSetDirs() } - .filter { anyProtos(it) } .toSet() // Returns all proto source set directories that the protobuf-gradle-plugin will codegen. From a9e94fcb9acf5b20afe0597233eac40cf3ff28cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 04/29] Move filtering of proto dirs to the caller --- .../build/buf/gradle/ProtobufGradlePluginSupport.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 5aeba84f..9973b823 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -139,13 +139,12 @@ private fun Task.allProtoDirs() = // // Protobuf-gradle-plugin change that introduced this behavior: https://github.com/google/protobuf-gradle-plugin/pull/637/ // Line: https://github.com/google/protobuf-gradle-plugin/blob/9d2a328a0d577bf4439d3b482a953715b3a03027/src/main/groovy/com/google/protobuf/gradle/ProtobufPlugin.groovy#L425 -internal fun Project.projectDefinedProtoDirs() = allProtoSourceSetDirs() - file(Paths.get(BUILD_EXTRACTED_PROTOS_MAIN)) +internal fun Project.projectDefinedProtoDirs() = + (allProtoSourceSetDirs() - file(Paths.get(BUILD_EXTRACTED_PROTOS_MAIN))) + .filter { anyProtos(it) } // Returns deduplicated list of all proto source set directories. -private fun Project.allProtoSourceSetDirs() = - projectProtoSourceSetDirs().filter { - anyProtos(it) - } + androidProtoSourceSetDirs().filter { anyProtos(it) } +private fun Project.allProtoSourceSetDirs() = projectProtoSourceSetDirs() + androidProtoSourceSetDirs() // Returns android proto source set directories that protobuf-gradle-plugin will codegen. private fun Project.androidProtoSourceSetDirs() = From e2e10f40833fcecee3558aff38ae77fd4032228e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 05/29] Move filtering of proto dirs to the caller --- .../buf/gradle/ProtobufGradlePluginSupport.kt | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 9973b823..b6c355c8 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -60,16 +60,18 @@ internal fun Project.configureCreateSymLinksToModules() { abstract class CreateSymLinksToModulesTask : DefaultTask() { @TaskAction fun createSymLinksToModules() { - allProtoDirs().forEach { - val symLinkFile = File(bufbuildDir, project.makeMangledRelativizedPathStr(it)) - if (!symLinkFile.exists()) { - logger.info("Creating symlink for $it at $symLinkFile") - Files.createSymbolicLink( - symLinkFile.toPath(), - bufbuildDir.toPath().relativize(project.file(it).toPath()), - ) + allProtoDirs() + .filter { anyProtos(it) } + .forEach { + val symLinkFile = File(bufbuildDir, project.makeMangledRelativizedPathStr(it)) + if (!symLinkFile.exists()) { + logger.info("Creating symlink for $it at $symLinkFile") + Files.createSymbolicLink( + symLinkFile.toPath(), + bufbuildDir.toPath().relativize(project.file(it).toPath()), + ) + } } - } } } @@ -95,7 +97,10 @@ abstract class WriteWorkspaceYamlTask : DefaultTask() { logger.info("Writing generated buf.work.yaml:\n$bufWork") File(bufbuildDir, "buf.work.yaml").writeText(bufWork) } else { - val protoDirs = allProtoDirs().map { project.makeMangledRelativizedPathStr(it) } + val protoDirs = + allProtoDirs() + .filter { anyProtos(it) } + .map { project.makeMangledRelativizedPathStr(it) } val bufYaml = bufYamlGenerator.generate(project.bufConfigFile(), protoDirs) logger.info("Writing generated buf.yaml:{}\n", bufYaml) File(bufbuildDir, "buf.yaml").writeText(bufYaml) @@ -114,6 +119,7 @@ private fun Task.workspaceCommonConfig() { private fun Task.workspaceSymLinkEntries() = allProtoDirs() + .filter { anyProtos(it) } .map { project.makeMangledRelativizedPathStr(it) } .joinToString("\n") { "| - $it" } @@ -123,7 +129,6 @@ private fun Task.workspaceSymLinkEntries() = private fun Task.allProtoDirs() = project.allProtoSourceSetDirs() .plus(project.file(Paths.get(BUILD_EXTRACTED_INCLUDE_PROTOS_MAIN))) - .filter { anyProtos(it) } .toSet() // Returns the list of directories containing proto files defined in *this* project. The returned directories do *not* From 0636c97e0165bccfb0c97ae2b4b176605bd6e1a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 06/29] Inherit all buf-executing tasks from a new AbstractBufExecTask --- .../build/buf/gradle/AbstractBufExecTask.kt | 22 +++++++++++++++++++ .../kotlin/build/buf/gradle/BreakingTask.kt | 3 +-- src/main/kotlin/build/buf/gradle/BuildTask.kt | 3 +-- .../build/buf/gradle/FormatApplyTask.kt | 3 +-- .../build/buf/gradle/FormatCheckTask.kt | 3 +-- .../kotlin/build/buf/gradle/GenerateTask.kt | 3 +-- src/main/kotlin/build/buf/gradle/LintTask.kt | 3 +-- .../buf/gradle/ProtobufGradlePluginSupport.kt | 2 +- 8 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt new file mode 100644 index 00000000..c30dd091 --- /dev/null +++ b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt @@ -0,0 +1,22 @@ +// Copyright 2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package build.buf.gradle + +import org.gradle.api.DefaultTask + +/** + * A task executing buf executable as part of its operation. + */ +abstract class AbstractBufExecTask : DefaultTask() diff --git a/src/main/kotlin/build/buf/gradle/BreakingTask.kt b/src/main/kotlin/build/buf/gradle/BreakingTask.kt index e532888d..cba1b4bc 100644 --- a/src/main/kotlin/build/buf/gradle/BreakingTask.kt +++ b/src/main/kotlin/build/buf/gradle/BreakingTask.kt @@ -14,10 +14,9 @@ package build.buf.gradle -import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction -abstract class BreakingTask : DefaultTask() { +abstract class BreakingTask : AbstractBufExecTask() { @TaskAction fun bufBreaking() { val args = mutableListOf() diff --git a/src/main/kotlin/build/buf/gradle/BuildTask.kt b/src/main/kotlin/build/buf/gradle/BuildTask.kt index 05e3f610..13ac53a2 100644 --- a/src/main/kotlin/build/buf/gradle/BuildTask.kt +++ b/src/main/kotlin/build/buf/gradle/BuildTask.kt @@ -14,10 +14,9 @@ package build.buf.gradle -import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction -abstract class BuildTask : DefaultTask() { +abstract class BuildTask : AbstractBufExecTask() { @TaskAction fun bufBuild() { execBuf("build", "--output", bufBuildPublicationFile) diff --git a/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt b/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt index 987fc65e..9b988bf6 100644 --- a/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt +++ b/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt @@ -14,10 +14,9 @@ package build.buf.gradle -import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction -abstract class FormatApplyTask : DefaultTask() { +abstract class FormatApplyTask : AbstractBufExecTask() { @TaskAction fun bufFormatApply() { execBufInSpecificDirectory("format", "-w") diff --git a/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt b/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt index 34de8578..400f78ae 100644 --- a/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt +++ b/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt @@ -14,10 +14,9 @@ package build.buf.gradle -import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction -abstract class FormatCheckTask : DefaultTask() { +abstract class FormatCheckTask : AbstractBufExecTask() { @TaskAction fun bufFormatCheck() { execBufInSpecificDirectory("format", "-d", "--exit-code") { diff --git a/src/main/kotlin/build/buf/gradle/GenerateTask.kt b/src/main/kotlin/build/buf/gradle/GenerateTask.kt index 0c2b825e..3711765b 100644 --- a/src/main/kotlin/build/buf/gradle/GenerateTask.kt +++ b/src/main/kotlin/build/buf/gradle/GenerateTask.kt @@ -14,11 +14,10 @@ package build.buf.gradle -import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction import java.io.File -abstract class GenerateTask : DefaultTask() { +abstract class GenerateTask : AbstractBufExecTask() { @TaskAction fun bufGenerate() { val args = listOf("generate", "--output", File(bufbuildDir, GENERATED_DIR)) diff --git a/src/main/kotlin/build/buf/gradle/LintTask.kt b/src/main/kotlin/build/buf/gradle/LintTask.kt index e2b192dc..94172fab 100644 --- a/src/main/kotlin/build/buf/gradle/LintTask.kt +++ b/src/main/kotlin/build/buf/gradle/LintTask.kt @@ -14,13 +14,12 @@ package build.buf.gradle -import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction import java.io.File import java.nio.file.Files.lines import kotlin.streams.asSequence -abstract class LintTask : DefaultTask() { +abstract class LintTask : AbstractBufExecTask() { @TaskAction fun bufLint() { execBufInSpecificDirectory( diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index b6c355c8..ceb25bca 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -181,7 +181,7 @@ private fun anyProtos(directory: File) = directory.walkTopDown().any { it.extens private fun mangle(name: Path) = name.toString().replace("-", "--").replace(File.separator, "-") -internal inline fun Project.registerBufTask( +internal inline fun Project.registerBufTask( name: String, noinline configuration: T.() -> Unit, ): TaskProvider { From 68e5081c1c961423dfb2e1ee1df8baffc39912bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 07/29] Rename registerBufTask -> registerBufExecTask --- src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt | 2 +- src/main/kotlin/build/buf/gradle/BuildConfiguration.kt | 2 +- src/main/kotlin/build/buf/gradle/FormatConfiguration.kt | 4 ++-- src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt | 2 +- src/main/kotlin/build/buf/gradle/LintConfiguration.kt | 2 +- .../kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt b/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt index 385b4282..73e0aa62 100644 --- a/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt @@ -50,7 +50,7 @@ private fun Project.addSchemaDependency(artifactDetails: ArtifactDetails) { } private fun Project.configureBreakingTask() { - registerBufTask(BUF_BREAKING_TASK_NAME) { + registerBufExecTask(BUF_BREAKING_TASK_NAME) { group = VERIFICATION_GROUP description = "Checks that Protobuf API definitions are backwards-compatible with previous versions." diff --git a/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt b/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt index a49d1796..e8c5043c 100644 --- a/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt @@ -28,7 +28,7 @@ private const val BUF_BUILD_PUBLICATION_FILE_BASE_NAME = "image" const val BUF_IMAGE_PUBLICATION_NAME = "bufImagePublication" internal fun Project.configureBuild() { - registerBufTask(BUF_BUILD_TASK_NAME) { + registerBufExecTask(BUF_BUILD_TASK_NAME) { group = BUILD_GROUP description = "Builds a Buf image from a Protobuf schema." diff --git a/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt b/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt index 109149a0..4ce83abd 100644 --- a/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt @@ -27,7 +27,7 @@ internal fun Project.configureFormat() { } private fun Project.configureBufFormatCheck() { - registerBufTask(BUF_FORMAT_CHECK_TASK_NAME) { + registerBufExecTask(BUF_FORMAT_CHECK_TASK_NAME) { group = VERIFICATION_GROUP description = "Checks that a Protobuf schema is formatted according to Buf's formatting rules." enabled = getExtension().enforceFormat @@ -37,7 +37,7 @@ private fun Project.configureBufFormatCheck() { } private fun Project.configureBufFormatApply() { - registerBufTask(BUF_FORMAT_APPLY_TASK_NAME) { + registerBufExecTask(BUF_FORMAT_APPLY_TASK_NAME) { group = VERIFICATION_GROUP description = "Formats a Protobuf schema according to Buf's formatting rules." } diff --git a/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt b/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt index e9ba363d..7e36e93c 100644 --- a/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt @@ -22,7 +22,7 @@ const val BUF_GENERATE_TASK_NAME = "bufGenerate" const val GENERATED_DIR = "generated" internal fun Project.configureGenerate() { - registerBufTask(BUF_GENERATE_TASK_NAME) { + registerBufExecTask(BUF_GENERATE_TASK_NAME) { group = BUILD_GROUP description = "Generates code from a Protobuf schema." diff --git a/src/main/kotlin/build/buf/gradle/LintConfiguration.kt b/src/main/kotlin/build/buf/gradle/LintConfiguration.kt index b8ca14ae..5593c7de 100644 --- a/src/main/kotlin/build/buf/gradle/LintConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/LintConfiguration.kt @@ -21,7 +21,7 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin.VERIFICATION_GROUP const val BUF_LINT_TASK_NAME = "bufLint" internal fun Project.configureLint() { - registerBufTask(BUF_LINT_TASK_NAME) { + registerBufExecTask(BUF_LINT_TASK_NAME) { group = VERIFICATION_GROUP description = "Checks that a Protobuf schema conforms to the Buf lint configuration." } diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index ceb25bca..b46548b7 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -181,7 +181,7 @@ private fun anyProtos(directory: File) = directory.walkTopDown().any { it.extens private fun mangle(name: Path) = name.toString().replace("-", "--").replace(File.separator, "-") -internal inline fun Project.registerBufTask( +internal inline fun Project.registerBufExecTask( name: String, noinline configuration: T.() -> Unit, ): TaskProvider { From f0d369c6fbc810641b078f20c9ec124e2e6f9cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 08/29] Introduce empty AbstractBufTask and inherit all tasks from it --- .../build/buf/gradle/AbstractBufExecTask.kt | 4 +--- .../build/buf/gradle/AbstractBufTask.kt | 19 +++++++++++++++++++ .../buf/gradle/ProtobufGradlePluginSupport.kt | 5 ++--- 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/build/buf/gradle/AbstractBufTask.kt diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt index c30dd091..69859d0d 100644 --- a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt +++ b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt @@ -14,9 +14,7 @@ package build.buf.gradle -import org.gradle.api.DefaultTask - /** * A task executing buf executable as part of its operation. */ -abstract class AbstractBufExecTask : DefaultTask() +abstract class AbstractBufExecTask : AbstractBufTask() diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufTask.kt new file mode 100644 index 00000000..febd6a89 --- /dev/null +++ b/src/main/kotlin/build/buf/gradle/AbstractBufTask.kt @@ -0,0 +1,19 @@ +// Copyright 2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package build.buf.gradle + +import org.gradle.api.DefaultTask + +abstract class AbstractBufTask : DefaultTask() diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index b46548b7..2cf00d09 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -15,7 +15,6 @@ package build.buf.gradle import io.github.g00fy2.versioncompare.Version -import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.file.SourceDirectorySet @@ -57,7 +56,7 @@ internal fun Project.configureCreateSymLinksToModules() { } } -abstract class CreateSymLinksToModulesTask : DefaultTask() { +abstract class CreateSymLinksToModulesTask : AbstractBufTask() { @TaskAction fun createSymLinksToModules() { allProtoDirs() @@ -81,7 +80,7 @@ internal fun Project.configureWriteWorkspaceYaml() { } } -abstract class WriteWorkspaceYamlTask : DefaultTask() { +abstract class WriteWorkspaceYamlTask : AbstractBufTask() { private val bufYamlGenerator = BufYamlGenerator() @TaskAction From 94466344b4847e7a50a697dcee95f1fe83548578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:28 +0200 Subject: [PATCH 09/29] Introduce a function for creating buf tasks --- .../buf/gradle/ProtobufGradlePluginSupport.kt | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 2cf00d09..de75f579 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -51,7 +51,7 @@ internal fun Project.bufV1SyntaxOnly() = Version(getExtension().toolVersion) < V internal fun Project.withProtobufGradlePlugin(action: (AppliedPlugin) -> Unit) = pluginManager.withPlugin("com.google.protobuf", action) internal fun Project.configureCreateSymLinksToModules() { - tasks.register(CREATE_SYM_LINKS_TO_MODULES_TASK_NAME) { + registerBufTask(CREATE_SYM_LINKS_TO_MODULES_TASK_NAME) { workspaceCommonConfig() } } @@ -75,7 +75,7 @@ abstract class CreateSymLinksToModulesTask : AbstractBufTask() { } internal fun Project.configureWriteWorkspaceYaml() { - tasks.register(WRITE_WORKSPACE_YAML_TASK_NAME) { + registerBufTask(WRITE_WORKSPACE_YAML_TASK_NAME) { workspaceCommonConfig() } } @@ -180,16 +180,20 @@ private fun anyProtos(directory: File) = directory.walkTopDown().any { it.extens private fun mangle(name: Path) = name.toString().replace("-", "--").replace(File.separator, "-") +internal inline fun Project.registerBufTask( + name: String, + noinline configuration: T.() -> Unit, +): TaskProvider = tasks.register(name, configuration) + internal inline fun Project.registerBufExecTask( name: String, noinline configuration: T.() -> Unit, -): TaskProvider { - val taskProvider = tasks.register(name, configuration) - withProtobufGradlePlugin { - afterEvaluate { - taskProvider.dependsOn(CREATE_SYM_LINKS_TO_MODULES_TASK_NAME) - taskProvider.dependsOn(WRITE_WORKSPACE_YAML_TASK_NAME) +): TaskProvider = + registerBufTask(name, configuration).also { taskProvider -> + withProtobufGradlePlugin { + afterEvaluate { + taskProvider.dependsOn(CREATE_SYM_LINKS_TO_MODULES_TASK_NAME) + taskProvider.dependsOn(WRITE_WORKSPACE_YAML_TASK_NAME) + } } } - return taskProvider -} From 8495a77ff13ef7d54963afdce50afac416c8d35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:29 +0200 Subject: [PATCH 10/29] Extend only AbstractBufExecTask by execution functions, not a Task --- src/main/kotlin/build/buf/gradle/BufSupport.kt | 5 ++--- .../buf/gradle/DirectorySpecificBufExecutionSupport.kt | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/BufSupport.kt b/src/main/kotlin/build/buf/gradle/BufSupport.kt index 8598cc62..3a0d3c34 100644 --- a/src/main/kotlin/build/buf/gradle/BufSupport.kt +++ b/src/main/kotlin/build/buf/gradle/BufSupport.kt @@ -15,7 +15,6 @@ package build.buf.gradle import org.gradle.api.Project -import org.gradle.api.Task import java.nio.charset.StandardCharsets const val BUF_BINARY_CONFIGURATION_NAME = "bufTool" @@ -51,14 +50,14 @@ internal fun Project.configureBufDependency() { ) } -internal fun Task.execBuf( +internal fun AbstractBufExecTask.execBuf( vararg args: Any, customErrorMessage: ((String) -> String)? = null, ) { execBuf(args.asList(), customErrorMessage) } -internal fun Task.execBuf( +internal fun AbstractBufExecTask.execBuf( args: Iterable, customErrorMessage: ((String) -> String)? = null, ) { diff --git a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt index 83e2da35..ae78d3d7 100644 --- a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt +++ b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt @@ -14,17 +14,16 @@ package build.buf.gradle -import org.gradle.api.Task import java.io.File -internal fun Task.execBufInSpecificDirectory( +internal fun AbstractBufExecTask.execBufInSpecificDirectory( vararg bufCommand: String, customErrorMessage: ((String) -> String)? = null, ) { execBufInSpecificDirectory(bufCommand.asList(), emptyList(), customErrorMessage) } -internal fun Task.execBufInSpecificDirectory( +internal fun AbstractBufExecTask.execBufInSpecificDirectory( bufCommand: String, extraArgs: Iterable, customErrorMessage: (String) -> String, @@ -32,7 +31,7 @@ internal fun Task.execBufInSpecificDirectory( execBufInSpecificDirectory(listOf(bufCommand), extraArgs, customErrorMessage) } -private fun Task.execBufInSpecificDirectory( +private fun AbstractBufExecTask.execBufInSpecificDirectory( bufCommand: Iterable, extraArgs: Iterable, customErrorMessage: ((String) -> String)? = null, From 155412dce54885601c8ac0f0e06e335997cfa989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:29 +0200 Subject: [PATCH 11/29] Extend a concrete task --- src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index de75f579..49e33c2d 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -116,7 +116,7 @@ private fun Task.workspaceCommonConfig() { createsOutput() } -private fun Task.workspaceSymLinkEntries() = +private fun WriteWorkspaceYamlTask.workspaceSymLinkEntries() = allProtoDirs() .filter { anyProtos(it) } .map { project.makeMangledRelativizedPathStr(it) } From 8f16dc944b7baddf33eaba1616d39b16d0cf4ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:29 +0200 Subject: [PATCH 12/29] Move mangling functions from project to abstract task --- .../buf/gradle/DirectorySpecificBufExecutionSupport.kt | 2 +- .../build/buf/gradle/ProtobufGradlePluginSupport.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt index ae78d3d7..c8ab3901 100644 --- a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt +++ b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt @@ -36,7 +36,7 @@ private fun AbstractBufExecTask.execBufInSpecificDirectory( extraArgs: Iterable, customErrorMessage: ((String) -> String)? = null, ) { - fun runWithArgs(file: File? = null) = bufCommand + listOfNotNull(file?.let { project.makeMangledRelativizedPathStr(it) }) + extraArgs + fun runWithArgs(file: File? = null) = bufCommand + listOfNotNull(file?.let { makeMangledRelativizedPathStr(it) }) + extraArgs when { project.hasProtobufGradlePlugin() -> diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 49e33c2d..07e2ae7a 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -62,7 +62,7 @@ abstract class CreateSymLinksToModulesTask : AbstractBufTask() { allProtoDirs() .filter { anyProtos(it) } .forEach { - val symLinkFile = File(bufbuildDir, project.makeMangledRelativizedPathStr(it)) + val symLinkFile = File(bufbuildDir, makeMangledRelativizedPathStr(it)) if (!symLinkFile.exists()) { logger.info("Creating symlink for $it at $symLinkFile") Files.createSymbolicLink( @@ -99,7 +99,7 @@ abstract class WriteWorkspaceYamlTask : AbstractBufTask() { val protoDirs = allProtoDirs() .filter { anyProtos(it) } - .map { project.makeMangledRelativizedPathStr(it) } + .map { makeMangledRelativizedPathStr(it) } val bufYaml = bufYamlGenerator.generate(project.bufConfigFile(), protoDirs) logger.info("Writing generated buf.yaml:{}\n", bufYaml) File(bufbuildDir, "buf.yaml").writeText(bufYaml) @@ -119,7 +119,7 @@ private fun Task.workspaceCommonConfig() { private fun WriteWorkspaceYamlTask.workspaceSymLinkEntries() = allProtoDirs() .filter { anyProtos(it) } - .map { project.makeMangledRelativizedPathStr(it) } + .map { makeMangledRelativizedPathStr(it) } .joinToString("\n") { "| - $it" } // Returns all directories that have may have proto files relevant to processing the project's proto files. This @@ -173,7 +173,7 @@ private fun ExtensionAware.projectProtoSourceSetDirs() = extensions.getByName("proto").srcDirs .toSet() -internal fun Project.makeMangledRelativizedPathStr(file: File) = mangle(projectDir.toPath().relativize(file.toPath())) +internal fun AbstractBufTask.makeMangledRelativizedPathStr(file: File) = mangle(project.projectDir.toPath().relativize(file.toPath())) // Indicates if the specified directory contains any proto files. private fun anyProtos(directory: File) = directory.walkTopDown().any { it.extension == "proto" } From 3ee2f492433cf957bc21025af651fbf2c6556e8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:29 +0200 Subject: [PATCH 13/29] Do not refer to project in mangling - pass the value as task input --- src/main/kotlin/build/buf/gradle/AbstractBufTask.kt | 12 +++++++++++- .../build/buf/gradle/ProtobufGradlePluginSupport.kt | 8 ++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufTask.kt index febd6a89..5dccbd94 100644 --- a/src/main/kotlin/build/buf/gradle/AbstractBufTask.kt +++ b/src/main/kotlin/build/buf/gradle/AbstractBufTask.kt @@ -15,5 +15,15 @@ package build.buf.gradle import org.gradle.api.DefaultTask +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import java.io.File -abstract class AbstractBufTask : DefaultTask() +abstract class AbstractBufTask : DefaultTask() { + /** + * This property has to be set to project directory. It is only used for relativization of paths, + * so it is just an @Input, not @InputDirectory. + */ + @get:Input + internal abstract val projectDir: Property +} diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 07e2ae7a..84447b0e 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -173,7 +173,7 @@ private fun ExtensionAware.projectProtoSourceSetDirs() = extensions.getByName("proto").srcDirs .toSet() -internal fun AbstractBufTask.makeMangledRelativizedPathStr(file: File) = mangle(project.projectDir.toPath().relativize(file.toPath())) +internal fun AbstractBufTask.makeMangledRelativizedPathStr(file: File) = mangle(projectDir.get().toPath().relativize(file.toPath())) // Indicates if the specified directory contains any proto files. private fun anyProtos(directory: File) = directory.walkTopDown().any { it.extension == "proto" } @@ -183,7 +183,11 @@ private fun mangle(name: Path) = name.toString().replace("-", "--").replace(File internal inline fun Project.registerBufTask( name: String, noinline configuration: T.() -> Unit, -): TaskProvider = tasks.register(name, configuration) +): TaskProvider = + tasks.register(name) { + projectDir.set(project.projectDir) + configuration() + } internal inline fun Project.registerBufExecTask( name: String, From 13294dfad80a8eb2422f6b5ca1835b466e1ccb9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Fri, 23 Aug 2024 12:46:29 +0200 Subject: [PATCH 14/29] Make CreateSymLinksToModulesTask config-cache compatible --- .../buf/gradle/ProtobufGradlePluginSupport.kt | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 84447b0e..5e8f11d1 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -17,9 +17,13 @@ package build.buf.gradle import io.github.g00fy2.versioncompare.Version import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.SourceDirectorySet import org.gradle.api.plugins.AppliedPlugin import org.gradle.api.plugins.ExtensionAware +import org.gradle.api.provider.Property +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskProvider @@ -53,21 +57,32 @@ internal fun Project.withProtobufGradlePlugin(action: (AppliedPlugin) -> Unit) = internal fun Project.configureCreateSymLinksToModules() { registerBufTask(CREATE_SYM_LINKS_TO_MODULES_TASK_NAME) { workspaceCommonConfig() + bufbuildDir.set(project.bufbuildDir) + candidateProtoDirs.setFrom(allProtoDirs()) } } abstract class CreateSymLinksToModulesTask : AbstractBufTask() { + /** Buf output directory. Should be set to [BUF_BUILD_DIR]. */ + @get:OutputDirectory + internal abstract val bufbuildDir: Property + + /** Directories possibly containing input .proto files. */ + @get:InputFiles + internal abstract val candidateProtoDirs: ConfigurableFileCollection + @TaskAction fun createSymLinksToModules() { - allProtoDirs() + val bufbuildDirValue = bufbuildDir.get() + candidateProtoDirs .filter { anyProtos(it) } .forEach { - val symLinkFile = File(bufbuildDir, makeMangledRelativizedPathStr(it)) + val symLinkFile = File(bufbuildDirValue, makeMangledRelativizedPathStr(it)) if (!symLinkFile.exists()) { logger.info("Creating symlink for $it at $symLinkFile") Files.createSymbolicLink( symLinkFile.toPath(), - bufbuildDir.toPath().relativize(project.file(it).toPath()), + bufbuildDirValue.toPath().relativize(it.toPath()), ) } } From 2d2fbb91e88c9dc6a8714962b86f1832f9678dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 15:42:30 +0200 Subject: [PATCH 15/29] Make WriteWorkspaceYamlTask config cache compatible --- .../buf/gradle/ProtobufGradlePluginSupport.kt | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 5e8f11d1..f4debc49 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -22,8 +22,12 @@ import org.gradle.api.file.SourceDirectorySet import org.gradle.api.plugins.AppliedPlugin import org.gradle.api.plugins.ExtensionAware import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Optional import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskProvider @@ -92,15 +96,40 @@ abstract class CreateSymLinksToModulesTask : AbstractBufTask() { internal fun Project.configureWriteWorkspaceYaml() { registerBufTask(WRITE_WORKSPACE_YAML_TASK_NAME) { workspaceCommonConfig() + projectDir.set(project.projectDir) + candidateProtoDirs.setFrom(allProtoDirs()) + if (project.bufV1SyntaxOnly()) { + v1SyntaxOnly.set(true) + outputFile.set(File(project.bufbuildDir, "buf.work.yaml")) + } else { + v1SyntaxOnly.set(false) + outputFile.set(File(project.bufbuildDir, "buf.yaml")) + bufConfigFile.set(project.bufConfigFile()) + } } } abstract class WriteWorkspaceYamlTask : AbstractBufTask() { - private val bufYamlGenerator = BufYamlGenerator() + @get:Input + internal abstract val v1SyntaxOnly: Property + + /** Directories possibly containing input .proto files. */ + @get:InputFiles + @get:Optional + internal abstract val candidateProtoDirs: ConfigurableFileCollection + + /** The input buf configuration file. */ + @get:InputFile + @get:Optional + internal abstract val bufConfigFile: Property + + /** Output yaml file. */ + @get:OutputFile + internal abstract val outputFile: Property @TaskAction fun writeWorkspaceYaml() { - if (project.bufV1SyntaxOnly()) { + if (v1SyntaxOnly.get()) { val bufWork = """ |version: v1 @@ -109,15 +138,15 @@ abstract class WriteWorkspaceYamlTask : AbstractBufTask() { """.trimMargin() logger.info("Writing generated buf.work.yaml:\n$bufWork") - File(bufbuildDir, "buf.work.yaml").writeText(bufWork) + outputFile.get().writeText(bufWork) } else { val protoDirs = - allProtoDirs() + candidateProtoDirs .filter { anyProtos(it) } .map { makeMangledRelativizedPathStr(it) } - val bufYaml = bufYamlGenerator.generate(project.bufConfigFile(), protoDirs) + val bufYaml = BufYamlGenerator().generate(bufConfigFile.orNull, protoDirs) logger.info("Writing generated buf.yaml:{}\n", bufYaml) - File(bufbuildDir, "buf.yaml").writeText(bufYaml) + outputFile.get().writeText(bufYaml) } } } @@ -132,7 +161,7 @@ private fun Task.workspaceCommonConfig() { } private fun WriteWorkspaceYamlTask.workspaceSymLinkEntries() = - allProtoDirs() + candidateProtoDirs .filter { anyProtos(it) } .map { makeMangledRelativizedPathStr(it) } .joinToString("\n") { "| - $it" } From 04437d0867bd66b36a1851c1d60cebeaecb9f70f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Wed, 3 Jul 2024 16:42:46 +0200 Subject: [PATCH 16/29] Remove no longer needed createsOutput call - outputs now created automatically by gradle --- src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index f4debc49..25d4f66a 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -157,7 +157,6 @@ private fun Task.workspaceCommonConfig() { .tasks .matching { it::class.java.name == "com.google.protobuf.gradle.ProtobufExtract_Decorated" }, ) - createsOutput() } private fun WriteWorkspaceYamlTask.workspaceSymLinkEntries() = From a9bd131c32ea56c8d9e1ca863ed237ee3c87f660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 09:26:01 +0200 Subject: [PATCH 17/29] Look up buf executable in configuration phase and pass it as tasks input --- .../build/buf/gradle/AbstractBufExecTask.kt | 9 +++++- src/main/kotlin/build/buf/gradle/BufPlugin.kt | 1 + .../kotlin/build/buf/gradle/BufSupport.kt | 29 ++++++++++++------- .../buf/gradle/ProtobufGradlePluginSupport.kt | 5 +++- .../build.gradle | 5 ++++ .../build.gradle | 4 +++ .../build.gradle | 4 +++ .../build.gradle | 4 +++ .../build.gradle | 4 +++ .../build.gradle | 4 +++ 10 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt index 69859d0d..c1bc8712 100644 --- a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt +++ b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt @@ -14,7 +14,14 @@ package build.buf.gradle +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.tasks.InputFiles + /** * A task executing buf executable as part of its operation. */ -abstract class AbstractBufExecTask : AbstractBufTask() +abstract class AbstractBufExecTask : AbstractBufTask() { + /** The buf executable. */ + @get:InputFiles + internal abstract val bufExecutable: ConfigurableFileCollection +} diff --git a/src/main/kotlin/build/buf/gradle/BufPlugin.kt b/src/main/kotlin/build/buf/gradle/BufPlugin.kt index 10be7afb..ea278d2a 100644 --- a/src/main/kotlin/build/buf/gradle/BufPlugin.kt +++ b/src/main/kotlin/build/buf/gradle/BufPlugin.kt @@ -35,6 +35,7 @@ class BufPlugin : Plugin { } private fun Project.configureBuf() { + createBufBinaryDependencyConfiguration() configureLint() configureFormat() configureBuild() diff --git a/src/main/kotlin/build/buf/gradle/BufSupport.kt b/src/main/kotlin/build/buf/gradle/BufSupport.kt index 3a0d3c34..55dd0a2c 100644 --- a/src/main/kotlin/build/buf/gradle/BufSupport.kt +++ b/src/main/kotlin/build/buf/gradle/BufSupport.kt @@ -15,10 +15,15 @@ package build.buf.gradle import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies import java.nio.charset.StandardCharsets const val BUF_BINARY_CONFIGURATION_NAME = "bufTool" +internal fun Project.createBufBinaryDependencyConfiguration() { + configurations.create(BUF_BINARY_CONFIGURATION_NAME) +} + internal fun Project.configureBufDependency() { val os = System.getProperty("os.name").lowercase() val osPart = @@ -38,16 +43,18 @@ internal fun Project.configureBufDependency() { val extension = getExtension() - createConfigurationWithDependency( - BUF_BINARY_CONFIGURATION_NAME, - mapOf( - "group" to "build.buf", - "name" to "buf", - "version" to extension.toolVersion, - "classifier" to "$osPart-$archPart", - "ext" to "exe", - ), - ) + dependencies { + add( + BUF_BINARY_CONFIGURATION_NAME, + mapOf( + "group" to "build.buf", + "name" to "buf", + "version" to extension.toolVersion, + "classifier" to "$osPart-$archPart", + "ext" to "exe", + ), + ) + } } internal fun AbstractBufExecTask.execBuf( @@ -62,7 +69,7 @@ internal fun AbstractBufExecTask.execBuf( customErrorMessage: ((String) -> String)? = null, ) { with(project) { - val executable = singleFileFromConfiguration(BUF_BINARY_CONFIGURATION_NAME) + val executable = bufExecutable.singleFile if (!executable.canExecute()) { executable.setExecutable(true) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 25d4f66a..4127a1cf 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -236,7 +236,10 @@ internal inline fun Project.registerBufExecTas name: String, noinline configuration: T.() -> Unit, ): TaskProvider = - registerBufTask(name, configuration).also { taskProvider -> + registerBufTask(name) { + bufExecutable.setFrom(configurations.getByName(BUF_BINARY_CONFIGURATION_NAME)) + configuration() + }.also { taskProvider -> withProtobufGradlePlugin { afterEvaluate { taskProvider.dependsOn(CREATE_SYM_LINKS_TO_MODULES_TASK_NAME) diff --git a/src/test/resources/GenerateTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle b/src/test/resources/GenerateTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle index dd5f9ede..cab29dde 100644 --- a/src/test/resources/GenerateTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle +++ b/src/test/resources/GenerateTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle @@ -2,6 +2,11 @@ plugins { id 'build.buf' } + +repositories { + mavenCentral() +} + buf { generate { templateFileLocation = project.file("subdir/buf.gen.yaml") diff --git a/src/test/resources/GenerateTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle b/src/test/resources/GenerateTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle index dd5f9ede..1e990700 100644 --- a/src/test/resources/GenerateTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle +++ b/src/test/resources/GenerateTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle @@ -2,6 +2,10 @@ plugins { id 'build.buf' } +repositories { + mavenCentral() +} + buf { generate { templateFileLocation = project.file("subdir/buf.gen.yaml") diff --git a/src/test/resources/GenerateTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle b/src/test/resources/GenerateTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle index e3e156b8..e677fffb 100644 --- a/src/test/resources/GenerateTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle +++ b/src/test/resources/GenerateTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle @@ -2,6 +2,10 @@ plugins { id 'build.buf' } +repositories { + mavenCentral() +} + buf { generate { } diff --git a/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle b/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle index dd5f9ede..1e990700 100644 --- a/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle +++ b/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_a_nonexistent_specified_template_file/build.gradle @@ -2,6 +2,10 @@ plugins { id 'build.buf' } +repositories { + mavenCentral() +} + buf { generate { templateFileLocation = project.file("subdir/buf.gen.yaml") diff --git a/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle b/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle index dd5f9ede..1e990700 100644 --- a/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle +++ b/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_both_default_and_specified_buf_gen_template_files/build.gradle @@ -2,6 +2,10 @@ plugins { id 'build.buf' } +repositories { + mavenCentral() +} + buf { generate { templateFileLocation = project.file("subdir/buf.gen.yaml") diff --git a/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle b/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle index e3e156b8..e677fffb 100644 --- a/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle +++ b/src/test/resources/GenerateWithWorkspaceTest/buf_generate_fails_with_no_default_template_file_and_no_override_specified/build.gradle @@ -2,6 +2,10 @@ plugins { id 'build.buf' } +repositories { + mavenCentral() +} + buf { generate { } From 53838123a248a1308adf33ae0f1d4ed6eda03e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 09:26:01 +0200 Subject: [PATCH 18/29] Pass hasWorkspace as task input --- src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt | 6 ++++++ .../buf/gradle/DirectorySpecificBufExecutionSupport.kt | 2 +- .../kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt index c1bc8712..9cd72da7 100644 --- a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt +++ b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt @@ -15,6 +15,8 @@ package build.buf.gradle import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFiles /** @@ -24,4 +26,8 @@ abstract class AbstractBufExecTask : AbstractBufTask() { /** The buf executable. */ @get:InputFiles internal abstract val bufExecutable: ConfigurableFileCollection + + /** Whether the project has buf workspace or not. */ + @get:Input + internal abstract val hasWorkspace: Property } diff --git a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt index c8ab3901..c1537fdf 100644 --- a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt +++ b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt @@ -41,7 +41,7 @@ private fun AbstractBufExecTask.execBufInSpecificDirectory( when { project.hasProtobufGradlePlugin() -> project.projectDefinedProtoDirs().forEach { execBuf(runWithArgs(it), customErrorMessage) } - project.hasWorkspace() -> + hasWorkspace.get() -> execBuf(bufCommand, customErrorMessage) else -> execBuf(runWithArgs(), customErrorMessage) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 4127a1cf..179ff4bf 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -238,6 +238,7 @@ internal inline fun Project.registerBufExecTas ): TaskProvider = registerBufTask(name) { bufExecutable.setFrom(configurations.getByName(BUF_BINARY_CONFIGURATION_NAME)) + hasWorkspace.set(project.hasWorkspace()) configuration() }.also { taskProvider -> withProtobufGradlePlugin { From 76623b6d5a5a1d250d190cf6ef3897a614d54174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Mon, 1 Jul 2024 17:22:36 +0200 Subject: [PATCH 19/29] Pass hasProtobufGradlePlugin as task input --- src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt | 4 ++++ src/main/kotlin/build/buf/gradle/BufSupport.kt | 2 +- .../build/buf/gradle/DirectorySpecificBufExecutionSupport.kt | 2 +- .../kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt index 9cd72da7..596f4e8c 100644 --- a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt +++ b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt @@ -27,6 +27,10 @@ abstract class AbstractBufExecTask : AbstractBufTask() { @get:InputFiles internal abstract val bufExecutable: ConfigurableFileCollection + /** Whether the project has protobuf plugin enabled. */ + @get:Input + internal abstract val hasProtobufGradlePlugin: Property + /** Whether the project has buf workspace or not. */ @get:Input internal abstract val hasWorkspace: Property diff --git a/src/main/kotlin/build/buf/gradle/BufSupport.kt b/src/main/kotlin/build/buf/gradle/BufSupport.kt index 55dd0a2c..c8a66a17 100644 --- a/src/main/kotlin/build/buf/gradle/BufSupport.kt +++ b/src/main/kotlin/build/buf/gradle/BufSupport.kt @@ -76,7 +76,7 @@ internal fun AbstractBufExecTask.execBuf( } val workingDir = - if (hasProtobufGradlePlugin()) { + if (hasProtobufGradlePlugin.get()) { bufbuildDir } else { projectDir diff --git a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt index c1537fdf..ec1f95e4 100644 --- a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt +++ b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt @@ -39,7 +39,7 @@ private fun AbstractBufExecTask.execBufInSpecificDirectory( fun runWithArgs(file: File? = null) = bufCommand + listOfNotNull(file?.let { makeMangledRelativizedPathStr(it) }) + extraArgs when { - project.hasProtobufGradlePlugin() -> + hasProtobufGradlePlugin.get() -> project.projectDefinedProtoDirs().forEach { execBuf(runWithArgs(it), customErrorMessage) } hasWorkspace.get() -> execBuf(bufCommand, customErrorMessage) diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 179ff4bf..941b10f0 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -238,6 +238,7 @@ internal inline fun Project.registerBufExecTas ): TaskProvider = registerBufTask(name) { bufExecutable.setFrom(configurations.getByName(BUF_BINARY_CONFIGURATION_NAME)) + hasProtobufGradlePlugin.set(project.hasProtobufGradlePlugin()) hasWorkspace.set(project.hasWorkspace()) configuration() }.also { taskProvider -> From c79e12a59db812bce137f7c7dabd35e97bf79bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Mon, 1 Jul 2024 17:24:05 +0200 Subject: [PATCH 20/29] Pass candidateProtoDirs as task input if needed --- .../kotlin/build/buf/gradle/AbstractBufExecTask.kt | 4 ++++ .../gradle/DirectorySpecificBufExecutionSupport.kt | 4 +++- .../build/buf/gradle/ProtobufGradlePluginSupport.kt | 13 ++++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt index 596f4e8c..ea19d23a 100644 --- a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt +++ b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt @@ -31,6 +31,10 @@ abstract class AbstractBufExecTask : AbstractBufTask() { @get:Input internal abstract val hasProtobufGradlePlugin: Property + /** Directories possibly containing input .proto files. */ + @get:InputFiles + internal abstract val candidateProtoDirs: ConfigurableFileCollection + /** Whether the project has buf workspace or not. */ @get:Input internal abstract val hasWorkspace: Property diff --git a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt index ec1f95e4..d3709f46 100644 --- a/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt +++ b/src/main/kotlin/build/buf/gradle/DirectorySpecificBufExecutionSupport.kt @@ -40,7 +40,9 @@ private fun AbstractBufExecTask.execBufInSpecificDirectory( when { hasProtobufGradlePlugin.get() -> - project.projectDefinedProtoDirs().forEach { execBuf(runWithArgs(it), customErrorMessage) } + candidateProtoDirs + .filter { anyProtos(it) } + .forEach { execBuf(runWithArgs(it), customErrorMessage) } hasWorkspace.get() -> execBuf(bufCommand, customErrorMessage) else -> diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 941b10f0..2618670f 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -186,9 +186,7 @@ private fun Task.allProtoDirs() = // // Protobuf-gradle-plugin change that introduced this behavior: https://github.com/google/protobuf-gradle-plugin/pull/637/ // Line: https://github.com/google/protobuf-gradle-plugin/blob/9d2a328a0d577bf4439d3b482a953715b3a03027/src/main/groovy/com/google/protobuf/gradle/ProtobufPlugin.groovy#L425 -internal fun Project.projectDefinedProtoDirs() = - (allProtoSourceSetDirs() - file(Paths.get(BUILD_EXTRACTED_PROTOS_MAIN))) - .filter { anyProtos(it) } +internal fun Project.projectDefinedProtoDirs() = allProtoSourceSetDirs() - file(Paths.get(BUILD_EXTRACTED_PROTOS_MAIN)) // Returns deduplicated list of all proto source set directories. private fun Project.allProtoSourceSetDirs() = projectProtoSourceSetDirs() + androidProtoSourceSetDirs() @@ -219,7 +217,7 @@ private fun ExtensionAware.projectProtoSourceSetDirs() = internal fun AbstractBufTask.makeMangledRelativizedPathStr(file: File) = mangle(projectDir.get().toPath().relativize(file.toPath())) // Indicates if the specified directory contains any proto files. -private fun anyProtos(directory: File) = directory.walkTopDown().any { it.extension == "proto" } +internal fun anyProtos(directory: File) = directory.walkTopDown().any { it.extension == "proto" } private fun mangle(name: Path) = name.toString().replace("-", "--").replace(File.separator, "-") @@ -238,7 +236,12 @@ internal inline fun Project.registerBufExecTas ): TaskProvider = registerBufTask(name) { bufExecutable.setFrom(configurations.getByName(BUF_BINARY_CONFIGURATION_NAME)) - hasProtobufGradlePlugin.set(project.hasProtobufGradlePlugin()) + if (project.hasProtobufGradlePlugin()) { + hasProtobufGradlePlugin.set(true) + candidateProtoDirs.setFrom(projectDefinedProtoDirs()) + } else { + hasProtobufGradlePlugin.set(false) + } hasWorkspace.set(project.hasWorkspace()) configuration() }.also { taskProvider -> From 81397075eafbb20acff7410e7969b829c0782801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 10:12:54 +0200 Subject: [PATCH 21/29] Pass workingDir as task input --- .../kotlin/build/buf/gradle/AbstractBufExecTask.kt | 9 +++++++++ src/main/kotlin/build/buf/gradle/BufSupport.kt | 12 +++--------- .../build/buf/gradle/ProtobufGradlePluginSupport.kt | 2 ++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt index ea19d23a..afcbf7c6 100644 --- a/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt +++ b/src/main/kotlin/build/buf/gradle/AbstractBufExecTask.kt @@ -18,6 +18,7 @@ import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFiles +import java.io.File /** * A task executing buf executable as part of its operation. @@ -27,6 +28,14 @@ abstract class AbstractBufExecTask : AbstractBufTask() { @get:InputFiles internal abstract val bufExecutable: ConfigurableFileCollection + /** + * The directory in which buf is executed. + * The actual real input files in this directory have to be tracked per command separately, + * so it is just an @Input, not @InputDirectory. + */ + @get:Input + internal abstract val workingDir: Property + /** Whether the project has protobuf plugin enabled. */ @get:Input internal abstract val hasProtobufGradlePlugin: Property diff --git a/src/main/kotlin/build/buf/gradle/BufSupport.kt b/src/main/kotlin/build/buf/gradle/BufSupport.kt index c8a66a17..be384758 100644 --- a/src/main/kotlin/build/buf/gradle/BufSupport.kt +++ b/src/main/kotlin/build/buf/gradle/BufSupport.kt @@ -75,17 +75,11 @@ internal fun AbstractBufExecTask.execBuf( executable.setExecutable(true) } - val workingDir = - if (hasProtobufGradlePlugin.get()) { - bufbuildDir - } else { - projectDir - } - val processArgs = listOf(executable.absolutePath) + args + val workingDirValue = workingDir.get() - logger.info("Running buf from $workingDir: `buf ${args.joinToString(" ")}`") - val result = ProcessRunner().use { it.shell(workingDir, processArgs) } + logger.info("Running buf from $workingDirValue: `buf ${args.joinToString(" ")}`") + val result = ProcessRunner().use { it.shell(workingDirValue, processArgs) } if (result.exitCode != 0) { if (customErrorMessage != null) { diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 2618670f..2f42ac64 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -239,8 +239,10 @@ internal inline fun Project.registerBufExecTas if (project.hasProtobufGradlePlugin()) { hasProtobufGradlePlugin.set(true) candidateProtoDirs.setFrom(projectDefinedProtoDirs()) + workingDir.set(bufbuildDir) } else { hasProtobufGradlePlugin.set(false) + workingDir.set(project.projectDir) } hasWorkspace.set(project.hasWorkspace()) configuration() From ffa36c42a076d38e06d5e07786e41ca1cde2976e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 10:13:33 +0200 Subject: [PATCH 22/29] Remove no longer needed with block --- .../kotlin/build/buf/gradle/BufSupport.kt | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/BufSupport.kt b/src/main/kotlin/build/buf/gradle/BufSupport.kt index be384758..eb0d484e 100644 --- a/src/main/kotlin/build/buf/gradle/BufSupport.kt +++ b/src/main/kotlin/build/buf/gradle/BufSupport.kt @@ -68,31 +68,29 @@ internal fun AbstractBufExecTask.execBuf( args: Iterable, customErrorMessage: ((String) -> String)? = null, ) { - with(project) { - val executable = bufExecutable.singleFile + val executable = bufExecutable.singleFile - if (!executable.canExecute()) { - executable.setExecutable(true) - } + if (!executable.canExecute()) { + executable.setExecutable(true) + } - val processArgs = listOf(executable.absolutePath) + args - val workingDirValue = workingDir.get() + val processArgs = listOf(executable.absolutePath) + args + val workingDirValue = workingDir.get() - logger.info("Running buf from $workingDirValue: `buf ${args.joinToString(" ")}`") - val result = ProcessRunner().use { it.shell(workingDirValue, processArgs) } + logger.info("Running buf from $workingDirValue: `buf ${args.joinToString(" ")}`") + val result = ProcessRunner().use { it.shell(workingDirValue, processArgs) } - if (result.exitCode != 0) { - if (customErrorMessage != null) { - val stdOut = result.stdOut.toString(StandardCharsets.UTF_8) - val stdErr = result.stdErr.toString(StandardCharsets.UTF_8) - val ex = IllegalStateException(customErrorMessage(stdOut)) - if (stdErr.isNotEmpty()) { - ex.addSuppressed(IllegalStateException(result.toString())) - } - throw ex - } else { - error(result.toString()) + if (result.exitCode != 0) { + if (customErrorMessage != null) { + val stdOut = result.stdOut.toString(StandardCharsets.UTF_8) + val stdErr = result.stdErr.toString(StandardCharsets.UTF_8) + val ex = IllegalStateException(customErrorMessage(stdOut)) + if (stdErr.isNotEmpty()) { + ex.addSuppressed(IllegalStateException(result.toString())) } + throw ex + } else { + error(result.toString()) } } } From 9efbf8e259b84d68c0e6e71df3c462b0461dd93d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 16:10:34 +0200 Subject: [PATCH 23/29] Fix BreakingTask to support config cache --- .../build/buf/gradle/BreakingConfiguration.kt | 8 +++++++ .../kotlin/build/buf/gradle/BreakingTask.kt | 23 ++++++++++++++++--- .../build/buf/gradle/BuildConfiguration.kt | 2 +- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt b/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt index 73e0aa62..637a2164 100644 --- a/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/BreakingConfiguration.kt @@ -55,5 +55,13 @@ private fun Project.configureBreakingTask() { description = "Checks that Protobuf API definitions are backwards-compatible with previous versions." dependsOn(BUF_BUILD_TASK_NAME) + + if (project.bufV1SyntaxOnly()) { + v1SyntaxOnly.set(true) + publicationFile.set(project.bufBuildPublicationFile) + } else { + v1SyntaxOnly.set(false) + } + configFile.set(singleFileFromConfiguration(BUF_BREAKING_CONFIGURATION_NAME)) } } diff --git a/src/main/kotlin/build/buf/gradle/BreakingTask.kt b/src/main/kotlin/build/buf/gradle/BreakingTask.kt index cba1b4bc..66a9450d 100644 --- a/src/main/kotlin/build/buf/gradle/BreakingTask.kt +++ b/src/main/kotlin/build/buf/gradle/BreakingTask.kt @@ -14,18 +14,35 @@ package build.buf.gradle +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction +import java.io.File abstract class BreakingTask : AbstractBufExecTask() { + @get:Input + internal abstract val v1SyntaxOnly: Property + + /** The input publication file. */ + @get:InputFile + @get:Optional + internal abstract val publicationFile: Property + + /** The input breaking config file. */ + @get:InputFile + internal abstract val configFile: Property + @TaskAction fun bufBreaking() { val args = mutableListOf() args.add("breaking") - if (project.bufV1SyntaxOnly()) { - args.add(bufBuildPublicationFile) + if (v1SyntaxOnly.get()) { + args.add(publicationFile.get()) } args.add("--against") - args.add(singleFileFromConfiguration(BUF_BREAKING_CONFIGURATION_NAME)) + args.add(configFile.get()) execBuf(*args.toTypedArray()) { """ |Some Protobuf files had breaking changes: diff --git a/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt b/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt index e8c5043c..c50c8aba 100644 --- a/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt @@ -64,7 +64,7 @@ private val Project.bufBuildPublicationFileExtension deets.imageFormat.formatName + deets.compressionFormat?.let { ".${it.ext}" }.orEmpty() } -private val Project.bufBuildPublicationFile +internal val Project.bufBuildPublicationFile get() = File(bufbuildDir, "$BUF_BUILD_PUBLICATION_FILE_BASE_NAME.$bufBuildPublicationFileExtension") internal val Task.bufBuildPublicationFile From a450ff4a04f9d509810535c10c7b3b63e161b59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 16:13:37 +0200 Subject: [PATCH 24/29] Fix BuildTask to support config cache --- src/main/kotlin/build/buf/gradle/BufSupport.kt | 7 +++++++ .../kotlin/build/buf/gradle/BuildConfiguration.kt | 10 +++------- src/main/kotlin/build/buf/gradle/BuildTask.kt | 15 ++++++++++++++- .../buf/gradle/ProtobufGradlePluginSupport.kt | 4 +++- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/BufSupport.kt b/src/main/kotlin/build/buf/gradle/BufSupport.kt index eb0d484e..a4da9ea1 100644 --- a/src/main/kotlin/build/buf/gradle/BufSupport.kt +++ b/src/main/kotlin/build/buf/gradle/BufSupport.kt @@ -94,3 +94,10 @@ internal fun AbstractBufExecTask.execBuf( } } } + +internal fun AbstractBufExecTask.obtainDefaultProtoFileSet() = + project.fileTree(workingDir.get()) { + include("**/*.proto") + // not to interfere with random plugins producing output to build dir + exclude("build") + } diff --git a/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt b/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt index c50c8aba..320c21e0 100644 --- a/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/BuildConfiguration.kt @@ -15,7 +15,6 @@ package build.buf.gradle import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication import org.gradle.kotlin.dsl.create @@ -34,10 +33,10 @@ internal fun Project.configureBuild() { if (hasProtobufGradlePlugin()) { dependsOn(COPY_BUF_CONFIG_TASK_NAME) - } else { - // Called already during workspace configuration if the protobuf-gradle-plugin has been applied - createsOutput() } + + inputFiles.setFrom(obtainDefaultProtoFileSet()) + publicationFile.set(project.bufBuildPublicationFile) } } @@ -66,6 +65,3 @@ private val Project.bufBuildPublicationFileExtension internal val Project.bufBuildPublicationFile get() = File(bufbuildDir, "$BUF_BUILD_PUBLICATION_FILE_BASE_NAME.$bufBuildPublicationFileExtension") - -internal val Task.bufBuildPublicationFile - get() = project.bufBuildPublicationFile diff --git a/src/main/kotlin/build/buf/gradle/BuildTask.kt b/src/main/kotlin/build/buf/gradle/BuildTask.kt index 13ac53a2..bbdd8848 100644 --- a/src/main/kotlin/build/buf/gradle/BuildTask.kt +++ b/src/main/kotlin/build/buf/gradle/BuildTask.kt @@ -14,11 +14,24 @@ package build.buf.gradle +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.provider.Property +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction +import java.io.File abstract class BuildTask : AbstractBufExecTask() { + /** The input files. */ + @get:InputFiles + internal abstract val inputFiles: ConfigurableFileCollection + + /** The output publication file. */ + @get:OutputFile + internal abstract val publicationFile: Property + @TaskAction fun bufBuild() { - execBuf("build", "--output", bufBuildPublicationFile) + execBuf("build", "--output", publicationFile.get()) } } diff --git a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt index 2f42ac64..8abdc4c0 100644 --- a/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ProtobufGradlePluginSupport.kt @@ -239,7 +239,9 @@ internal inline fun Project.registerBufExecTas if (project.hasProtobufGradlePlugin()) { hasProtobufGradlePlugin.set(true) candidateProtoDirs.setFrom(projectDefinedProtoDirs()) - workingDir.set(bufbuildDir) + workingDir.set(project.bufbuildDir) + // whenever this task is part of the build, we must run it before any buf execution + mustRunAfter(COPY_BUF_CONFIG_TASK_NAME) } else { hasProtobufGradlePlugin.set(false) workingDir.set(project.projectDir) From e74ff1a50759fae393e5d3294c63a1b537444d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 17:35:55 +0200 Subject: [PATCH 25/29] Fix GenerateTask to support config cache --- .../build/buf/gradle/GenerateConfiguration.kt | 28 +++++++++- .../kotlin/build/buf/gradle/GenerateTask.kt | 54 +++++++++---------- .../kotlin/build/buf/gradle/OutputSupport.kt | 4 -- 3 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt b/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt index 7e36e93c..946d794d 100644 --- a/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/GenerateConfiguration.kt @@ -16,6 +16,7 @@ package build.buf.gradle import org.gradle.api.Project import org.gradle.language.base.plugins.LifecycleBasePlugin.BUILD_GROUP +import java.io.File const val BUF_GENERATE_TASK_NAME = "bufGenerate" @@ -26,6 +27,31 @@ internal fun Project.configureGenerate() { group = BUILD_GROUP description = "Generates code from a Protobuf schema." - createsOutput() + val generateOptions = project.getExtension().generateOptions + includeImports.set(generateOptions?.includeImports ?: false) + templateFile.set(generateOptions?.let { resolveTemplateFile(it) }) + inputFiles.setFrom(obtainDefaultProtoFileSet()) + outputDirectory.set(File(project.bufbuildDir, GENERATED_DIR)) } } + +private fun Project.resolveTemplateFile(generateOptions: GenerateOptions): File { + val defaultTemplateFile = project.file("buf.gen.yaml").validOrNull() + return if (generateOptions.templateFileLocation != null) { + val specifiedTemplateFile = generateOptions.templateFileLocation.validOrNull() + check(specifiedTemplateFile != null) { + "Specified templateFileLocation does not exist." + } + check(defaultTemplateFile == null || specifiedTemplateFile == defaultTemplateFile) { + "Buf gen template file specified in the project directory as well as with templateFileLocation; pick one." + } + specifiedTemplateFile + } else { + check(defaultTemplateFile != null) { + "No buf.gen.yaml file found in the project directory." + } + defaultTemplateFile + } +} + +private fun File?.validOrNull() = this?.takeIf { it.isFile && it.exists() } diff --git a/src/main/kotlin/build/buf/gradle/GenerateTask.kt b/src/main/kotlin/build/buf/gradle/GenerateTask.kt index 3711765b..9d1edfb5 100644 --- a/src/main/kotlin/build/buf/gradle/GenerateTask.kt +++ b/src/main/kotlin/build/buf/gradle/GenerateTask.kt @@ -14,53 +14,53 @@ package build.buf.gradle +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction import java.io.File abstract class GenerateTask : AbstractBufExecTask() { + /** Whether to include imports. */ + @get:Input + internal abstract val includeImports: Property + + /** Template file. */ + @get:InputFile + @get:Optional + internal abstract val templateFile: Property + + /** The input proto files. */ + @get:InputFiles + internal abstract val inputFiles: ConfigurableFileCollection + + /** The directory to output generated files. */ + @get:OutputDirectory + internal abstract val outputDirectory: Property + @TaskAction fun bufGenerate() { - val args = listOf("generate", "--output", File(bufbuildDir, GENERATED_DIR)) + val args = listOf("generate", "--output", outputDirectory.get()) execBuf(args + additionalArgs()) } private fun additionalArgs(): List { - val generateOptions = getExtension().generateOptions val importOptions = - if (generateOptions?.includeImports == true) { + if (includeImports.get()) { listOf("--include-imports") } else { emptyList() } val templateFileOption = - resolveTemplateFile()?.let { + templateFile.orNull?.let { listOf("--template", it.absolutePath) } ?: emptyList() return importOptions + templateFileOption } - - private fun resolveTemplateFile(): File? { - return getExtension().generateOptions?.let { generateOptions -> - val defaultTemplateFile = project.file("buf.gen.yaml").validOrNull() - if (generateOptions.templateFileLocation != null) { - val specifiedTemplateFile = generateOptions.templateFileLocation.validOrNull() - check(specifiedTemplateFile != null) { - "Specified templateFileLocation does not exist." - } - check(defaultTemplateFile == null || specifiedTemplateFile == defaultTemplateFile) { - "Buf gen template file specified in the project directory as well as with templateFileLocation; pick one." - } - specifiedTemplateFile - } else { - check(defaultTemplateFile != null) { - "No buf.gen.yaml file found in the project directory." - } - defaultTemplateFile - } - } - } - - private fun File?.validOrNull() = this?.takeIf { it.isFile && it.exists() } } diff --git a/src/main/kotlin/build/buf/gradle/OutputSupport.kt b/src/main/kotlin/build/buf/gradle/OutputSupport.kt index ac2e2f88..2ac15792 100644 --- a/src/main/kotlin/build/buf/gradle/OutputSupport.kt +++ b/src/main/kotlin/build/buf/gradle/OutputSupport.kt @@ -25,8 +25,4 @@ internal val Project.bufbuildDir internal val Task.bufbuildDir get() = project.bufbuildDir -internal fun Task.createsOutput() { - doFirst { project.bufbuildDir.mkdirs() } -} - internal fun ArtifactDetails.groupAndArtifact() = "$groupId:$artifactId" From 51ffd67c50b56b227de48ab7120f28238e400647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Wed, 3 Jul 2024 17:45:10 +0200 Subject: [PATCH 26/29] Fix format tasks to have correct inputs / outputs --- src/main/kotlin/build/buf/gradle/FormatApplyTask.kt | 11 +++++++++++ src/main/kotlin/build/buf/gradle/FormatCheckTask.kt | 6 ++++++ .../kotlin/build/buf/gradle/FormatConfiguration.kt | 5 +++++ 3 files changed, 22 insertions(+) diff --git a/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt b/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt index 9b988bf6..9a753e63 100644 --- a/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt +++ b/src/main/kotlin/build/buf/gradle/FormatApplyTask.kt @@ -14,9 +14,20 @@ package build.buf.gradle +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.OutputFiles import org.gradle.api.tasks.TaskAction abstract class FormatApplyTask : AbstractBufExecTask() { + /** The input files to be formatted. */ + @get:InputFiles + internal abstract val inputFiles: ConfigurableFileCollection + + /** The output files that have been formatted. */ + @get:OutputFiles + internal abstract val outputFiles: ConfigurableFileCollection + @TaskAction fun bufFormatApply() { execBufInSpecificDirectory("format", "-w") diff --git a/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt b/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt index 400f78ae..04c5b8ae 100644 --- a/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt +++ b/src/main/kotlin/build/buf/gradle/FormatCheckTask.kt @@ -14,9 +14,15 @@ package build.buf.gradle +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.TaskAction abstract class FormatCheckTask : AbstractBufExecTask() { + /** The input files to be checked. */ + @get:InputFiles + internal abstract val inputFiles: ConfigurableFileCollection + @TaskAction fun bufFormatCheck() { execBufInSpecificDirectory("format", "-d", "--exit-code") { diff --git a/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt b/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt index 4ce83abd..7645cf76 100644 --- a/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/FormatConfiguration.kt @@ -31,6 +31,8 @@ private fun Project.configureBufFormatCheck() { group = VERIFICATION_GROUP description = "Checks that a Protobuf schema is formatted according to Buf's formatting rules." enabled = getExtension().enforceFormat + + inputFiles.setFrom(obtainDefaultProtoFileSet()) } tasks.named(CHECK_TASK_NAME).dependsOn(BUF_FORMAT_CHECK_TASK_NAME) @@ -40,5 +42,8 @@ private fun Project.configureBufFormatApply() { registerBufExecTask(BUF_FORMAT_APPLY_TASK_NAME) { group = VERIFICATION_GROUP description = "Formats a Protobuf schema according to Buf's formatting rules." + + inputFiles.setFrom(obtainDefaultProtoFileSet()) + outputFiles.setFrom(obtainDefaultProtoFileSet()) } } From 82ff7996c791f97947f52de75214043782eb33f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 10:23:34 +0200 Subject: [PATCH 27/29] Do not lookup buf config file in the lint task --- .../kotlin/build/buf/gradle/ConfigSupport.kt | 3 --- .../kotlin/build/buf/gradle/LintConfiguration.kt | 3 +++ src/main/kotlin/build/buf/gradle/LintTask.kt | 16 +++++++++++++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ConfigSupport.kt b/src/main/kotlin/build/buf/gradle/ConfigSupport.kt index 1506992a..334c1622 100644 --- a/src/main/kotlin/build/buf/gradle/ConfigSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ConfigSupport.kt @@ -15,7 +15,6 @@ package build.buf.gradle import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.api.tasks.Copy import org.gradle.kotlin.dsl.register import java.io.File @@ -47,8 +46,6 @@ internal fun Project.bufConfigFile() = } } -internal fun Task.bufConfigFile() = project.bufConfigFile() - private fun Project.resolveConfig(): File? { val ext = getExtension() return configurations.getByName(BUF_CONFIGURATION_NAME).let { diff --git a/src/main/kotlin/build/buf/gradle/LintConfiguration.kt b/src/main/kotlin/build/buf/gradle/LintConfiguration.kt index 5593c7de..1a56e6ec 100644 --- a/src/main/kotlin/build/buf/gradle/LintConfiguration.kt +++ b/src/main/kotlin/build/buf/gradle/LintConfiguration.kt @@ -24,6 +24,9 @@ internal fun Project.configureLint() { registerBufExecTask(BUF_LINT_TASK_NAME) { group = VERIFICATION_GROUP description = "Checks that a Protobuf schema conforms to the Buf lint configuration." + + bufConfigFile.set(project.bufConfigFile()) + inputFiles.setFrom(obtainDefaultProtoFileSet()) } tasks.named(CHECK_TASK_NAME).dependsOn(BUF_LINT_TASK_NAME) diff --git a/src/main/kotlin/build/buf/gradle/LintTask.kt b/src/main/kotlin/build/buf/gradle/LintTask.kt index 94172fab..8e3232ef 100644 --- a/src/main/kotlin/build/buf/gradle/LintTask.kt +++ b/src/main/kotlin/build/buf/gradle/LintTask.kt @@ -14,17 +14,31 @@ package build.buf.gradle +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.provider.Property +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction import java.io.File import java.nio.file.Files.lines import kotlin.streams.asSequence abstract class LintTask : AbstractBufExecTask() { + /** The input proto files. */ + @get:InputFiles + internal abstract val inputFiles: ConfigurableFileCollection + + /** The input buf configuration file. */ + @get:InputFile + @get:Optional + internal abstract val bufConfigFile: Property + @TaskAction fun bufLint() { execBufInSpecificDirectory( "lint", - bufConfigFile()?.let { listOf("--config", it.readAndStripComments()) }.orEmpty(), + bufConfigFile.orNull?.let { listOf("--config", it.readAndStripComments()) }.orEmpty(), ) { """ |Some Protobuf files had lint violations: From 5d313984ec84f16f5c04d2689c9f5d0b10b6005e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Wed, 3 Jul 2024 17:22:39 +0200 Subject: [PATCH 28/29] Remove unnecessary and misleading extension functions --- src/main/kotlin/build/buf/gradle/ConfigSupport.kt | 2 +- src/main/kotlin/build/buf/gradle/ExtensionSupport.kt | 3 --- src/main/kotlin/build/buf/gradle/GradleSupport.kt | 3 --- src/main/kotlin/build/buf/gradle/OutputSupport.kt | 4 ---- 4 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/main/kotlin/build/buf/gradle/ConfigSupport.kt b/src/main/kotlin/build/buf/gradle/ConfigSupport.kt index 334c1622..86acc276 100644 --- a/src/main/kotlin/build/buf/gradle/ConfigSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ConfigSupport.kt @@ -24,7 +24,7 @@ const val COPY_BUF_CONFIG_TASK_NAME = "copyBufConfig" internal fun Project.configureCopyBufConfig() { tasks.register(COPY_BUF_CONFIG_TASK_NAME) { from(listOfNotNull(bufConfigFile())) - into(bufbuildDir) + into(project.bufbuildDir) rename { "buf.yaml" } } } diff --git a/src/main/kotlin/build/buf/gradle/ExtensionSupport.kt b/src/main/kotlin/build/buf/gradle/ExtensionSupport.kt index 812384af..f1f7696d 100644 --- a/src/main/kotlin/build/buf/gradle/ExtensionSupport.kt +++ b/src/main/kotlin/build/buf/gradle/ExtensionSupport.kt @@ -15,7 +15,6 @@ package build.buf.gradle import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.kotlin.dsl.create import org.gradle.kotlin.dsl.getByName @@ -27,8 +26,6 @@ internal fun Project.createExtension() { internal fun Project.getExtension() = extensions.getByName(BUF_EXTENSION_NAME) -internal fun Task.getExtension() = project.getExtension() - internal fun Project.runBreakageCheck() = with(getExtension()) { checkSchemaAgainstLatestRelease || previousVersion != null diff --git a/src/main/kotlin/build/buf/gradle/GradleSupport.kt b/src/main/kotlin/build/buf/gradle/GradleSupport.kt index 2080407e..975d8cfa 100644 --- a/src/main/kotlin/build/buf/gradle/GradleSupport.kt +++ b/src/main/kotlin/build/buf/gradle/GradleSupport.kt @@ -15,7 +15,6 @@ package build.buf.gradle import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.dependencies @@ -32,5 +31,3 @@ internal fun Project.createConfigurationWithDependency( } internal fun Project.singleFileFromConfiguration(configuration: String) = configurations.getByName(configuration).singleFile - -internal fun Task.singleFileFromConfiguration(configuration: String) = project.singleFileFromConfiguration(configuration) diff --git a/src/main/kotlin/build/buf/gradle/OutputSupport.kt b/src/main/kotlin/build/buf/gradle/OutputSupport.kt index 2ac15792..b29f6302 100644 --- a/src/main/kotlin/build/buf/gradle/OutputSupport.kt +++ b/src/main/kotlin/build/buf/gradle/OutputSupport.kt @@ -15,14 +15,10 @@ package build.buf.gradle import org.gradle.api.Project -import org.gradle.api.Task const val BUF_BUILD_DIR = "bufbuild" internal val Project.bufbuildDir get() = layout.buildDirectory.dir(BUF_BUILD_DIR).get().asFile -internal val Task.bufbuildDir - get() = project.bufbuildDir - internal fun ArtifactDetails.groupAndArtifact() = "$groupId:$artifactId" From c83739a24001312451fc146a391cbb4cfa938127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20=C5=A0ebek?= Date: Tue, 2 Jul 2024 09:36:38 +0200 Subject: [PATCH 29/29] Enable configuration cache in tests --- src/test/kotlin/build/buf/gradle/AbstractBufIntegrationTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/kotlin/build/buf/gradle/AbstractBufIntegrationTest.kt b/src/test/kotlin/build/buf/gradle/AbstractBufIntegrationTest.kt index dd348813..41577bba 100644 --- a/src/test/kotlin/build/buf/gradle/AbstractBufIntegrationTest.kt +++ b/src/test/kotlin/build/buf/gradle/AbstractBufIntegrationTest.kt @@ -71,6 +71,7 @@ abstract class AbstractBufIntegrationTest : IntegrationTest { "-PprotobufVersion=3.23.4", "-PkotlinVersion=1.7.20", "-PandroidGradleVersion=7.3.0", + "--configuration-cache", ) .withDebug(false) // Enable for interactive debugging .let { WrappedRunner(it) }