From 247ff1822d2f1d51699acc80119b1e4eb6395224 Mon Sep 17 00:00:00 2001 From: Jack Hicks Date: Sun, 2 Nov 2025 22:17:50 +0000 Subject: [PATCH 1/2] feat(Manifests): globbing in allFilesPresent --- .../java/me/itzg/helpers/files/Manifests.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/itzg/helpers/files/Manifests.java b/src/main/java/me/itzg/helpers/files/Manifests.java index 5bdc10e3..4c00691a 100644 --- a/src/main/java/me/itzg/helpers/files/Manifests.java +++ b/src/main/java/me/itzg/helpers/files/Manifests.java @@ -2,8 +2,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import java.io.IOException; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -121,13 +125,29 @@ public static boolean allFilesPresent(Path basePath, BaseManifest manifest) { * @param ignoreMissingFiles relative paths of files to ignore if they're missing */ public static boolean allFilesPresent(Path basePath, BaseManifest manifest, @Nullable List ignoreMissingFiles) { + if (ignoreMissingFiles == null || ignoreMissingFiles.isEmpty()) { + return manifest.getFiles().stream() + .allMatch(p -> Files.exists(basePath.resolve(p))); + } + + if (ignoreMissingFiles.stream().anyMatch(s -> s.equals("*"))) { + return true; + } + + FileSystem fs = FileSystems.getDefault(); + List matchers = ignoreMissingFiles.stream() + .map(pattern -> fs.getPathMatcher("glob:" + pattern)) + .collect(Collectors.toList()); + return manifest.getFiles().stream() - .allMatch(p -> - (ignoreMissingFiles != null && ignoreMissingFiles.contains(p)) - || Files.exists(basePath.resolve(p)) - ); + .allMatch(p -> { + Path file = Paths.get(p); + boolean ignored = matchers.stream().anyMatch(m -> m.matches(file)); + return ignored || Files.exists(basePath.resolve(p)); + }); } + /** * * @param outputDir directory where manifest and other module files are based From 5663f239abf582e17a4209a37922ad0c7db8e537 Mon Sep 17 00:00:00 2001 From: Jack Hicks Date: Sun, 2 Nov 2025 22:53:41 +0000 Subject: [PATCH 2/2] test(ManifestsTest): test allFilesPresent --- .../me/itzg/helpers/files/ManifestsTest.java | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/test/java/me/itzg/helpers/files/ManifestsTest.java b/src/test/java/me/itzg/helpers/files/ManifestsTest.java index 793e9732..ccbc25f9 100644 --- a/src/test/java/me/itzg/helpers/files/ManifestsTest.java +++ b/src/test/java/me/itzg/helpers/files/ManifestsTest.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; import java.util.Collections; import lombok.Getter; import lombok.experimental.SuperBuilder; @@ -13,14 +14,13 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -class ManifestsTest { +public class ManifestsTest { @TempDir Path tempDir; @Getter @SuperBuilder @Jacksonized static class EmptyManifest extends BaseManifest { - } @Test @@ -33,4 +33,39 @@ void loadFailsGracefullyWhenInvalid() throws IOException { final EmptyManifest manifest = Manifests.load(tempDir, id, EmptyManifest.class); assertThat(manifest).isNull(); } -} \ No newline at end of file + + @Test + void allFilesPresent_withWildcardIgnoreAll() { + EmptyManifest manifest = EmptyManifest.builder() + .files(Arrays.asList("a.jar", "b.jar")) + .build(); + + boolean result = Manifests.allFilesPresent(tempDir, manifest, Collections.singletonList("*")); + assertThat(result).isTrue(); + } + + @Test + void allFilesPresent_withGlobPattern() throws IOException { + Files.createDirectories(tempDir.resolve("mods")); + Files.createFile(tempDir.resolve("mods/present.jar")); + + EmptyManifest manifest = EmptyManifest.builder() + .files(Arrays.asList("mods/present.jar", "mods/missing.jar")) + .build(); + + boolean result = Manifests.allFilesPresent(tempDir, manifest, Collections.singletonList("mods/*.jar")); + assertThat(result).isTrue(); + } + + @Test + void allFilesPresent_withExplicitFileNames() throws IOException { + Files.createFile(tempDir.resolve("keep.jar")); + + EmptyManifest manifest = EmptyManifest.builder() + .files(Arrays.asList("keep.jar", "remove.jar")) + .build(); + + boolean result = Manifests.allFilesPresent(tempDir, manifest, Collections.singletonList("remove.jar")); + assertThat(result).isTrue(); + } +}