Skip to content

Commit 38f39d1

Browse files
committed
ValueSource exclusionList
1 parent bca0a5e commit 38f39d1

File tree

4 files changed

+147
-16
lines changed

4 files changed

+147
-16
lines changed

src/main/java/org/gradlex/javamodule/dependencies/initialization/Directory.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import javax.inject.Inject;
2525
import java.io.File;
26+
import java.util.Arrays;
2627
import java.util.LinkedHashMap;
2728
import java.util.Map;
2829

@@ -41,14 +42,18 @@ public abstract class Directory {
4142
*/
4243
public abstract ListProperty<String> getPlugins();
4344

44-
@Inject
45-
protected abstract ObjectFactory getObjects();
4645

4746
@Inject
4847
public Directory(File root) {
4948
this.root = root;
49+
getExclusions().convention(Arrays.asList("build", "\\..*"));
5050
}
5151

52+
@Inject
53+
protected abstract ObjectFactory getObjects();
54+
55+
public abstract ListProperty<String> getExclusions();
56+
5257
/**
5358
* {@link Module#plugin(String)}
5459
*/
@@ -63,6 +68,7 @@ public void module(String subDirectory) {
6368
module(subDirectory, m -> {});
6469
}
6570

71+
6672
/**
6773
* Configure details of a Module in a subdirectory of this directory.
6874
* Note that Modules that are located in direct children of this directory are discovered automatically and

src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import org.gradle.api.plugins.JavaApplication;
2828
import org.gradle.api.plugins.JavaPlatformExtension;
2929
import org.gradle.api.plugins.JavaPlatformPlugin;
30+
import org.gradle.api.provider.Provider;
31+
import org.gradle.api.provider.ProviderFactory;
32+
import org.gradle.api.provider.ValueSourceSpec;
3033
import org.gradlex.javamodule.dependencies.JavaModuleDependenciesExtension;
3134
import org.gradlex.javamodule.dependencies.JavaModuleDependenciesPlugin;
3235
import org.gradlex.javamodule.dependencies.JavaModuleVersionsPlugin;
@@ -47,6 +50,9 @@ public abstract class JavaModulesExtension {
4750
@Inject
4851
public abstract ObjectFactory getObjects();
4952

53+
@Inject
54+
public abstract ProviderFactory getProviders();
55+
5056
@Inject
5157
public JavaModulesExtension(Settings settings) {
5258
this.settings = settings;
@@ -85,22 +91,24 @@ public void directory(String directory, Action<Directory> action) {
8591
Directory moduleDirectory = getObjects().newInstance(Directory.class, modulesDirectory);
8692
action.execute(moduleDirectory);
8793

88-
File[] projectDirs = modulesDirectory.listFiles();
89-
if (projectDirs == null) {
90-
throw new RuntimeException("Failed to inspect: " + modulesDirectory);
91-
}
9294

9395
for (Module module : moduleDirectory.customizedModules.values()) {
9496
includeModule(module, new File(modulesDirectory, module.getDirectory().get()));
9597
}
98+
Provider<List<String>> listProvider = getProviders().of(ValueSourceDirectoryListing.class, new Action<ValueSourceSpec<ValueSourceDirectoryListing.DirectoryListingParameter>>() {
99+
@Override
100+
public void execute(ValueSourceSpec<ValueSourceDirectoryListing.DirectoryListingParameter> spec) {
101+
spec.getParameters().getRegexExclusions().set(moduleDirectory.getExclusions());
102+
spec.getParameters().getExclusions().set(moduleDirectory.customizedModules.keySet());
103+
spec.getParameters().getDir().set(modulesDirectory);
104+
}
105+
});
96106

97-
for (File projectDir : projectDirs) {
98-
if (!moduleDirectory.customizedModules.containsKey(projectDir.getName())) {
99-
Module module = moduleDirectory.addModule(projectDir.getName());
100-
if (!module.getModuleInfoPaths().get().isEmpty()) {
101-
// only auto-include if there is at least one module-info.java
102-
includeModule(module, projectDir);
103-
}
107+
for (String projectDir : listProvider.get()) {
108+
Module module = moduleDirectory.addModule(projectDir);
109+
if (!module.getModuleInfoPaths().get().isEmpty()) {
110+
// only auto-include if there is at least one module-info.java
111+
includeModule(module, new File(modulesDirectory, projectDir));
104112
}
105113
}
106114
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright the GradleX team.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.gradlex.javamodule.dependencies.initialization;
18+
19+
import org.gradle.api.provider.Property;
20+
import org.gradle.api.provider.SetProperty;
21+
import org.gradle.api.provider.ValueSource;
22+
import org.gradle.api.provider.ValueSourceParameters;
23+
24+
import java.io.File;
25+
import java.util.Arrays;
26+
import java.util.List;
27+
import java.util.stream.Collectors;
28+
29+
public abstract class ValueSourceDirectoryListing implements ValueSource<List<String>, ValueSourceDirectoryListing.DirectoryListingParameter> {
30+
31+
32+
@Override
33+
public List<String> obtain() {
34+
File file = getParameters().getDir().get();
35+
String[] list = file.list();
36+
if (list == null) {
37+
throw new RuntimeException("Failed to inspect: " + file.getAbsolutePath());
38+
}
39+
return Arrays.stream(list)
40+
.filter(x -> !getParameters().getExclusions().get().contains(x))
41+
.filter(x -> getParameters().getRegexExclusions().get().stream().noneMatch(x::matches))
42+
.sorted()
43+
.collect(Collectors.toList());
44+
45+
46+
}
47+
48+
interface DirectoryListingParameter extends ValueSourceParameters {
49+
50+
Property<File> getDir();
51+
52+
SetProperty<String> getExclusions();
53+
54+
SetProperty<String> getRegexExclusions();
55+
56+
}
57+
}

src/test/groovy/org/gradlex/javamodule/dependencies/test/initialization/SettingsPluginTest.groovy

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,75 @@ class SettingsPluginTest extends Specification {
9090
result.getOutput().contains("Calculating task graph as no cached configuration is available for tasks: :app:compileJava")
9191

9292
when:
93-
runner.build() // https://github.com/gradlex-org/java-module-dependencies/issues/128
9493
result = runner.build()
9594

9695
then:
9796
result.getOutput().contains("Reusing configuration cache.")
9897
}
9998

99+
def "configurationCacheHitExtraDir"() {
100+
given:
101+
settingsFile << '''
102+
javaModules {
103+
directory(".") { plugin("java-library") }
104+
}
105+
'''
106+
libModuleInfoFile << 'module abc.lib { }'
107+
appModuleInfoFile << '''
108+
module org.gradlex.test.app {
109+
requires abc.lib;
110+
}
111+
'''
112+
113+
114+
def runner = runner(':app:compileJava')
115+
when:
116+
def result = runner.build()
117+
118+
then:
119+
result.getOutput().contains("Calculating task graph as no cached configuration is available for tasks: :app:compileJava")
120+
121+
when:
122+
new File(settingsFile.parentFile, ".thisShallBeIgnored").mkdir()
123+
124+
result = runner.build()
125+
126+
then:
127+
result.getOutput().contains("Reusing configuration cache.")
128+
}
129+
130+
def "configurationCacheHitExtraNotIgnored"() {
131+
given:
132+
settingsFile << '''
133+
javaModules {
134+
directory(".") { plugin("java-library") }
135+
}
136+
'''
137+
libModuleInfoFile << 'module abc.lib { }'
138+
appModuleInfoFile << '''
139+
module org.gradlex.test.app {
140+
requires abc.lib;
141+
}
142+
'''
143+
144+
145+
def runner = runner(':app:compileJava')
146+
when:
147+
def result = runner.build()
148+
149+
then:
150+
result.getOutput().contains("Calculating task graph as no cached configuration is available for tasks: :app:compileJava")
151+
152+
when:
153+
new File(settingsFile.parentFile, "thisShallNotBeIgnored").mkdir()
154+
155+
result = runner.build()
156+
157+
then:
158+
result.getOutput().contains("Calculating task graph as configuration cache cannot be reused because a build logic input of type 'ValueSourceDirectoryListing' has changed.")
159+
}
160+
161+
100162
def "configurationCacheHitIrrelevantChange"() {
101163
given:
102164
settingsFile << '''
@@ -119,7 +181,6 @@ class SettingsPluginTest extends Specification {
119181
result.getOutput().contains("Calculating task graph as no cached configuration is available for tasks: :app:compileJava")
120182

121183
when:
122-
runner.build() // https://github.com/gradlex-org/java-module-dependencies/issues/128
123184
appModuleInfoFile.write('''
124185
module org.gradlex.test.app {
125186
requires abc.lib; //This is a comment and should not break the configurationCache
@@ -153,7 +214,6 @@ class SettingsPluginTest extends Specification {
153214
result.getOutput().contains("Calculating task graph as no cached configuration is available for tasks: :app:compileJava")
154215

155216
when:
156-
runner.build() // https://github.com/gradlex-org/java-module-dependencies/issues/128
157217
appModuleInfoFile.write('''
158218
module org.gradlex.test.app {
159219
//dependency removed; so thats indeed a configuration change

0 commit comments

Comments
 (0)