Skip to content

Commit 3d851c1

Browse files
committed
Make scaffold task able to update existing libraries with newer versions
1 parent 96d705b commit 3d851c1

File tree

3 files changed

+131
-26
lines changed

3 files changed

+131
-26
lines changed

tests/tck-build-logic/src/main/java/org/graalvm/internal/tck/ContributionTask.java

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package org.graalvm.internal.tck;
22

3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.core.type.TypeReference;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.databind.SerializationFeature;
7+
import org.graalvm.internal.tck.model.MetadataIndexEntry;
38
import org.graalvm.internal.tck.utils.ConfigurationStringBuilder;
9+
import org.graalvm.internal.tck.utils.FilesUtils;
410
import org.graalvm.internal.tck.utils.InteractiveTaskUtils;
511
import org.gradle.api.DefaultTask;
612
import org.gradle.api.tasks.TaskAction;
@@ -25,6 +31,8 @@ public abstract class ContributionTask extends DefaultTask {
2531
private Path metadataDirectory;
2632
private Coordinates coordinates;
2733

34+
private static final String METADATA_INDEX = "metadata/index.json";
35+
2836
private static final String BUILD_FILE = "build.gradle";
2937
private static final String USER_CODE_FILTER_FILE = "user-code-filter.json";
3038
private static final String REQUIRED_DOCKER_IMAGES_FILE = "required-docker-images.txt";
@@ -43,6 +51,9 @@ void run() throws IOException {
4351
this.coordinates = getCoordinates();
4452
InteractiveTaskUtils.closeSection();
4553

54+
Path coordinatesMetadataRoot = getProject().file(CoordinateUtils.replace("metadata/$group$/$artifact$", coordinates)).toPath();
55+
boolean isExistingLibrary = Files.exists(coordinatesMetadataRoot);
56+
4657
Path testsLocation = getTestsLocation();
4758
InteractiveTaskUtils.closeSection();
4859

@@ -60,14 +71,14 @@ void run() throws IOException {
6071

6172
// initialize project
6273
initializeWorkingDirectories();
63-
createStubs();
74+
createStubs(isExistingLibrary);
75+
updateAllowedPackages(packages);
6476

6577
// generate necessary infrastructure
6678
addTests(testsLocation);
6779
addResources(resourcesLocation);
6880
addDockerImages(dockerImages);
6981
addUserCodeFilterFile(packages);
70-
// TODO Update allowed-packages
7182
addAdditionalDependencies(additionalTestImplementationDependencies);
7283
addAgentConfigBlock();
7384

@@ -130,7 +141,7 @@ private Path getTestsLocation() {
130141

131142
private void checkPackages(Path testsPath) {
132143
List<Path> javaFiles = new ArrayList<>();
133-
findJavaFiles(testsPath, javaFiles);
144+
FilesUtils.findJavaFiles(testsPath, javaFiles);
134145
javaFiles.forEach(file -> {
135146
try {
136147
Optional<String> packageLine = Files.readAllLines(file).stream().filter(line -> line.contains("package ")).findFirst();
@@ -151,24 +162,6 @@ private void checkPackages(Path testsPath) {
151162
});
152163
}
153164

154-
private void findJavaFiles(Path root, List<Path> result) {
155-
if (Files.exists(root) && Files.isRegularFile(root) && root.toString().endsWith(".java")) {
156-
result.add(root);
157-
return;
158-
}
159-
160-
if (Files.isDirectory(root)) {
161-
File[] content = root.toFile().listFiles();
162-
if (content == null) {
163-
return;
164-
}
165-
166-
for (var file : content) {
167-
findJavaFiles(file.toPath(), result);
168-
}
169-
}
170-
}
171-
172165
private Path getResourcesLocation(){
173166
String question = "Do your tests need any kind of resources? " +
174167
"Absolute path to the resources directory required for your tests (type \"-\" if resources are not required): ";
@@ -278,9 +271,41 @@ private List<Coordinates> getAdditionalDependencies() {
278271
return dependencies;
279272
}
280273

281-
private void createStubs(){
274+
private void createStubs(boolean shouldUpdate){
282275
InteractiveTaskUtils.printUserInfo("Generating stubs for: " + coordinates );
283-
invokeCommand("gradle scaffold --coordinates " + coordinates, "Cannot generate stubs for: " + coordinates);
276+
if (shouldUpdate) {
277+
invokeCommand("gradle scaffold --coordinates " + coordinates + " --update", "Cannot generate stubs for: " + coordinates);
278+
} else {
279+
invokeCommand("gradle scaffold --coordinates " + coordinates, "Cannot generate stubs for: " + coordinates);
280+
}
281+
}
282+
283+
private void updateAllowedPackages(List<String> allowedPackages) throws IOException {
284+
InteractiveTaskUtils.printUserInfo("Updating allowed packages in: " + METADATA_INDEX);
285+
File metadataIndex = getProject().file(METADATA_INDEX);
286+
var objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT).setSerializationInclusion(JsonInclude.Include.NON_NULL);
287+
288+
List<MetadataIndexEntry> entries = objectMapper.readValue(metadataIndex, new TypeReference<>() {});
289+
int replaceEntryIndex = -1;
290+
for (int i = 0; i < entries.size(); i++) {
291+
if (entries.get(i).module().equals(coordinates.group() + ":" + coordinates.artifact())) {
292+
replaceEntryIndex = i;
293+
}
294+
}
295+
296+
if (replaceEntryIndex != -1) {
297+
MetadataIndexEntry replacedEntry = entries.remove(replaceEntryIndex);
298+
Set<String> extendedAllowedPackages = new HashSet<>(replacedEntry.allowedPackages());
299+
extendedAllowedPackages.addAll(allowedPackages);
300+
301+
entries.add(new MetadataIndexEntry(replacedEntry.directory(), replacedEntry.module(), replacedEntry.requires(), new ArrayList<>(extendedAllowedPackages)));
302+
}
303+
304+
List<MetadataIndexEntry> sortedEntries = entries.stream()
305+
.sorted(Comparator.comparing(MetadataIndexEntry::module))
306+
.toList();
307+
308+
objectMapper.writeValue(metadataIndex, sortedEntries);
284309
}
285310

286311
private void addTests(Path originalTestsLocation){

tests/tck-build-logic/src/main/java/org/graalvm/internal/tck/ScaffoldTask.java

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.fasterxml.jackson.databind.ObjectMapper;
66
import com.fasterxml.jackson.databind.SerializationFeature;
77
import org.graalvm.internal.tck.model.MetadataIndexEntry;
8+
import org.graalvm.internal.tck.model.MetadataVersionsIndexEntry;
89
import org.graalvm.internal.tck.model.TestIndexEntry;
910
import org.gradle.api.DefaultTask;
1011
import org.gradle.api.logging.LogLevel;
@@ -36,6 +37,7 @@ class ScaffoldTask extends DefaultTask {
3637
private String coordinates;
3738

3839
private boolean force;
40+
private boolean update;
3941

4042
public ScaffoldTask() {
4143
}
@@ -55,6 +57,12 @@ void setForce(boolean force) {
5557
this.force = force;
5658
}
5759

60+
61+
@Option(option = "update", description = "Add metadata for new version of library that already exists in the repository")
62+
void setUpdate(boolean update) {
63+
this.update = update;
64+
}
65+
5866
@TaskAction
5967
void run() throws IOException {
6068
Coordinates coordinates = Coordinates.parse(this.coordinates);
@@ -63,13 +71,19 @@ void run() throws IOException {
6371
Path coordinatesMetadataVersionRoot = coordinatesMetadataRoot.resolve(coordinates.version());
6472
Path coordinatesTestRoot = getProject().file(CoordinateUtils.replace("tests/src/$group$/$artifact$/$version$", coordinates)).toPath();
6573

66-
checkExistingMetadata(coordinates, coordinatesMetadataRoot, coordinatesMetadataVersionRoot);
67-
6874
// Metadata
69-
writeCoordinatesMetadataRootJson(coordinatesMetadataRoot, coordinates);
75+
if (!update) {
76+
checkExistingMetadata(coordinates, coordinatesMetadataRoot, coordinatesMetadataVersionRoot);
77+
writeCoordinatesMetadataRootJson(coordinatesMetadataRoot, coordinates);
78+
} else {
79+
updateCoordinatesMetadataRootJson(coordinatesMetadataRoot, coordinates);
80+
}
81+
7082
writeCoordinatesMetadataVersionJsons(coordinatesMetadataVersionRoot, coordinates);
7183
addToMetadataIndexJson(coordinates);
7284

85+
86+
7387
// Tests
7488
writeTestScaffold(coordinatesTestRoot, coordinates);
7589
addToTestIndexJson(coordinates);
@@ -229,6 +243,45 @@ private void writeCoordinatesMetadataRootJson(Path metadataRoot, Coordinates coo
229243
);
230244
}
231245

246+
private void updateCoordinatesMetadataRootJson(Path metadataRoot, Coordinates coordinates) throws IOException {
247+
File metadataIndex = metadataRoot.resolve("index.json").toFile();
248+
List<MetadataVersionsIndexEntry> entries = objectMapper.readValue(metadataIndex, new TypeReference<>() {});
249+
int deleteIndex = -1;
250+
for (int i = 0; i < entries.size(); i++) {
251+
MetadataVersionsIndexEntry nextEntry = entries.get(i);
252+
if (nextEntry.latest() == null || nextEntry.latest()) {
253+
deleteIndex = i;
254+
}
255+
}
256+
257+
// replace entry that was previously marked with latest: true
258+
if (deleteIndex != -1) {
259+
MetadataVersionsIndexEntry deletedEntry = entries.remove(deleteIndex);
260+
MetadataVersionsIndexEntry replaceEntry = new MetadataVersionsIndexEntry(null,
261+
deletedEntry.override(),
262+
deletedEntry.module(),
263+
deletedEntry.defaultFor(),
264+
deletedEntry.metadataVersion(),
265+
deletedEntry.testedVersions());
266+
entries.add(replaceEntry);
267+
}
268+
269+
// create new latest entry
270+
MetadataVersionsIndexEntry newEntry = new MetadataVersionsIndexEntry(true,
271+
null,
272+
coordinates.group() + ":" + coordinates.artifact(),
273+
null,
274+
coordinates.version(),
275+
List.of(coordinates.version()));
276+
277+
entries.add(newEntry);
278+
List<MetadataVersionsIndexEntry> sortedEntries = entries.stream()
279+
.sorted(Comparator.comparing(MetadataVersionsIndexEntry::module))
280+
.toList();
281+
282+
objectMapper.writeValue(metadataIndex, sortedEntries);
283+
}
284+
232285
private String getEmptyJsonArray() {
233286
return "[]\n";
234287
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.graalvm.internal.tck.utils;
2+
3+
import java.io.File;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
import java.util.List;
7+
8+
public class FilesUtils {
9+
10+
public static void findJavaFiles(Path root, List<Path> result) {
11+
if (Files.exists(root) && Files.isRegularFile(root) && root.toString().endsWith(".java")) {
12+
result.add(root);
13+
return;
14+
}
15+
16+
if (Files.isDirectory(root)) {
17+
File[] content = root.toFile().listFiles();
18+
if (content == null) {
19+
return;
20+
}
21+
22+
for (var file : content) {
23+
findJavaFiles(file.toPath(), result);
24+
}
25+
}
26+
}
27+
}

0 commit comments

Comments
 (0)