|
8 | 8 | import groovy.lang.DelegatesTo; |
9 | 9 | import groovy.transform.stc.ClosureParams; |
10 | 10 | import groovy.transform.stc.FirstParam; |
| 11 | +import org.gradle.TaskExecutionRequest; |
11 | 12 | import org.gradle.api.Action; |
12 | 13 | import org.gradle.api.Project; |
13 | 14 | import org.gradle.api.Transformer; |
|
19 | 20 | import org.gradle.api.provider.Property; |
20 | 21 | import org.gradle.api.provider.Provider; |
21 | 22 | import org.gradle.api.provider.ProviderFactory; |
| 23 | +import org.gradle.api.tasks.TaskProvider; |
22 | 24 | import org.gradle.jvm.toolchain.JavaLanguageVersion; |
23 | 25 | import org.gradle.jvm.toolchain.JavaLauncher; |
24 | 26 | import org.gradle.jvm.toolchain.JavaToolchainService; |
25 | 27 | import org.jetbrains.annotations.Contract; |
| 28 | +import org.jetbrains.annotations.Nullable; |
26 | 29 |
|
27 | 30 | import javax.inject.Inject; |
28 | 31 | import java.io.BufferedReader; |
|
31 | 34 | import java.io.InputStreamReader; |
32 | 35 | import java.io.PipedInputStream; |
33 | 36 | import java.io.PipedOutputStream; |
| 37 | +import java.util.ArrayList; |
| 38 | +import java.util.List; |
34 | 39 | import java.util.function.Consumer; |
35 | 40 |
|
36 | 41 | /// Shared utilities for Gradle plugins. |
@@ -179,6 +184,40 @@ public static void ensureAfterEvaluate(Project project, Action<? super Project> |
179 | 184 | else |
180 | 185 | project.afterEvaluate(action); |
181 | 186 | } |
| 187 | + |
| 188 | + /// Ensures that a given task is run first in the task graph for the given project. |
| 189 | + /// |
| 190 | + /// This *does not* break the configuration cache as long as the task is always applied using this. |
| 191 | + /// |
| 192 | + /// @param project The project |
| 193 | + /// @param task The task to run first |
| 194 | + public static <T extends TaskProvider<?>> T runFirst(Project project, T task) { |
| 195 | + // copy the requests because the backed list isn't concurrent |
| 196 | + var requests = new ArrayList<>(project.getGradle().getStartParameter().getTaskRequests()); |
| 197 | + |
| 198 | + // add the task to the front of the list |
| 199 | + requests.add(0, new TaskExecutionRequest() { |
| 200 | + @Override |
| 201 | + public List<String> getArgs() { |
| 202 | + return List.of(task.get().getPath()); |
| 203 | + } |
| 204 | + |
| 205 | + @Override |
| 206 | + public @Nullable String getProjectPath() { |
| 207 | + return null; |
| 208 | + } |
| 209 | + |
| 210 | + @Override |
| 211 | + public @Nullable File getRootDir() { |
| 212 | + return null; |
| 213 | + } |
| 214 | + }); |
| 215 | + |
| 216 | + // set the new requests |
| 217 | + project.getLogger().info("Adding task to beginning of task graph! Project: {}, Task: {}", project.getName(), task.getName()); |
| 218 | + project.getGradle().getStartParameter().setTaskRequests(requests); |
| 219 | + return task; |
| 220 | + } |
182 | 221 | //endregion |
183 | 222 |
|
184 | 223 | //region Action Logging |
|
0 commit comments