Skip to content

Commit ce70ea7

Browse files
committed
Store IDE hook state as an input on SpotlessTaskImpl so that we don't violate any configuration cache rules.
1 parent 0f88859 commit ce70ea7

File tree

3 files changed

+43
-16
lines changed

3 files changed

+43
-16
lines changed

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/IdeHook.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,34 @@
1919
import java.io.IOException;
2020
import java.nio.file.Files;
2121

22+
import javax.annotation.Nullable;
23+
24+
import org.gradle.api.Project;
25+
2226
import com.diffplug.common.base.Errors;
2327
import com.diffplug.common.io.ByteStreams;
2428
import com.diffplug.spotless.DirtyState;
2529
import com.diffplug.spotless.Formatter;
30+
import com.diffplug.spotless.NoLambda;
2631

2732
class IdeHook {
33+
static class State extends NoLambda.EqualityBasedOnSerialization {
34+
final @Nullable String path;
35+
final boolean useStdIn;
36+
final boolean useStdOut;
37+
38+
State(Project project) {
39+
path = (String) project.findProperty(PROPERTY);
40+
if (path != null) {
41+
useStdIn = project.hasProperty(USE_STD_IN);
42+
useStdOut = project.hasProperty(USE_STD_OUT);
43+
} else {
44+
useStdIn = false;
45+
useStdOut = false;
46+
}
47+
}
48+
}
49+
2850
final static String PROPERTY = "spotlessIdeHook";
2951
final static String USE_STD_IN = "spotlessIdeHookUseStdIn";
3052
final static String USE_STD_OUT = "spotlessIdeHookUseStdOut";
@@ -33,9 +55,8 @@ private static void dumpIsClean() {
3355
System.err.println("IS CLEAN");
3456
}
3557

36-
static void performHook(SpotlessTaskImpl spotlessTask) {
37-
String path = (String) spotlessTask.getProject().property(PROPERTY);
38-
File file = new File(path);
58+
static void performHook(SpotlessTaskImpl spotlessTask, IdeHook.State state) {
59+
File file = new File(state.path);
3960
if (!file.isAbsolute()) {
4061
System.err.println("Argument passed to " + PROPERTY + " must be an absolute path");
4162
return;
@@ -50,7 +71,7 @@ static void performHook(SpotlessTaskImpl spotlessTask) {
5071
}
5172
}
5273
byte[] bytes;
53-
if (spotlessTask.getProject().hasProperty(USE_STD_IN)) {
74+
if (state.useStdIn) {
5475
bytes = ByteStreams.toByteArray(System.in);
5576
} else {
5677
bytes = Files.readAllBytes(file.toPath());
@@ -63,7 +84,7 @@ static void performHook(SpotlessTaskImpl spotlessTask) {
6384
System.err.println("Run 'spotlessDiagnose' for details https://github.com/diffplug/spotless/blob/main/PADDEDCELL.md");
6485
} else {
6586
System.err.println("IS DIRTY");
66-
if (spotlessTask.getProject().hasProperty(USE_STD_OUT)) {
87+
if (state.useStdOut) {
6788
dirty.writeCanonicalTo(System.out);
6889
} else {
6990
dirty.writeCanonicalTo(file);

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2022 DiffPlug
2+
* Copyright 2016-2024 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -48,15 +48,15 @@ public SpotlessExtensionImpl(Project project) {
4848

4949
@Override
5050
protected void createFormatTasks(String name, FormatExtension formatExtension) {
51-
boolean isIdeHook = project.hasProperty(IdeHook.PROPERTY);
51+
IdeHook.State ideHook = new IdeHook.State(project);
5252
TaskContainer tasks = project.getTasks();
5353

5454
// create the SpotlessTask
5555
String taskName = EXTENSION + SpotlessPlugin.capitalize(name);
5656
TaskProvider<SpotlessTaskImpl> spotlessTask = tasks.register(taskName, SpotlessTaskImpl.class, task -> {
5757
task.init(getRegisterDependenciesTask().getTaskService());
5858
task.setGroup(TASK_GROUP);
59-
task.setEnabled(!isIdeHook);
59+
task.getIdeHookState().set(ideHook);
6060
// clean removes the SpotlessCache, so we have to run after clean
6161
task.mustRunAfter(BasePlugin.CLEAN_TASK_NAME);
6262
});
@@ -75,23 +75,18 @@ protected void createFormatTasks(String name, FormatExtension formatExtension) {
7575
TaskProvider<SpotlessApply> applyTask = tasks.register(taskName + APPLY, SpotlessApply.class, task -> {
7676
task.init(spotlessTask.get());
7777
task.setGroup(TASK_GROUP);
78-
task.setEnabled(!isIdeHook);
78+
task.setEnabled(ideHook.path == null);
7979
task.dependsOn(spotlessTask);
8080
});
8181
rootApplyTask.configure(task -> {
82-
task.dependsOn(applyTask);
83-
84-
if (isIdeHook) {
85-
// the rootApplyTask is no longer just a marker task, now it does a bit of work itself
86-
task.doLast(unused -> IdeHook.performHook(spotlessTask.get()));
87-
}
82+
task.dependsOn(ideHook.path == null ? applyTask : spotlessTask);
8883
});
8984

9085
TaskProvider<SpotlessCheck> checkTask = tasks.register(taskName + CHECK, SpotlessCheck.class, task -> {
9186
SpotlessTaskImpl source = spotlessTask.get();
9287
task.setGroup(TASK_GROUP);
9388
task.init(source);
94-
task.setEnabled(!isIdeHook);
89+
task.setEnabled(ideHook.path == null);
9590
task.dependsOn(source);
9691

9792
// if the user runs both, make sure that apply happens first,

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessTaskImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
import org.gradle.api.GradleException;
3030
import org.gradle.api.file.DirectoryProperty;
3131
import org.gradle.api.file.FileSystemOperations;
32+
import org.gradle.api.provider.Property;
3233
import org.gradle.api.provider.Provider;
3334
import org.gradle.api.tasks.CacheableTask;
35+
import org.gradle.api.tasks.Input;
3436
import org.gradle.api.tasks.Internal;
3537
import org.gradle.api.tasks.TaskAction;
3638
import org.gradle.work.ChangeType;
@@ -46,6 +48,9 @@
4648

4749
@CacheableTask
4850
public abstract class SpotlessTaskImpl extends SpotlessTask {
51+
@Input
52+
abstract Property<IdeHook.State> getIdeHookState();
53+
4954
@Internal
5055
abstract DirectoryProperty getProjectDir();
5156

@@ -69,6 +74,12 @@ Provider<SpotlessTaskService> getTaskServiceProvider() {
6974

7075
@TaskAction
7176
public void performAction(InputChanges inputs) throws Exception {
77+
IdeHook.State ideHook = getIdeHookState().getOrNull();
78+
if (ideHook != null && ideHook.path != null) {
79+
IdeHook.performHook(this, ideHook);
80+
return;
81+
}
82+
7283
SpotlessTaskService taskService = getTaskService().get();
7384
taskService.registerSourceAlreadyRan(this);
7485
if (target == null) {

0 commit comments

Comments
 (0)