Skip to content

Commit ba15d27

Browse files
committed
Add SharedUtil#runFirst
Adds a given task to the beginning of the task graph unconditionally. This effectively enforces that task to run on every Gradle invocation, including project sync and import.
1 parent 62a86bb commit ba15d27

File tree

1 file changed

+39
-0
lines changed
  • gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared

1 file changed

+39
-0
lines changed

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/SharedUtil.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import groovy.lang.DelegatesTo;
99
import groovy.transform.stc.ClosureParams;
1010
import groovy.transform.stc.FirstParam;
11+
import org.gradle.TaskExecutionRequest;
1112
import org.gradle.api.Action;
1213
import org.gradle.api.Project;
1314
import org.gradle.api.Transformer;
@@ -19,10 +20,12 @@
1920
import org.gradle.api.provider.Property;
2021
import org.gradle.api.provider.Provider;
2122
import org.gradle.api.provider.ProviderFactory;
23+
import org.gradle.api.tasks.TaskProvider;
2224
import org.gradle.jvm.toolchain.JavaLanguageVersion;
2325
import org.gradle.jvm.toolchain.JavaLauncher;
2426
import org.gradle.jvm.toolchain.JavaToolchainService;
2527
import org.jetbrains.annotations.Contract;
28+
import org.jetbrains.annotations.Nullable;
2629

2730
import javax.inject.Inject;
2831
import java.io.BufferedReader;
@@ -31,6 +34,8 @@
3134
import java.io.InputStreamReader;
3235
import java.io.PipedInputStream;
3336
import java.io.PipedOutputStream;
37+
import java.util.ArrayList;
38+
import java.util.List;
3439
import java.util.function.Consumer;
3540

3641
/// Shared utilities for Gradle plugins.
@@ -179,6 +184,40 @@ public static void ensureAfterEvaluate(Project project, Action<? super Project>
179184
else
180185
project.afterEvaluate(action);
181186
}
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+
}
182221
//endregion
183222

184223
//region Action Logging

0 commit comments

Comments
 (0)