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

Configuration cache support for SourceSetHelper.findFileInResource #1158

Merged
merged 4 commits into from
Aug 12, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,7 @@ public LoomFilesBaseImpl() { }

private static File createFile(File parent, String child) {
File file = new File(parent, child);

if (!file.exists()) {
file.mkdirs();
}

file.mkdirs();
return file;
}

Expand Down
10 changes: 10 additions & 0 deletions src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@

package net.fabricmc.loom.util.gradle;

import java.io.File;
import java.util.function.Consumer;

import org.gradle.api.Project;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.invocation.Gradle;
import org.gradle.api.provider.Provider;

Expand Down Expand Up @@ -78,4 +80,12 @@ public static Provider<Boolean> getBooleanPropertyProvider(Project project, Stri
public static boolean getBooleanProperty(Project project, String key) {
return getBooleanPropertyProvider(project, key).getOrElse(false);
}

// A hack to include the given file in the configuration cache input
// this ensures that configuration cache is invalidated when the file changes
public static File configurationInputFile(Project project, File file) {
final RegularFileProperty property = project.getObjects().fileProperty();
property.set(file);
return property.getAsFile().get();
}
}
10 changes: 8 additions & 2 deletions src/main/java/net/fabricmc/loom/util/gradle/SourceSetHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,14 @@ public static File findFileInResource(SourceSet sourceSet, String path) {
final LoomGradleExtension extension = LoomGradleExtension.get(project);

if (extension.isConfigurationCacheActive()) {
// TODO config cache, figure this out
project.getLogger().warn("Unable to find resource ({}) in source set ({}) when configuration cache is active", path, sourceSet.getName());
for (File rootDir: sourceSet.getResources().getSrcDirs()) {
final File file = GradleUtils.configurationInputFile(project, new File(rootDir, path));

if (file.exists()) {
return file;
}
}

return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import spock.lang.Unroll
import net.fabricmc.loom.test.util.GradleProjectTestTrait

import static net.fabricmc.loom.test.LoomTestConstants.PRE_RELEASE_GRADLE
import static net.fabricmc.loom.test.LoomTestConstants.STANDARD_TEST_VERSIONS
import static org.gradle.testkit.runner.TaskOutcome.FAILED

class ConfigurationCacheTest extends Specification implements GradleProjectTestTrait {
Expand Down Expand Up @@ -60,4 +61,75 @@ class ConfigurationCacheTest extends Specification implements GradleProjectTestT
"jar" | _
"check" | _
}

// Test GradleUtils.configurationInputFile invalidates the cache when the file changes
@Unroll
def "File input (#version)"() {
setup:
def gradle = gradleProject(project: "minimalBase", version: version)
gradle.buildGradle << """
dependencies {
minecraft 'com.mojang:minecraft:1.20.4'
mappings 'net.fabricmc:yarn:1.20.4+build.3:v2'
modImplementation 'net.fabricmc:fabric-loader:0.15.6'
}

abstract class TestTask extends DefaultTask {
@Input
abstract Property<String> getModVersion()

@TaskAction
void run() {
println "Version: " + modVersion.get()
}
}

println "Configuring task testTask"
tasks.register('testTask', TestTask) {
modVersion.set(loom.getModVersion()) // loom.getModVersion() returns a String
}
""".stripIndent()

def fabricModJson = new File(gradle.projectDir, "src/main/resources/fabric.mod.json")
fabricModJson.parentFile.mkdirs()
fabricModJson.text = fmj("1.0.0")

when:
def result = gradle.run(task: "testTask", configurationCache: true)
def result2 = gradle.run(task: "testTask", configurationCache: true)
fabricModJson.text = fmj("2.0.0")
def result3 = gradle.run(task: "testTask", configurationCache: true)

then:
// Test that the cache is created
result.task(":testTask").outcome != FAILED
result.output.contains("Calculating task graph as no cached configuration is available for tasks: testTask")
result.output.contains("Configuring task testTask")
result.output.contains("Version: 1.0.0")

// Test that the cache is reused when nothing has changed
result2.task(":testTask").outcome != FAILED
!result2.output.contains("Calculating task graph")
!result2.output.contains("Configuring task testTask")
result2.output.contains("Version: 1.0.0")

// Test that the cache is invalidated when the file changes
result3.task(":testTask").outcome != FAILED
result3.output.contains("Calculating task graph as configuration cache cannot be reused because file 'src/main/resources/fabric.mod.json' has changed.".replace("/", File.separator))
result3.output.contains("Configuring task testTask")
result3.output.contains("Version: 2.0.0")

where:
version << STANDARD_TEST_VERSIONS
}

static def fmj(String version) {
return """
{
"schemaVersion": 1,
"id": "test",
"version": "${version}"
}
"""
}
}