Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

task configuration avoidance #2290

Merged
merged 3 commits into from
Jun 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions changelog/@unreleased/pr-2290.v2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
type: improvement
improvement:
description: Avoid configuring many gradle tasks
links:
- https://github.com/palantir/gradle-baseline/pull/2290
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,10 @@ public void apply(Project project) {
// Java 8+ new doclint compiler feature redundant.
if (javaConvention.getSourceCompatibility().isJava8Compatible()) {
project.getTasks()
.withType(
Javadoc.class,
javadoc -> javadoc.options(
javadocOptions -> ((StandardJavadocDocletOptions) javadocOptions)
.addStringOption("Xdoclint:none", "-quiet")));
.withType(Javadoc.class)
.configureEach(javadoc ->
javadoc.options(javadocOptions -> ((StandardJavadocDocletOptions) javadocOptions)
.addStringOption("Xdoclint:none", "-quiet")));
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,11 @@ private void configurePluginsForArtifacts(Project project) {
throw new RuntimeException("failed to create CIRCLE_ARTIFACTS directory", e);
}

project.getRootProject().allprojects(proj -> proj.getTasks().withType(Test.class, test -> {
test.getReports().getHtml().getRequired().set(true);
test.getReports().getHtml().getOutputLocation().set(junitPath(circleArtifactsDir, test.getPath()));
}));
project.getRootProject()
.allprojects(proj -> proj.getTasks().withType(Test.class).configureEach(test -> {
test.getReports().getHtml().getRequired().set(true);
test.getReports().getHtml().getOutputLocation().set(junitPath(circleArtifactsDir, test.getPath()));
}));
}

private void configurePluginsForReports(Project project) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public final void apply(Project project) {
task.usesService(jarClassHasher);
});
project.getPlugins().apply(LifecycleBasePlugin.class);
project.getTasks().getByName(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(checkClassUniqueness);
project.getTasks().named(LifecycleBasePlugin.CHECK_TASK_NAME).configure(t -> t.dependsOn(checkClassUniqueness));

project.getPlugins().withId("java", plugin -> {
checkClassUniqueness.configure(t -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,14 @@ public void apply(Project project) {
project.getExtensions().getExtraProperties().set("enablePreview", enablePreview);

project.getPlugins().withId("java", _unused -> {
project.getTasks().withType(JavaCompile.class, t -> {
project.getTasks().withType(JavaCompile.class).configureEach(t -> {
List<CommandLineArgumentProvider> args = t.getOptions().getCompilerArgumentProviders();
args.add(new MaybeEnablePreview(enablePreview)); // mutation is gross, but it's the gradle convention
});
project.getTasks().withType(Test.class, t -> {
project.getTasks().withType(Test.class).configureEach(t -> {
t.getJvmArgumentProviders().add(new MaybeEnablePreview(enablePreview));
});
project.getTasks().withType(JavaExec.class, t -> {
project.getTasks().withType(JavaExec.class).configureEach(t -> {
t.getJvmArgumentProviders().add(new MaybeEnablePreview(enablePreview));
});

Expand All @@ -68,7 +68,7 @@ public void apply(Project project) {
JavaVersion sourceCompat = project.getConvention()
.getPlugin(JavaPluginConvention.class)
.getSourceCompatibility();
project.getTasks().withType(Javadoc.class, t -> {
project.getTasks().withType(Javadoc.class).configureEach(t -> {
CoreJavadocOptions options = (CoreJavadocOptions) t.getOptions();

// Yes truly javadoc wants a single leading dash, other javac wants a double leading dash.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,12 +204,15 @@ private static void configureSpotlessJava(Project project, SpotlessExtension spo
});

project.afterEvaluate(p -> {
Task spotlessJava = project.getTasks().getByName("spotlessJava");
if (eclipseFormattingEnabled(project) && !Files.exists(eclipseXml)) {
spotlessJava.dependsOn(":baselineUpdateConfig");
TaskProvider<Task> spotlessJava = project.getTasks().named("spotlessJava");
spotlessJava.configure(t -> t.dependsOn(":baselineUpdateConfig"));
}

project.getTasks().withType(JavaCompile.class).configureEach(spotlessJava::mustRunAfter);
project.getTasks().withType(JavaCompile.class).configureEach(javaCompile -> {
Task spotlessJava = project.getTasks().getByName("spotlessJava");
spotlessJava.mustRunAfter(javaCompile);
});
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,14 @@
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.UnknownTaskException;
import org.gradle.api.file.FileCollection;
import org.gradle.api.java.archives.Manifest;
import org.gradle.api.provider.SetProperty;
import org.gradle.api.tasks.JavaExec;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.api.tasks.compile.JavaCompile;
import org.gradle.api.tasks.javadoc.Javadoc;
import org.gradle.api.tasks.testing.Test;
Expand Down Expand Up @@ -75,96 +77,106 @@ public void apply(Project project) {
// https://github.com/gradle/gradle/issues/18824
// However, we set sourceCompatibility in BaselineJavaVersion to opt out of the '--release' flag.
project.getExtensions().getByType(SourceSetContainer.class).configureEach(sourceSet -> {
JavaCompile javaCompile = project.getTasks()
.named(sourceSet.getCompileJavaTaskName(), JavaCompile.class)
.get();
javaCompile
.getOptions()
.getCompilerArgumentProviders()
// Use an anonymous class because tasks with lambda inputs cannot be cached
.add(new CommandLineArgumentProvider() {
TaskProvider<JavaCompile> javaCompileProvider =
project.getTasks().named(sourceSet.getCompileJavaTaskName(), JavaCompile.class);
javaCompileProvider.configure(javaCompile -> {
javaCompile
.getOptions()
.getCompilerArgumentProviders()
// Use an anonymous class because tasks with lambda inputs cannot be cached
.add(new CommandLineArgumentProvider() {
@Override
public Iterable<String> asArguments() {
// The '--release' flag is set when BaselineJavaVersion is not used.
if (!project.getPlugins().hasPlugin(BaselineJavaVersion.class)) {
project.getLogger()
.debug(
"BaselineModuleJvmArgs not applying args to compilation task "
+ "{} on {} due to lack of BaselineJavaVersion",
javaCompile.getName(),
project);
return ImmutableList.of();
}
ImmutableList<String> arguments =
collectCompilationArgs(project, extension, sourceSet);
project.getLogger()
.debug(
"BaselineModuleJvmArgs compiling {} on {} with exports: {}",
javaCompile.getName(),
project,
arguments);
return arguments;
}
});
});

TaskProvider<Task> javadocTaskProvider = null;
try {
javadocTaskProvider = project.getTasks().named(sourceSet.getJavadocTaskName());
} catch (UnknownTaskException e) {
// skip
}
if (javadocTaskProvider != null) {
javadocTaskProvider.configure(javadocTask -> {
javadocTask.doFirst(new Action<Task>() {
@Override
public Iterable<String> asArguments() {
public void execute(Task task) {
// The '--release' flag is set when BaselineJavaVersion is not used.
if (!project.getPlugins().hasPlugin(BaselineJavaVersion.class)) {
project.getLogger()
.debug(
"BaselineModuleJvmArgs not applying args to compilation task "
+ "{} on {} due to lack of BaselineJavaVersion",
javaCompile.getName(),
task.getName(),
project);
return ImmutableList.of();
return;
}
ImmutableList<String> arguments = collectCompilationArgs(project, extension, sourceSet);
project.getLogger()
.debug(
"BaselineModuleJvmArgs compiling {} on {} with exports: {}",
javaCompile.getName(),
project,
arguments);
return arguments;
}
});

Task maybeJavadocTask = project.getTasks().findByName(sourceSet.getJavadocTaskName());
if (maybeJavadocTask instanceof Javadoc) {
maybeJavadocTask.doFirst(new Action<Task>() {
@Override
public void execute(Task task) {
// The '--release' flag is set when BaselineJavaVersion is not used.
if (!project.getPlugins().hasPlugin(BaselineJavaVersion.class)) {
project.getLogger()
.debug(
"BaselineModuleJvmArgs not applying args to compilation task "
+ "{} on {} due to lack of BaselineJavaVersion",
task.getName(),
project);
return;
}

Javadoc javadoc = (Javadoc) task;

MinimalJavadocOptions options = javadoc.getOptions();
if (options instanceof CoreJavadocOptions) {
CoreJavadocOptions coreOptions = (CoreJavadocOptions) options;
ImmutableList<JarManifestModuleInfo> info = collectClasspathInfo(project, sourceSet);
List<String> exportValues = Stream.concat(
// Compilation only supports exports, so we union with opens.
Stream.concat(
extension.exports().get().stream(),
extension.opens().get().stream()),
info.stream()
.flatMap(item -> Stream.concat(
item.exports().stream(), item.opens().stream())))
.distinct()
.sorted()
.map(item -> item + "=ALL-UNNAMED")
.collect(ImmutableList.toImmutableList());
project.getLogger()
.debug(
"BaselineModuleJvmArgs building {} on {} " + "with exports: {}",
javadoc.getName(),
project,
exportValues);
if (!exportValues.isEmpty()) {
coreOptions
// options are automatically prefixed with '-' internally
.addMultilineStringsOption("-add-exports")
.setValue(exportValues);
Javadoc javadoc = (Javadoc) task;

MinimalJavadocOptions options = javadoc.getOptions();
if (options instanceof CoreJavadocOptions) {
CoreJavadocOptions coreOptions = (CoreJavadocOptions) options;
ImmutableList<JarManifestModuleInfo> info =
collectClasspathInfo(project, sourceSet);
List<String> exportValues = Stream.concat(
// Compilation only supports exports, so we union with opens.
Stream.concat(
extension.exports().get().stream(),
extension.opens().get().stream()),
info.stream()
.flatMap(item -> Stream.concat(
item.exports().stream(), item.opens().stream())))
.distinct()
.sorted()
.map(item -> item + "=ALL-UNNAMED")
.collect(ImmutableList.toImmutableList());
project.getLogger()
.debug(
"BaselineModuleJvmArgs building {} on {} " + "with exports: {}",
javadoc.getName(),
project,
exportValues);
if (!exportValues.isEmpty()) {
coreOptions
// options are automatically prefixed with '-' internally
.addMultilineStringsOption("-add-exports")
.setValue(exportValues);
}
} else {
project.getLogger()
.error(
"MinimalJavadocOptions implementation was "
+ "not CoreJavadocOptions, rather '{}'",
options.getClass().getName());
}
} else {
project.getLogger()
.error(
"MinimalJavadocOptions implementation was "
+ "not CoreJavadocOptions, rather '{}'",
options.getClass().getName());
}
}
});
});
}
});

project.getTasks().withType(Test.class, new Action<Test>() {
project.getTasks().withType(Test.class).configureEach(new Action<Test>() {

@Override
public void execute(Test test) {
Expand All @@ -186,7 +198,7 @@ public Iterable<String> asArguments() {
}
});

project.getTasks().withType(JavaExec.class, new Action<JavaExec>() {
project.getTasks().withType(JavaExec.class).configureEach(new Action<JavaExec>() {

@Override
public void execute(JavaExec javaExec) {
Expand All @@ -208,7 +220,7 @@ public Iterable<String> asArguments() {
}
});

project.getTasks().withType(Jar.class, new Action<Jar>() {
project.getTasks().withType(Jar.class).configureEach(new Action<Jar>() {
@Override
public void execute(Jar jar) {
jar.doFirst(new Action<Task>() {
Expand Down
Loading