Skip to content

Commit

Permalink
Migrate ProtobufExtract task to lazy configuration api (google#593)
Browse files Browse the repository at this point in the history
  • Loading branch information
rougsig authored Aug 4, 2022
1 parent 335e6e8 commit 56b9800
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 55 deletions.
73 changes: 22 additions & 51 deletions src/main/groovy/com/google/protobuf/gradle/ProtobufExtract.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,17 @@
*/
package com.google.protobuf.gradle

import com.google.common.base.Preconditions
import groovy.transform.CompileStatic
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.gradle.api.logging.Logger
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputDirectory
Expand All @@ -58,81 +58,52 @@ import javax.inject.Inject
@CompileStatic
abstract class ProtobufExtract extends DefaultTask {

/**
* The directory for the extracted files.
*/
private File destDir
private Boolean isTest = null
private final ConfigurableFileCollection inputFiles = objectFactory.fileCollection()
private final CopyActionFacade copyActionFacade = instantiateCopyActionFacade()
private final ArchiveActionFacade archiveActionFacade = instantiateArchiveActionFacade()
private final FileCollection filteredProtos = instantiateFilteredProtos()

public void setIsTest(boolean isTest) {
this.isTest = isTest
}
@OutputDirectory
public abstract DirectoryProperty getDestDir()

@Input
public boolean getIsTest() {
Preconditions.checkNotNull(isTest)
return isTest
}
/**
* Used to configure ide proto sources.
*/
@Internal
public abstract Property<Boolean> getIsTest()

/**
* Input for this tasks containing all archive files to extract.
*/
@Internal
public ConfigurableFileCollection getInputFiles() {
return inputFiles
}
public abstract ConfigurableFileCollection getInputFiles()

/**
* Inputs for this task containing only proto files, which is enough for up-to-date checks.
* Add inputs to inputFiles. Uses relative path sensitivity as directory layout changes impact output.
*/
@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
FileTree getFilteredProtosFromInputs() {
return filteredProtos.asFileTree.matching { PatternFilterable pattern -> pattern.include("**/*.proto") }
}

@Internal
CopyActionFacade getCopyActionFacade() {
return copyActionFacade
}

@Internal
ArchiveActionFacade getArchiveActionFacade() {
return archiveActionFacade
public FileTree getInputProtoFiles() {
return filteredProtos.asFileTree
.matching { PatternFilterable pattern -> pattern.include("**/*.proto") }
}

@Inject
abstract ObjectFactory getObjectFactory()

@Inject
abstract ProviderFactory getProviderFactory()

@TaskAction
void extract() {
destDir.mkdir()
FileCollection allProtoFiles = filteredProtos
public void extract() {
copyActionFacade.copy { spec ->
spec.includeEmptyDirs = false
spec.from(allProtoFiles)
spec.include('**/*.proto')
spec.from(inputProtoFiles)
spec.into(destDir)
// gradle 7+ requires a duplicate strategy to be explicitly defined
spec.duplicatesStrategy = DuplicatesStrategy.INCLUDE
}
}

protected void setDestDir(File destDir) {
Preconditions.checkState(this.destDir == null, 'destDir already set')
this.destDir = destDir
outputs.dir destDir
}
@Inject
protected abstract ObjectFactory getObjectFactory()

@OutputDirectory
protected File getDestDir() {
return destDir
}
@Inject
protected abstract ProviderFactory getProviderFactory()

private CopyActionFacade instantiateCopyActionFacade() {
if (GradleVersion.current() >= GradleVersion.version("6.0")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,13 +356,13 @@ class ProtobufPlugin implements Plugin<Project> {
private Task setupExtractProtosTask(final GenerateProtoTask generateProtoTask, final String sourceSetName) {
String extractProtosTaskName = 'extract' +
Utils.getSourceSetSubstringForTaskNames(sourceSetName) + 'Proto'
Task task = project.tasks.findByName(extractProtosTaskName)
ProtobufExtract task = project.tasks.findByName(extractProtosTaskName)
if (task == null) {
task = project.tasks.create(extractProtosTaskName, ProtobufExtract) {
description = "Extracts proto files/dependencies specified by 'protobuf' configuration"
destDir = getExtractedProtosDir(sourceSetName) as File
destDir.set(getExtractedProtosDir(sourceSetName) as File)
inputFiles.from(project.configurations[Utils.getConfigName(sourceSetName, 'protobuf')])
isTest = Utils.isTest(sourceSetName)
isTest.set(Utils.isTest(sourceSetName))
}
}

Expand Down Expand Up @@ -481,7 +481,7 @@ class ProtobufPlugin implements Plugin<Project> {
}
// Make the extracted proto dirs known to IDEs
project.tasks.withType(ProtobufExtract).each { ProtobufExtract extractProtoTask ->
Utils.addToIdeSources(project, extractProtoTask.isTest, extractProtoTask.destDir, true)
Utils.addToIdeSources(project, extractProtoTask.isTest.get(), extractProtoTask.destDir.get().asFile, true)
}
// Make the generated code dirs known to IDEs
project.tasks.withType(GenerateProtoTask).each { GenerateProtoTask generateProtoTask ->
Expand Down

0 comments on commit 56b9800

Please sign in to comment.