Skip to content

Commit b92b256

Browse files
committed
Whenever a task runs, we store its transient state.
1 parent b384f5a commit b92b256

File tree

1 file changed

+45
-8
lines changed

1 file changed

+45
-8
lines changed

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

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import javax.inject.Inject;
2424

2525
import org.gradle.api.DefaultTask;
26+
import org.gradle.api.GradleException;
2627
import org.gradle.api.Project;
2728
import org.gradle.api.file.DirectoryProperty;
2829
import org.gradle.api.model.ObjectFactory;
@@ -35,6 +36,7 @@
3536

3637
import com.diffplug.common.base.Preconditions;
3738
import com.diffplug.common.base.Unhandled;
39+
import com.diffplug.spotless.FileSignature;
3840
import com.diffplug.spotless.Provisioner;
3941

4042
/**
@@ -44,26 +46,60 @@
4446
* apply already did).
4547
*/
4648
public abstract class SpotlessTaskService implements BuildService<BuildServiceParameters.None>, AutoCloseable, OperationCompletionListener {
47-
private final Map<String, SpotlessApply> apply = Collections.synchronizedMap(new HashMap<>());
48-
private final Map<String, SpotlessTask> source = Collections.synchronizedMap(new HashMap<>());
49-
private final Map<String, Provisioner> provisioner = Collections.synchronizedMap(new HashMap<>());
49+
private boolean enableConfigCacheDaemonLocal;
50+
private Map<String, SpotlessApply> apply = Collections.synchronizedMap(new HashMap<>());
51+
private Map<String, SpotlessTask> source = Collections.synchronizedMap(new HashMap<>());
52+
private Map<String, Provisioner> provisioner = Collections.synchronizedMap(new HashMap<>());
5053

51-
Provisioner provisionerFor(Project project) {
52-
return provisioner.computeIfAbsent(project.getPath(), unused -> {
53-
return GradleProvisioner.newDedupingProvisioner(project);
54-
});
54+
void registerDependenciesTask(RegisterDependenciesTask task) {
55+
enableConfigCacheDaemonLocal = task.getEnableConfigCacheDaemonLocal();
5556
}
5657

5758
void registerSourceAlreadyRan(SpotlessTask task) {
5859
source.put(task.getPath(), task);
60+
if (enableConfigCacheDaemonLocal) {
61+
storeOrHydrate(task);
62+
}
63+
}
64+
65+
void hydrate(SpotlessTask task) {
66+
storeOrHydrate(task);
67+
}
68+
69+
private void storeOrHydrate(SpotlessTask task) {
70+
if (!enableConfigCacheDaemonLocal) {
71+
return;
72+
}
73+
String cacheKey = task.getProjectDir().getAsFile().get().getAbsolutePath() + ">" + task.getPath();
74+
if (SpotlessTaskImpl.isHydrated(task)) {
75+
daemonLocalMap.put(cacheKey, new SpotlessTaskImpl.LiveCache(task));
76+
} else {
77+
SpotlessTaskImpl.LiveCache cached = daemonLocalMap.get(cacheKey);
78+
if (cached == null) {
79+
throw new GradleException("Spotless daemon-local cache is stale. Regenerate the cache with\n" +
80+
" " + (FileSignature.machineIsWin() ? "rmdir /q /s" : "rm -rf") + " .gradle/configuration-cache\n" +
81+
"For more information see #123");
82+
} else {
83+
cached.hydrate(task);
84+
}
85+
}
86+
}
87+
88+
private static final Map<String, SpotlessTaskImpl.LiveCache> daemonLocalMap = Collections.synchronizedMap(new HashMap<>());
89+
90+
Provisioner provisionerFor(Project project) {
91+
return provisioner.computeIfAbsent(project.getPath(), unused -> {
92+
return GradleProvisioner.newDedupingProvisioner(project);
93+
});
5994
}
6095

6196
void registerApplyAlreadyRan(SpotlessApply task) {
6297
apply.put(task.sourceTaskPath(), task);
6398
}
6499

100+
/////////////////
65101
// <GitRatchet>
66-
private final GitRatchetGradle ratchet = new GitRatchetGradle();
102+
private GitRatchetGradle ratchet = new GitRatchetGradle();
67103

68104
GitRatchetGradle getRatchet() {
69105
return ratchet;
@@ -79,6 +115,7 @@ public void close() throws Exception {
79115
ratchet.close();
80116
}
81117
// </GitRatchet>
118+
//////////////////
82119

83120
static String INDEPENDENT_HELPER = "Helper";
84121

0 commit comments

Comments
 (0)