[jOOQ/jOOQ#16997] jOOQ-codegen-gradle plugin doesn't work with Gradle's configuration cache feature

This commit is contained in:
Lukas Eder 2024-08-12 09:16:41 +02:00
parent 9aec5c9de7
commit 8693b2fa0d
4 changed files with 37 additions and 46 deletions

View File

@ -41,6 +41,8 @@ import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;
import java.util.ArrayList;
import java.util.List;
@ -95,8 +97,18 @@ public class CodegenPlugin implements Plugin<Project> {
task.setDescription("jOOQ code generation" + (configuration.unnamed ? " for all executions" : " for the " + configuration.name + " execution"));
task.setGroup("jOOQ");
if (task.configuration.action == null)
CodegenTask.registerSourceSet(task);
if (task.configuration.action == null) {
SourceSetContainer source = task.getProject()
.getExtensions()
.findByType(SourceSetContainer.class);
if (source != null) {
SourceSet main = source.findByName("main");
if (main != null)
main.getJava().srcDir(task.getOutputDirectory());
}
}
};
}
}

View File

@ -53,33 +53,28 @@ import javax.inject.Inject;
public class CodegenPluginExtension {
final ObjectFactory objects;
final Project project;
final NamedDomainObjectContainer<NamedConfiguration> executions;
final NamedConfiguration defaultExecution;
@Inject
public CodegenPluginExtension(
ObjectFactory objects,
Project project,
ProviderFactory providers,
ProjectLayout layout
) {
this.objects = objects;
this.project = project;
this.executions = objects.domainObjectContainer(NamedConfiguration.class,
name -> objects.newInstance(NamedConfiguration.class, objects, name)
this.defaultExecution = new NamedConfiguration(objects, layout, "", null);
this.executions = objects.domainObjectContainer(NamedConfiguration.class, name -> "".equals(name)
? defaultExecution
: objects.newInstance(NamedConfiguration.class, objects, name, defaultExecution)
);
}
NamedConfiguration defaultConfiguration() {
return executions.getByName("");
}
public void configuration(Action<ConfigurationExtension> action) {
defaultConfiguration().configuration(action);
defaultExecution.configuration(action);
}
public void delayedConfiguration(Action<ConfigurationExtension> action) {
defaultConfiguration().delayedConfiguration(action);
defaultExecution.delayedConfiguration(action);
}
public NamedDomainObjectContainer<NamedConfiguration> getExecutions() {

View File

@ -39,7 +39,6 @@ package org.jooq.codegen.gradle;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.FileCollection;
@ -91,24 +90,7 @@ public class CodegenTask extends DefaultTask {
// [#16318] When the task is up-to-date, we still have to register our source set contributions, which
// apparently aren't being cached by gradle's build cache.
getOutputs().upToDateWhen(task -> registerSourceSet(task) && upToDate(task));
}
static boolean registerSourceSet(Task t) {
if (t instanceof CodegenTask task) {
SourceSetContainer source = task.getProject()
.getExtensions()
.findByType(SourceSetContainer.class);
if (source != null) {
SourceSet main = source.findByName("main");
if (main != null)
main.getJava().srcDir(task.getOutputDirectory());
}
}
return true;
getOutputs().upToDateWhen(task -> upToDate(task));
}
@SuppressWarnings("unchecked")

View File

@ -38,14 +38,14 @@
package org.jooq.codegen.gradle;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.file.Directory;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.ProjectLayout;
import org.gradle.api.model.ObjectFactory;
import org.jooq.codegen.GenerationTool;
import org.jooq.meta.jaxb.Configuration;
import org.jooq.meta.jaxb.Generator;
import org.jooq.meta.jaxb.Target;
import org.jooq.tools.JooqLogger;
import org.jooq.util.jaxb.tools.MiniJAXB;
import org.jooq.codegen.gradle.MetaExtensions.*;
@ -58,29 +58,32 @@ import java.io.File;
*/
public class NamedConfiguration {
static final JooqLogger log = JooqLogger.getLogger(NamedConfiguration.class);
final ObjectFactory objects;
final Project project;
final ProjectLayout projectLayout;
final String name;
final NamedConfiguration defaultConfiguration;
Action<ConfigurationExtension> action;
boolean unnamed;
private Configuration configuration;
private DirectoryProperty outputDirectory;
private Directory projectDirectory;
private boolean outputDirectorySet;
@Inject
public NamedConfiguration(
ObjectFactory objects,
Project project,
String name
ProjectLayout projectLayout,
String name,
NamedConfiguration defaultConfiguration
) {
this.objects = objects;
this.project = project;
this.projectLayout = projectLayout;
this.name = name;
this.unnamed = false;
this.configuration = init(new Configuration());
this.outputDirectory = objects.directoryProperty();
this.projectDirectory = project.getLayout().getProjectDirectory();
this.defaultConfiguration = defaultConfiguration == null ? this : defaultConfiguration;
}
static final Configuration init(Configuration configuration) {
@ -105,7 +108,6 @@ public class NamedConfiguration {
void configuration0(Configuration configuration) {
if (!unnamed) {
NamedConfiguration defaultConfiguration = project.getExtensions().getByType(CodegenPluginExtension.class).defaultConfiguration();
defaultConfiguration.executeAction();
this.configuration = MiniJAXB.append(copy(defaultConfiguration.configuration), copy(this.configuration));
}
@ -123,7 +125,7 @@ public class NamedConfiguration {
}
public void delayedConfiguration(Action<ConfigurationExtension> action) {
project.getLogger().info("Delayed configuration is an experimental feature, which is subject to change in the future. Please illustrate your use-case here to help better understand why this is needed: https://github.com/jOOQ/jOOQ/issues/16821");
log.info("Delayed configuration is an experimental feature, which is subject to change in the future. Please illustrate your use-case here to help better understand why this is needed: https://github.com/jOOQ/jOOQ/issues/16821");
this.action = action;
}
@ -132,6 +134,7 @@ public class NamedConfiguration {
ConfigurationExtension c = objects.newInstance(ConfigurationExtension.class, objects);
init(c);
action.execute(c);
action = null;
configuration0(c);
// [#15944] Override default target directory
@ -144,13 +147,12 @@ public class NamedConfiguration {
// [#16133] Make sure the CodegenTask's OutputDirectory takes into account any basedir config
if (configuration.getBasedir() == null)
configuration.setBasedir(projectDirectory.getAsFile().getAbsolutePath());
configuration.setBasedir(projectLayout.getProjectDirectory().getAsFile().getAbsolutePath());
else if (!new File(directory).isAbsolute())
directory = new File(configuration.getBasedir(), directory).getAbsolutePath();
outputDirectory.value(projectDirectory.dir(directory));
outputDirectory.value(projectLayout.getProjectDirectory().dir(directory));
outputDirectorySet = true;
action = null;
}
}