From fe684083e7b3ec910a5b8b246c5b1a9bb9643653 Mon Sep 17 00:00:00 2001 From: Robert Stoneking Date: Fri, 21 Aug 2026 20:59:26 -0600 Subject: [PATCH] Adding myself and fixing Windows Tests. --- .gitignore | 5 ++ ...IrisChunkGeneratorFailureContractTest.java | 38 ++++++------ ...nkGeneratorMonumentLocateContractTest.java | 10 ++-- ...dingCurrentPaperWorldDataContractTest.java | 6 +- .../NMSBindingDatapackStructureScopeTest.java | 8 +-- ...MSBindingPlacementFailureContractTest.java | 2 +- ...SBindingServerLevelAdviceContractTest.java | 6 +- ...MSBindingShutdownBoundaryContractTest.java | 2 +- ...MSBindingStructureFailureContractTest.java | 2 +- ...NMSBindingTileDeserializeContractTest.java | 2 +- ...ativeStructurePostProcessorEncaseTest.java | 2 +- .../iris/core/PendingWorldDeleteQueue.java | 6 ++ .../iris/IrisDiagnosticLogLevelTest.java | 4 +- .../core/IrisWorldGeneratorResolverTest.java | 6 +- ...ingWorldReplacementThreadAffinityTest.java | 18 +++--- ...ommandIrisCreateOverwriteContractTest.java | 2 +- .../CommandIrisDownloadContractTest.java | 2 +- .../commands/CommandJigsawContractTest.java | 6 +- .../iris/core/link/IrisPapiExpansionTest.java | 2 +- .../iris/core/link/IrisPapiLifecycleTest.java | 6 +- .../runtime/StudioPlayerModeContractTest.java | 4 +- build.gradle | 37 ++++++++++++ .../core/datapack/DatapackIngestService.java | 7 ++- .../service/JigsawStudioHistoryStore.java | 6 ++ .../core/DiagnosticSeverityPolicyTest.java | 2 +- .../art/arcane/iris/core/IrisWorldsTest.java | 2 +- .../iris/core/ProgressBossBarToggleTest.java | 2 +- ...erConfiguratorDatapackFingerprintTest.java | 4 +- ...DatapackIngestRuntimeInvalidationTest.java | 4 +- .../datapack/DatapackIngestServiceTest.java | 6 +- .../lifecycle/MissingWorldStorageLogTest.java | 6 +- .../core/link/MultiverseCoreLinkTest.java | 2 +- .../iris/core/pack/PackExportClosureTest.java | 4 +- .../runtime/StudioEntitySpawningTest.java | 4 +- .../StudioOpenCoordinatorOpenKindTest.java | 10 ++-- ...enCoordinatorSpawnStuckRegressionTest.java | 4 +- .../service/JigsawStudioLifecycleTest.java | 2 +- .../PackDownloadProgressReporterTest.java | 2 +- .../StudioSVCPackDownloadContractTest.java | 8 +-- ...tudioSVCWorldPackFeedbackContractTest.java | 2 +- .../StudioSVCWorldPackPublishTest.java | 4 +- .../IrisCreatorProgressContractTest.java | 2 +- ...isPersistentWorldCreationContractTest.java | 6 +- .../WorldCreationProgressReporterTest.java | 2 +- .../EngineRuntimePublicationContractTest.java | 4 +- .../EngineShutdownOwnershipContractTest.java | 4 +- ...ructureBootstrapLifecycleContractTest.java | 10 ++-- .../specialhandlers/StructureHandlerTest.java | 2 +- publish-volmlib.bat | 59 +++++++++++++++++++ publish-volmlib.sh | 57 ++++++++++++++++++ 50 files changed, 291 insertions(+), 112 deletions(-) create mode 100644 publish-volmlib.bat create mode 100644 publish-volmlib.sh diff --git a/.gitignore b/.gitignore index 9b7484762..3b51b24f3 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,8 @@ __pycache__/ .docs-wip/ AGENTS.md + +# Local build tooling, not part of the project +build-lt.sh +BUILDS/ +.run/ diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorFailureContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorFailureContractTest.java index 6f9a0480c..d1365b6c5 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorFailureContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorFailureContractTest.java @@ -25,7 +25,7 @@ import static org.junit.Assert.assertTrue; public class IrisChunkGeneratorFailureContractTest { @Test public void structureLocateDoesNotCatchAndFallThroughToAnotherImplementation() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int locateStart = source.indexOf("public @Nullable Pair> findNearestMapStructure"); int locateEnd = source.indexOf("private HolderSet filterReachableStructures", locateStart); String locate = source.substring(locateStart, locateEnd); @@ -51,7 +51,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void structureGenerationAbortsInsteadOfLoggingAndContinuing() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int adjustmentStart = source.indexOf("private void adjustGeneratedStructures"); int adjustmentEnd = source.indexOf("public ChunkGeneratorStructureState createState", adjustmentStart); String adjustment = source.substring(adjustmentStart, adjustmentEnd); @@ -83,7 +83,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void heightmapRuntimeReadsAreGenerationLeased() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); assertTrue(source.contains("engine.acquireGenerationLease(\"bukkit_nms_heightmaps\")")); assertTrue(source.contains("engine.acquireGenerationLease(\"bukkit_nms_base_height\")")); @@ -93,7 +93,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void structureReferenceRepairIsGenerationLeased() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int referencesStart = source.indexOf("public void createReferences"); int referencesEnd = source.indexOf("public CompletableFuture createBiomes", referencesStart); String references = source.substring(referencesStart, referencesEnd); @@ -116,7 +116,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void structureGenerationAcquiresBootstrapGateBeforeUsingPublishedState() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int generationStart = source.indexOf("public void createStructures("); int generationEnd = source.indexOf("private void adjustGeneratedStructures", generationStart); String generation = source.substring(generationStart, generationEnd); @@ -144,7 +144,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void nativeRingBootstrapTracksTheExactMinecraftFutures() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int initializeStart = source.indexOf("private CompletableFuture initializeStructureState("); int initializeEnd = source.indexOf("private Map structureRingPositions", initializeStart); String initialize = source.substring(initializeStart, initializeEnd); @@ -169,7 +169,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void standardActivationClaimsTheExactPublishedStateBeforeInitialization() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int activationStart = source.indexOf("CompletableFuture activateStudioStructureState("); int activationEnd = source.indexOf( "private CompletableFuture startStructureStateBootstrap", activationStart); @@ -195,7 +195,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void terrainWritesPrimeTheWorldgenHeightmapsForEveryChunk() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int fillStart = source.indexOf("public CompletableFuture fillFromNoise"); int fillEnd = source.indexOf("public WeightedList getMobsAt", fillStart); String fill = source.substring(fillStart, fillEnd); @@ -221,7 +221,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void fillFromNoiseLeaseSpansTheDelegateAndHeightmapPipeline() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int fillStart = source.indexOf("public CompletableFuture fillFromNoise"); int fillEnd = source.indexOf("private static boolean isCancellationFailure", fillStart); String fill = source.substring(fillStart, fillEnd); @@ -324,7 +324,7 @@ public class IrisChunkGeneratorFailureContractTest { CompletionException failure = assertThrows(CompletionException.class, transformed::join); assertTrue(failure.getCause() instanceof CancellationException); - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); String cancellation = method( source, "private static boolean isCancellationFailure", @@ -335,7 +335,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void noiseAdmissionCanPrepareStudioBeforeAcquiringTheGenerationLease() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); String fill = method( source, "public CompletableFuture fillFromNoise", @@ -356,7 +356,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void everyTopLevelMoonriseStageEntersTheFairGateBeforeItsGenerationLease() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); String structures = method(source, "public void createStructures(", "private void adjustGeneratedStructures"); String references = method(source, "public void createReferences(", "public CompletableFuture createBiomes"); String biomes = method(source, "public CompletableFuture createBiomes", "public void buildSurface"); @@ -388,7 +388,7 @@ public class IrisChunkGeneratorFailureContractTest { assertTrue("Worldgen heightmap priming must be shared with the modded loaders through " + nativegen, Files.isRegularFile(shared)); - String heightmaps = Files.readString(shared); + String heightmaps = Files.readString(shared).replace("\r\n", "\n"); assertTrue(heightmaps.contains("package art.arcane.iris.nativegen;")); assertTrue(heightmaps.contains("public static void primeTerrain(")); @@ -396,14 +396,14 @@ public class IrisChunkGeneratorFailureContractTest { assertFalse(heightmaps.contains("org.bukkit")); assertFalse(heightmaps.contains("craftbukkit")); - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); assertTrue(source.contains("import art.arcane.iris.nativegen.WorldgenTerrainHeightmaps;")); } @Test public void onlySidecarOwnedInjectedStartsUsePersistedPlacementPolicy() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int placementStart = source.indexOf("private void placeVanillaStructures"); int placementEnd = source.indexOf("private static String nativeStructureBatchContext", placementStart); String placement = source.substring(placementStart, placementEnd); @@ -414,9 +414,9 @@ public class IrisChunkGeneratorFailureContractTest { int adjustmentEnd = source.indexOf("public ChunkGeneratorStructureState createState", adjustmentStart); String adjustment = source.substring(adjustmentStart, adjustmentEnd); Path nativegen = Path.of(System.getProperty("iris.nativeStructurePostProcessorSource")).getParent(); - String factory = Files.readString(nativegen.resolve("NativeStructureFactory.java")); - String injector = Files.readString(nativegen.resolve("NativeStructureStartInjector.java")); - String recovery = Files.readString(nativegen.resolve("NativeStructureOwnershipRecovery.java")); + String factory = Files.readString(nativegen.resolve("NativeStructureFactory.java")).replace("\r\n", "\n"); + String injector = Files.readString(nativegen.resolve("NativeStructureStartInjector.java")).replace("\r\n", "\n"); + String recovery = Files.readString(nativegen.resolve("NativeStructureOwnershipRecovery.java")).replace("\r\n", "\n"); int ownershipRecord = injector.indexOf("NativeStructureOwnershipStore.record("); int startPublication = injector.indexOf( "context.structureManager().setStartForStructure(", ownershipRecord); @@ -476,7 +476,7 @@ public class IrisChunkGeneratorFailureContractTest { @Test public void vanillaChunkGenerationMobsUseTheVisibleBiomesVanillaDerivative() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int spawnStart = source.indexOf("public void spawnOriginalMobs"); int spawnEnd = source.indexOf("private static WeightedList", spawnStart); String spawn = source.substring(spawnStart, spawnEnd); diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorMonumentLocateContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorMonumentLocateContractTest.java index ca44d0a5b..3b4b2f4af 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorMonumentLocateContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/IrisChunkGeneratorMonumentLocateContractTest.java @@ -20,7 +20,7 @@ import static org.junit.Assert.assertSame; public class IrisChunkGeneratorMonumentLocateContractTest { @Test public void nativeLocateAllowsMonumentsAfterPolicyAndReachabilityChecks() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int findStart = source.indexOf("findNearestMapStructure(ServerLevel level"); assertTrue(findStart >= 0); int irisHelperStart = source.indexOf("private Pair> findNearestIrisStructure(", findStart); @@ -120,7 +120,7 @@ public class IrisChunkGeneratorMonumentLocateContractTest { @Test public void nativePredictionIsReadOnlyUntilTheWinnerIsCommitted() throws IOException { Path nativegen = Path.of(System.getProperty("iris.nativeStructurePostProcessorSource")).getParent(); - String source = Files.readString(nativegen.resolve("NativeStructureVanillaLocator.java")); + String source = Files.readString(nativegen.resolve("NativeStructureVanillaLocator.java")).replace("\r\n", "\n"); int predictionStart = source.indexOf("private static Candidate predictAt("); int candidateStart = source.indexOf("public static final class Candidate", predictionStart); String prediction = source.substring(predictionStart, candidateStart); @@ -134,9 +134,9 @@ public class IrisChunkGeneratorMonumentLocateContractTest { @Test public void stiltSupportUsesPlacedSolidOccupancyWithoutSnapshotDifferenceRequirement() throws IOException { Path processor = Path.of(System.getProperty("iris.nativeStructurePostProcessorSource")); - String source = Files.readString(processor); + String source = Files.readString(processor).replace("\r\n", "\n"); String foundation = Files.readString( - processor.resolveSibling("NativeStructureFoundationBuilder.java")); + processor.resolveSibling("NativeStructureFoundationBuilder.java")).replace("\r\n", "\n"); int placement = source.indexOf("start.placeInChunk(world, structureManager, generator"); int stiltPlacement = source.indexOf("placeStilts(world, area, structureId, start", placement); int stiltDefinition = foundation.indexOf("static void placeStilts("); @@ -158,7 +158,7 @@ public class IrisChunkGeneratorMonumentLocateContractTest { public void verticalPlacementMovesPiecesMonumentChildrenJigsawJunctionsAndCachedBoundsTogether() throws IOException { String source = Files.readString( Path.of(System.getProperty("iris.nativeStructurePostProcessorSource")) - .resolveSibling("NativeStructureVerticalPlacer.java")); + .resolveSibling("NativeStructureVerticalPlacer.java")).replace("\r\n", "\n"); int placementStart = source.indexOf("public static int applyVerticalPlacement"); int shiftStart = source.indexOf("public static int applyVerticalShift", placementStart); int alignmentStart = source.indexOf("static int alignOceanMonumentToSeaLevel", shiftStart); diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingCurrentPaperWorldDataContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingCurrentPaperWorldDataContractTest.java index 396124c17..f86afcf2f 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingCurrentPaperWorldDataContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingCurrentPaperWorldDataContractTest.java @@ -18,7 +18,7 @@ import static org.junit.Assert.assertTrue; public class NMSBindingCurrentPaperWorldDataContractTest { @Test public void bindingDelegatesWithoutLinkingPaperSavedDataClasses() throws Exception { - String bindingSource = Files.readString(bindingSourcePath()); + String bindingSource = Files.readString(bindingSourcePath()).replace("\r\n", "\n"); String writer = section( bindingSource, "public void writeCurrentPaperWorldData(", @@ -43,7 +43,7 @@ public class NMSBindingCurrentPaperWorldDataContractTest { @Test public void stagesAllCurrentPaperWorldDataFromLiveServerState() throws Exception { - String writer = Files.readString(writerSourcePath()); + String writer = Files.readString(writerSourcePath()).replace("\r\n", "\n"); assertTrue(writer.contains("WorldReplacementSeed.copyWithAuthoritativeSeed(")); assertTrue(writer.contains("UUID metadataUuid = UUID.randomUUID()")); @@ -69,7 +69,7 @@ public class NMSBindingCurrentPaperWorldDataContractTest { @Test public void capturesOnlyLiveLevelOverridesOnTheGlobalThread() throws Exception { - String source = Files.readString(writerSourcePath()); + String source = Files.readString(writerSourcePath()).replace("\r\n", "\n"); String capture = section( source, "private static PaperLevelOverrides captureLevelOverrides(", diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingDatapackStructureScopeTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingDatapackStructureScopeTest.java index 401f1219e..3dac36b41 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingDatapackStructureScopeTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingDatapackStructureScopeTest.java @@ -354,7 +354,7 @@ public class NMSBindingDatapackStructureScopeTest { @Test public void standardPublishesOneDeferredStateWhileJigsawPublishesInitializedEmptyState() throws IOException { Path chunkGeneratorSource = Path.of(System.getProperty("iris.nmsChunkGeneratorSource")); - String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")); + String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")).replace("\r\n", "\n"); int methodStart = source.indexOf("public DatapackStructureScopeResult scopeDatapackStructures("); int methodEnd = source.indexOf("\n @Override\n public void completeStudioStructureBootstrap", methodStart); @@ -392,7 +392,7 @@ public class NMSBindingDatapackStructureScopeTest { @Test public void standardCompletionActivatesTheAlreadyPublishedStateWithoutReplacingIt() throws IOException { Path chunkGeneratorSource = Path.of(System.getProperty("iris.nmsChunkGeneratorSource")); - String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")); + String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")).replace("\r\n", "\n"); int methodStart = source.indexOf("public void completeStudioStructureBootstrap(World world)"); int methodEnd = source.indexOf("\n @Override\n public void abandonStudioStructureBootstrap", methodStart); @@ -411,7 +411,7 @@ public class NMSBindingDatapackStructureScopeTest { @Test public void injectionVerifiesTheCanonicalPaperGeneratorBeforeStructureRetargeting() throws IOException { Path chunkGeneratorSource = Path.of(System.getProperty("iris.nmsChunkGeneratorSource")); - String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")); + String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")).replace("\r\n", "\n"); int methodStart = source.indexOf("public void inject(long seed, Engine engine, World world)"); int methodEnd = source.indexOf("\n @Override\n public DatapackStructureScopeResult", methodStart); @@ -432,7 +432,7 @@ public class NMSBindingDatapackStructureScopeTest { @Test public void structureStateRecreationUsesTheWorldOwnedSpigotConfiguration() throws IOException { Path chunkGeneratorSource = Path.of(System.getProperty("iris.nmsChunkGeneratorSource")); - String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")); + String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")).replace("\r\n", "\n"); int methodStart = source.indexOf("private ChunkGeneratorStructureState createStructureState("); int methodEnd = source.indexOf( "\n private void initializeAndPublishStructureState(", methodStart); diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingPlacementFailureContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingPlacementFailureContractTest.java index bbe7e5202..0a536d13a 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingPlacementFailureContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingPlacementFailureContractTest.java @@ -13,7 +13,7 @@ public class NMSBindingPlacementFailureContractTest { @Test public void structurePlacementPropagatesRuntimeFailuresWithContext() throws IOException { Path chunkGeneratorSource = Path.of(System.getProperty("iris.nmsChunkGeneratorSource")); - String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")); + String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")).replace("\r\n", "\n"); int methodStart = source.indexOf("public int[] placeStructure("); int methodEnd = source.indexOf("\n @Override", methodStart + 1); String method = source.substring(methodStart, methodEnd); diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingServerLevelAdviceContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingServerLevelAdviceContractTest.java index a63374c1e..fd1f4e4b8 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingServerLevelAdviceContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingServerLevelAdviceContractTest.java @@ -12,7 +12,7 @@ public class NMSBindingServerLevelAdviceContractTest { @Test public void serverLevelAdviceSupportsCurrentSpigotAndPaperConstructorLayouts() throws Exception { String source = Files.readString( - Path.of(System.getProperty("iris.nmsBindingSource"))); + Path.of(System.getProperty("iris.nmsBindingSource"))).replace("\r\n", "\n"); String transformer = section( source, "public boolean injectBukkit()", @@ -35,7 +35,7 @@ public class NMSBindingServerLevelAdviceContractTest { @Test public void currentSpigotStorageAccessReceivesManagedIdentityBeforeConstruction() throws Exception { String source = Files.readString( - Path.of(System.getProperty("iris.nmsBindingSource"))); + Path.of(System.getProperty("iris.nmsBindingSource"))).replace("\r\n", "\n"); String transformer = section( source, "public boolean injectBukkit()", @@ -68,7 +68,7 @@ public class NMSBindingServerLevelAdviceContractTest { @Test public void ownedWorldPublishesItsManagedIdentityAndRuntimeStemTogether() throws Exception { String source = Files.readString( - Path.of(System.getProperty("iris.nmsBindingSource"))); + Path.of(System.getProperty("iris.nmsBindingSource"))).replace("\r\n", "\n"); String advice = section( source, "private static class ServerLevelAdvice", diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingShutdownBoundaryContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingShutdownBoundaryContractTest.java index 7dd77b89d..7af5cd242 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingShutdownBoundaryContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingShutdownBoundaryContractTest.java @@ -10,7 +10,7 @@ import static org.junit.Assert.assertTrue; public class NMSBindingShutdownBoundaryContractTest { @Test public void shutdownBoundaryUsesPaperFullyShutdownStateAndServerThread() throws Exception { - String source = Files.readString(Path.of(System.getProperty("iris.nmsBindingSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsBindingSource"))).replace("\r\n", "\n"); String boundary = section(source, "public boolean awaitServerShutdownBoundary", "public KMap> getBlockProperties"); assertTrue(boundary.contains("ServerShutdownBoundary.await(")); diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingStructureFailureContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingStructureFailureContractTest.java index 50583cd95..a1e62be35 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingStructureFailureContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingStructureFailureContractTest.java @@ -14,7 +14,7 @@ public class NMSBindingStructureFailureContractTest { @Test public void structureRegistryHooksThrowInsteadOfReturningEmptyOnFailure() throws IOException { Path chunkGeneratorSource = Path.of(System.getProperty("iris.nmsChunkGeneratorSource")); - String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")); + String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")).replace("\r\n", "\n"); List methodNames = List.of( "getStructureKeys", "getStructureSetKeys", diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingTileDeserializeContractTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingTileDeserializeContractTest.java index 5ca0418e6..e54707044 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingTileDeserializeContractTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/core/nms/v26_2_R1/NMSBindingTileDeserializeContractTest.java @@ -12,7 +12,7 @@ public class NMSBindingTileDeserializeContractTest { @Test public void ownedRegionTileDataMergesBeforeScheduledFallback() throws IOException { Path chunkGeneratorSource = Path.of(System.getProperty("iris.nmsChunkGeneratorSource")); - String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")); + String source = Files.readString(chunkGeneratorSource.resolveSibling("NMSBinding.java")).replace("\r\n", "\n"); int methodStart = source.indexOf("public void deserializeTile("); int methodEnd = source.indexOf("\n private void merge(", methodStart); String method = source.substring(methodStart, methodEnd); diff --git a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/nativegen/NativeStructurePostProcessorEncaseTest.java b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/nativegen/NativeStructurePostProcessorEncaseTest.java index c4416e5fc..4b7c4ccc1 100644 --- a/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/nativegen/NativeStructurePostProcessorEncaseTest.java +++ b/adapters/bukkit/nms/v26_2_R1/src/test/java/art/arcane/iris/nativegen/NativeStructurePostProcessorEncaseTest.java @@ -223,7 +223,7 @@ public class NativeStructurePostProcessorEncaseTest { @Test public void encaseFillRunsBeforeNativePlacement() throws IOException { - String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))); + String source = Files.readString(Path.of(System.getProperty("iris.nmsChunkGeneratorSource"))).replace("\r\n", "\n"); int prepareTerrain = source.indexOf("NativeStructurePostProcessor.prepareTerrain("); int placementLoop = source.indexOf("for (NativePlacementGroup group : placementGroups)", prepareTerrain); int placement = source.indexOf("placeVanillaStructure(world, structureManager, random", placementLoop); diff --git a/adapters/bukkit/plugin/src/main/java/art/arcane/iris/core/PendingWorldDeleteQueue.java b/adapters/bukkit/plugin/src/main/java/art/arcane/iris/core/PendingWorldDeleteQueue.java index 8c5dac853..8bab4dd8b 100644 --- a/adapters/bukkit/plugin/src/main/java/art/arcane/iris/core/PendingWorldDeleteQueue.java +++ b/adapters/bukkit/plugin/src/main/java/art/arcane/iris/core/PendingWorldDeleteQueue.java @@ -316,6 +316,12 @@ public final class PendingWorldDeleteQueue implements WorldDeletionQueue { } private static void forceDirectory(Path directory) throws IOException { + // A directory can only be opened and fsynced on a POSIX filesystem; Windows rejects the + // open outright. Matches DirectoryDurability and DatapackIngestService, which already + // skip the barrier there. + if (!Files.getFileStore(directory).supportsFileAttributeView("posix")) { + return; + } try (FileChannel channel = FileChannel.open(directory, StandardOpenOption.READ)) { channel.force(true); } diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/IrisDiagnosticLogLevelTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/IrisDiagnosticLogLevelTest.java index 362297596..bcb0649c4 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/IrisDiagnosticLogLevelTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/IrisDiagnosticLogLevelTest.java @@ -47,7 +47,7 @@ public class IrisDiagnosticLogLevelTest { */ @Test public void adapterSideWarningsCarryTheSameSeverityAsCoreWarnings() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")).replace("\r\n", "\n"); String warn = method(source, "public static void warn(String format, Object... objs)"); assertTrue(warn, warn.contains("diagnostic(Level.WARNING")); @@ -60,7 +60,7 @@ public class IrisDiagnosticLogLevelTest { @Test public void theCoreLogBridgeRoutesDiagnosticsToThePluginLogger() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")).replace("\r\n", "\n"); String bridge = method(source, "private static void bridgeLog(LogLevel level, String message)"); assertTrue(bridge, bridge.contains("diagnosticLevel(target)")); diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/IrisWorldGeneratorResolverTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/IrisWorldGeneratorResolverTest.java index 17d16ff52..71818d532 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/IrisWorldGeneratorResolverTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/IrisWorldGeneratorResolverTest.java @@ -80,7 +80,7 @@ public class IrisWorldGeneratorResolverTest { @Test public void startupValidationPublishesFingerprintBoundExactRootResults() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/IrisWorldGeneratorResolver.java")); + "src/main/java/art/arcane/iris/core/IrisWorldGeneratorResolver.java")).replace("\r\n", "\n"); int validateAll = source.indexOf("public void validateAllPacks()"); int snapshot = source.indexOf("ServerConfigurator.computePackContentSnapshot(packsRoot)", validateAll); int perPackFingerprint = source.indexOf("contentSnapshot.packContents()", snapshot); @@ -191,7 +191,7 @@ public class IrisWorldGeneratorResolverTest { @Test public void configuredWorldResolutionUsesOnlyFrozenWorldLocalSnapshot() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/IrisWorldGeneratorResolver.java")); + "src/main/java/art/arcane/iris/core/IrisWorldGeneratorResolver.java")).replace("\r\n", "\n"); int resolverStart = source.indexOf("private ChunkGenerator resolveFrozenWorldGenerator("); int resolverEnd = source.indexOf("private record FreshValidation", resolverStart); String resolver = source.substring(resolverStart, resolverEnd); @@ -227,7 +227,7 @@ public class IrisWorldGeneratorResolverTest { @Test public void ownedWorldSnapshotFailureStopsStartupAndRethrows() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/IrisWorldGeneratorResolver.java")); + "src/main/java/art/arcane/iris/core/IrisWorldGeneratorResolver.java")).replace("\r\n", "\n"); int resolverStart = source.indexOf("public ChunkGenerator resolveDefaultWorldGenerator("); int resolverEnd = source.indexOf("private ChunkGenerator resolveFrozenWorldGenerator(", resolverStart); String resolver = source.substring(resolverStart, resolverEnd); diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/PendingWorldReplacementThreadAffinityTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/PendingWorldReplacementThreadAffinityTest.java index 587d1c111..3300dbcb7 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/PendingWorldReplacementThreadAffinityTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/PendingWorldReplacementThreadAffinityTest.java @@ -135,8 +135,8 @@ public class PendingWorldReplacementThreadAffinityTest { @Test public void bukkitAccessIsConfinedToTheGlobalCaptureStage() throws Exception { String managerSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")); - String irisSource = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")); + "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")).replace("\r\n", "\n"); + String irisSource = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")).replace("\r\n", "\n"); String startup = method(managerSource, "public void verifyLoadedPublishedWorlds()"); String worldLoad = method(managerSource, "public void onWorldLoad(WorldLoadEvent event)"); String discovery = method(managerSource, "private void discoverLoadedPublishedWorlds()"); @@ -167,10 +167,10 @@ public class PendingWorldReplacementThreadAffinityTest { @Test public void paperLoginHookIsIsolatedFromAlwaysLoadedSpigotClasses() throws Exception { String managerSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")); - String irisSource = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")); + "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")).replace("\r\n", "\n"); + String irisSource = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")).replace("\r\n", "\n"); String listenerSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/PaperWorldReplacementEntryListener.java")); + "src/main/java/art/arcane/iris/core/PaperWorldReplacementEntryListener.java")).replace("\r\n", "\n"); String registration = method(managerSource, "public void registerPlatformEntryListener()"); assertFalse(managerSource.contains("import io.papermc.paper.event.player.AsyncPlayerSpawnLocationEvent")); @@ -186,9 +186,9 @@ public class PendingWorldReplacementThreadAffinityTest { @Test public void redirectedPlayerReceiptSurvivesUntilTheMaterializedPositionIsSaved() throws Exception { String managerSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")); + "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")).replace("\r\n", "\n"); String listenerSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/PaperWorldReplacementEntryListener.java")); + "src/main/java/art/arcane/iris/core/PaperWorldReplacementEntryListener.java")).replace("\r\n", "\n"); String preparation = method( managerSource, "ReplacementEntryRedirect prepareReplacementEntry(UUID playerId, Location savedLocation, boolean newPlayer)" @@ -215,9 +215,9 @@ public class PendingWorldReplacementThreadAffinityTest { @Test public void replacementSpawnIsPersistedBeforeFinalMarkerRetirement() throws Exception { String managerSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")); + "src/main/java/art/arcane/iris/core/PendingWorldReplacementManager.java")).replace("\r\n", "\n"); String listenerSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/PaperWorldReplacementEntryListener.java")); + "src/main/java/art/arcane/iris/core/PaperWorldReplacementEntryListener.java")).replace("\r\n", "\n"); String preparation = method(managerSource, "private void prepareOverworldEntry(World world)"); String persistence = method(managerSource, "private CompletableFuture persistOverworldSpawn(Location safeEntry)"); String retirement = method( diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisCreateOverwriteContractTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisCreateOverwriteContractTest.java index da86065d6..70fcb612b 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisCreateOverwriteContractTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisCreateOverwriteContractTest.java @@ -78,7 +78,7 @@ public class CommandIrisCreateOverwriteContractTest { public void createAndReplaceUseLocalizedStyledMissingDimensionFeedback() throws Exception { String source = Files.readString(Path.of( "src/main/java/art/arcane/iris/core/commands/CommandIris.java" - )); + )).replace("\r\n", "\n"); assertEquals(2, occurrences(source, "COMMAND_IRIS_DIMENSION_NOT_FOUND")); assertEquals(2, occurrences(source, "COMMAND_IRIS_INSTALL_PACK_AND_RESTART")); diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisDownloadContractTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisDownloadContractTest.java index f98f8abd4..7de9dff59 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisDownloadContractTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandIrisDownloadContractTest.java @@ -51,7 +51,7 @@ public class CommandIrisDownloadContractTest { public void commandDelegatesAcceptedDownloadsWithoutRawPreamble() throws Exception { String source = Files.readString(Path.of( "src/main/java/art/arcane/iris/core/commands/CommandIris.java" - )); + )).replace("\r\n", "\n"); String download = method(source, "public void download("); assertTrue(download.contains("downloadBuiltIn(sender(), builtInPack)")); diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandJigsawContractTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandJigsawContractTest.java index d464d170a..36965b6bc 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandJigsawContractTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/commands/CommandJigsawContractTest.java @@ -118,7 +118,7 @@ public class CommandJigsawContractTest { @Test public void committedActivationStartsInitialEvaluationBeforePlayerBinding() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/commands/CommandJigsaw.java")); + "src/main/java/art/arcane/iris/core/commands/CommandJigsaw.java")).replace("\r\n", "\n"); int commit = source.indexOf("JigsawStudioActivation.commit(staged)"); int evaluation = source.indexOf( "studioService.activationCommitted(world, request.requestId())", @@ -361,7 +361,7 @@ public class CommandJigsawContractTest { @Test public void pieceCreateUsesResolvedWorkcellCapacityInsteadOfLayoutDefault() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/commands/CommandJigsaw.java")); + "src/main/java/art/arcane/iris/core/commands/CommandJigsaw.java")).replace("\r\n", "\n"); int pieceCommands = source.indexOf("public static class CommandJigsawPiece"); int create = source.indexOf("public void create(", pieceCommands); int add = source.indexOf("public void add(", create); @@ -513,7 +513,7 @@ public class CommandJigsawContractTest { @Test public void exportSourceAcquiresStudioLeaseBeforeStaticLeaseAndReleasesBothPaths() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/commands/CommandJigsaw.java")); + "src/main/java/art/arcane/iris/core/commands/CommandJigsaw.java")).replace("\r\n", "\n"); int serviceLease = source.indexOf("studioService.tryBeginExport(requestId, playerId)"); int staticLease = source.indexOf("beginExport(playerId, destination)", serviceLease); int dispatch = source.indexOf("J.a(() -> runExport(operation))", staticLease); diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiExpansionTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiExpansionTest.java index 1a7514328..5a8269cc3 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiExpansionTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiExpansionTest.java @@ -215,7 +215,7 @@ public class IrisPapiExpansionTest { @Test public void thePlaceholderPathNeverTouchesTheEngineOrAPluginStatic() throws Exception { for (String file : List.of("IrisPapiExpansion.java", "IrisPapiState.java", "IrisPapiWorldView.java")) { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/link/" + file)); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/link/" + file)).replace("\r\n", "\n"); assertFalse(file + " must not import the engine", source.contains("art.arcane.iris.engine.")); assertFalse(file + " must not reach into the toolbelt", source.contains("IrisToolbelt")); diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiLifecycleTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiLifecycleTest.java index 415f160bb..193e614fa 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiLifecycleTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/link/IrisPapiLifecycleTest.java @@ -14,7 +14,9 @@ public class IrisPapiLifecycleTest { private static final String TEARDOWN = "private void teardownPapi() {"; private static String source() throws Exception { - return Files.readString(PLUGIN_SOURCE); + // The assertions below match against literals written with \n, so a CRLF checkout has to + // be folded first or every multi-line expectation misses. + return Files.readString(PLUGIN_SOURCE).replace("\r\n", "\n"); } private static String body(String declaration) throws Exception { @@ -127,6 +129,6 @@ public class IrisPapiLifecycleTest { private static String installerSource() throws Exception { return java.nio.file.Files.readString(java.nio.file.Path.of( - "src/main/java/art/arcane/iris/core/link/IrisPapiInstaller.java")); + "src/main/java/art/arcane/iris/core/link/IrisPapiInstaller.java")).replace("\r\n", "\n"); } } diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/runtime/StudioPlayerModeContractTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/runtime/StudioPlayerModeContractTest.java index 6e316e110..078fd6ed2 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/runtime/StudioPlayerModeContractTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/core/runtime/StudioPlayerModeContractTest.java @@ -12,9 +12,9 @@ import static org.junit.Assert.assertTrue; public class StudioPlayerModeContractTest { @Test public void studioEntryKeepsPlayersEligibleForNaturalSpawning() throws IOException { - String plugin = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")); + String plugin = Files.readString(Path.of("src/main/java/art/arcane/iris/Iris.java")).replace("\r\n", "\n"); String commands = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/commands/CommandStudio.java")); + "src/main/java/art/arcane/iris/core/commands/CommandStudio.java")).replace("\r\n", "\n"); assertFalse(plugin.contains("GameMode.SPECTATOR")); assertFalse(commands.contains("GameMode.SPECTATOR")); diff --git a/build.gradle b/build.gradle index 53960fe4a..9e2e3faed 100644 --- a/build.gradle +++ b/build.gradle @@ -176,6 +176,42 @@ tasks.register('iris', Copy) { } } +tasks.register('buildSwiftSwamp') { + group = 'iris' + description = 'Builds every platform jar and drops them in the local BUILDS output directory.' + outputs.upToDateWhen { false } + dependsOn('iris', 'verifyModdedArtifacts') + doLast { + File swiftSwampOut = file('C://VolmitSoftware/BUILDS') + copy { + from(layout.buildDirectory.file("consumer/${bukkitArtifactName}")) + into(swiftSwampOut) + rename { String ignored -> 'Iris.jar' } + } + copy { + from(layout.projectDirectory.file("adapters/fabric/build/libs/${fabricArtifactName}")) + into(swiftSwampOut) + rename { String ignored -> 'Iris-Fabric.jar' } + } + copy { + from(layout.projectDirectory.file("adapters/forge/build/libs/${forgeArtifactName}")) + into(swiftSwampOut) + rename { String ignored -> 'Iris-Forge.jar' } + } + copy { + from(layout.projectDirectory.file("adapters/neoforge/build/libs/${neoForgeArtifactName}")) + into(swiftSwampOut) + rename { String ignored -> 'Iris-Neoforge.jar' } + } + println('') + println('=== Iris buildSwiftSwamp -> ' + swiftSwampOut + ' ===') + ['Iris.jar', 'Iris-Fabric.jar', 'Iris-Forge.jar', 'Iris-Neoforge.jar'].each { String jar -> + File produced = new File(swiftSwampOut, jar) + println(String.format(' %-24s %8d KB', jar, (long) (produced.length() / 1024))) + } + } +} + tasks.register('buildBukkit', Copy) { group = 'iris' dependsOn('jar') @@ -668,6 +704,7 @@ allprojects { } repositories { + mavenLocal() mavenCentral() maven { url = uri('https://repo.papermc.io/repository/maven-public/') } maven { url = uri('https://repo.codemc.org/repository/maven-public/') } diff --git a/core/src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java b/core/src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java index 21c7c3d66..e785084d8 100644 --- a/core/src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java +++ b/core/src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java @@ -2152,7 +2152,12 @@ public final class DatapackIngestService { if (fileKey != null) { return "key:" + fileKey; } - return ""; + // Windows exposes no inode-equivalent for a directory, and returning nothing here fails + // the identity gate closed, which disables legacy staging replacement on that platform + // outright. Creation time is the one stable discriminator the filesystem still offers: a + // directory swapped in at the same path brings its own, so a swap is still caught. It is + // a weaker guarantee than an inode, so it is only ever the fallback. + return "created:" + attributes.creationTime(); } private static boolean pathExists(Path path, String purpose) throws IOException { diff --git a/core/src/main/java/art/arcane/iris/core/service/JigsawStudioHistoryStore.java b/core/src/main/java/art/arcane/iris/core/service/JigsawStudioHistoryStore.java index ba5b4d17d..14a05b3be 100644 --- a/core/src/main/java/art/arcane/iris/core/service/JigsawStudioHistoryStore.java +++ b/core/src/main/java/art/arcane/iris/core/service/JigsawStudioHistoryStore.java @@ -374,6 +374,12 @@ final class JigsawStudioHistoryStore { } private static void forceDirectory(Path directory) throws IOException { + // A directory can only be opened and fsynced on a POSIX filesystem; Windows rejects the + // open outright. Matches DirectoryDurability and DatapackIngestService, which already + // skip the barrier there. + if (!Files.getFileStore(directory).supportsFileAttributeView("posix")) { + return; + } try (FileChannel channel = FileChannel.open(directory, StandardOpenOption.READ)) { channel.force(true); } diff --git a/core/src/test/java/art/arcane/iris/core/DiagnosticSeverityPolicyTest.java b/core/src/test/java/art/arcane/iris/core/DiagnosticSeverityPolicyTest.java index 03913867f..520073d19 100644 --- a/core/src/test/java/art/arcane/iris/core/DiagnosticSeverityPolicyTest.java +++ b/core/src/test/java/art/arcane/iris/core/DiagnosticSeverityPolicyTest.java @@ -145,6 +145,6 @@ public class DiagnosticSeverityPolicyTest { } private static String read(String relativePath) throws IOException { - return Files.readString(Path.of("src/main/java/art/arcane/iris").resolve(relativePath)); + return Files.readString(Path.of("src/main/java/art/arcane/iris").resolve(relativePath)).replace("\r\n", "\n"); } } diff --git a/core/src/test/java/art/arcane/iris/core/IrisWorldsTest.java b/core/src/test/java/art/arcane/iris/core/IrisWorldsTest.java index 92d82fc3d..a1ea35ebf 100644 --- a/core/src/test/java/art/arcane/iris/core/IrisWorldsTest.java +++ b/core/src/test/java/art/arcane/iris/core/IrisWorldsTest.java @@ -97,7 +97,7 @@ public class IrisWorldsTest { */ @Test public void oneUnusableWorldIsExcludedInsteadOfFailingTheWholeRegistry() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/IrisWorlds.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/IrisWorlds.java")).replace("\r\n", "\n"); int accessor = source.indexOf("public static IrisWorlds get()"); int accessorEnd = source.indexOf("public synchronized void put(", accessor); diff --git a/core/src/test/java/art/arcane/iris/core/ProgressBossBarToggleTest.java b/core/src/test/java/art/arcane/iris/core/ProgressBossBarToggleTest.java index 795b11a6d..b487c5f71 100644 --- a/core/src/test/java/art/arcane/iris/core/ProgressBossBarToggleTest.java +++ b/core/src/test/java/art/arcane/iris/core/ProgressBossBarToggleTest.java @@ -70,7 +70,7 @@ public class ProgressBossBarToggleTest { } private String source(String relativePath) throws Exception { - return Files.readString(Path.of("src/main/java/art/arcane/iris").resolve(relativePath)); + return Files.readString(Path.of("src/main/java/art/arcane/iris").resolve(relativePath)).replace("\r\n", "\n"); } private void withProgressBossBar(boolean enabled, Runnable body) { diff --git a/core/src/test/java/art/arcane/iris/core/ServerConfiguratorDatapackFingerprintTest.java b/core/src/test/java/art/arcane/iris/core/ServerConfiguratorDatapackFingerprintTest.java index 4bc82f45b..316bfad87 100644 --- a/core/src/test/java/art/arcane/iris/core/ServerConfiguratorDatapackFingerprintTest.java +++ b/core/src/test/java/art/arcane/iris/core/ServerConfiguratorDatapackFingerprintTest.java @@ -387,7 +387,7 @@ public class ServerConfiguratorDatapackFingerprintTest { @Test public void recoveryRunsBeforeRestoredFingerprintReuseHashFallbackAndCompilation() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/ServerConfigurator.java")); + "src/main/java/art/arcane/iris/core/ServerConfigurator.java")).replace("\r\n", "\n"); int installIfChanged = source.indexOf("installDataPacksIfChanged(boolean fullInstall)"); int recovery = source.indexOf("DatapackIngestService.reapplyFromStaging", installIfChanged); int restored = source.indexOf("restoredCompilerInputFingerprint()", recovery); @@ -407,7 +407,7 @@ public class ServerConfiguratorDatapackFingerprintTest { @Test public void studioTimingSeparatesRecoveryFingerprintCompilationAndTotal() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/ServerConfigurator.java")); + "src/main/java/art/arcane/iris/core/ServerConfigurator.java")).replace("\r\n", "\n"); int timedInstall = source.indexOf("BiConsumer timingConsumer"); int recovery = source.indexOf("\"datapack_external_recovery\"", timedInstall); int fingerprint = source.indexOf("\"datapack_compiler_input_fingerprint\"", recovery); diff --git a/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestRuntimeInvalidationTest.java b/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestRuntimeInvalidationTest.java index f5f199c73..f5f78a13d 100644 --- a/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestRuntimeInvalidationTest.java +++ b/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestRuntimeInvalidationTest.java @@ -11,7 +11,7 @@ public class DatapackIngestRuntimeInvalidationTest { @Test public void everyPublicMutationInvalidatesLoadedRuntimeBeforeLocking() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")); + "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")).replace("\r\n", "\n"); assertInvalidatesBeforeLock(source, "public static Report ingest("); assertInvalidatesBeforeLock(source, "public static ReapplyOutcome reapplyFromStaging("); @@ -21,7 +21,7 @@ public class DatapackIngestRuntimeInvalidationTest { @Test public void noChangeChecksRestoreWhileChangedIngestRemainsRestartBound() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")); + "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")).replace("\r\n", "\n"); int ingest = source.indexOf("public static Report ingest("); int unlock = source.indexOf("TRANSACTION_LOCK.unlock();", ingest); int restore = source.indexOf( diff --git a/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestServiceTest.java b/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestServiceTest.java index a76620c25..c9056b181 100644 --- a/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestServiceTest.java +++ b/core/src/test/java/art/arcane/iris/core/datapack/DatapackIngestServiceTest.java @@ -249,7 +249,7 @@ public class DatapackIngestServiceTest { @Test public void startupChecksCheapCacheContextBeforeHashingManagedDatapacks() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")); + "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")).replace("\r\n", "\n"); int validation = source.indexOf("public static StartupValidationOutcome validateOnStartup()"); int cacheRead = source.indexOf("readStartupValidationCache", validation); int contextCheck = source.indexOf("startupValidationContextMatches(", cacheRead); @@ -266,7 +266,7 @@ public class DatapackIngestServiceTest { @Test public void unchangedPostStartupMaintenanceReturnsBeforeFingerprinting() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")); + "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")).replace("\r\n", "\n"); int refresh = source.indexOf( "refreshStartupValidationAfterMaintenance(boolean maintenanceChanged)"); int unchangedGuard = source.indexOf("if (!maintenanceChanged)", refresh); @@ -806,7 +806,7 @@ public class DatapackIngestServiceTest { @Test public void directoryHashRestatsAttributesAndVolumeBeforeOpeningEachFile() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")); + "src/main/java/art/arcane/iris/core/datapack/DatapackIngestService.java")).replace("\r\n", "\n"); int method = source.indexOf("private static String directoryHash(File root)"); int entries = source.indexOf("List entries = new ArrayList<>()", method); int loop = source.indexOf("for (Path entry : entries)", entries); diff --git a/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java b/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java index 8c6c4d1e5..b76a79ab4 100644 --- a/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java +++ b/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java @@ -54,7 +54,8 @@ public class MissingWorldStorageLogTest { assertEquals(2, emitted.size()); assertTrue(emitted.get(0), emitted.get(0).contains("world_iris_gone")); - assertTrue(emitted.get(0), emitted.get(0).contains("/srv/world/dimensions/iris/gone")); + assertTrue(emitted.get(0), + emitted.get(0).contains(Path.of("/srv/world/dimensions/iris/gone").toString())); } @Test @@ -80,7 +81,8 @@ public class MissingWorldStorageLogTest { assertTrue(MissingWorldStorageLog.hasWarned("world_iris_husk")); assertEquals(2, emitted.size()); - assertTrue(emitted.get(0), emitted.get(0).contains("/srv/world/dimensions/iris/husk")); + assertTrue(emitted.get(0), + emitted.get(0).contains(Path.of("/srv/world/dimensions/iris/husk").toString())); assertTrue(emitted.get(1), emitted.get(1).contains("world_iris_husk")); assertFalse("an empty folder is deleted, not restored", emitted.get(1).contains("Restore")); } diff --git a/core/src/test/java/art/arcane/iris/core/link/MultiverseCoreLinkTest.java b/core/src/test/java/art/arcane/iris/core/link/MultiverseCoreLinkTest.java index d0dedbe62..83e9aa9d6 100644 --- a/core/src/test/java/art/arcane/iris/core/link/MultiverseCoreLinkTest.java +++ b/core/src/test/java/art/arcane/iris/core/link/MultiverseCoreLinkTest.java @@ -55,7 +55,7 @@ public class MultiverseCoreLinkTest { @Test public void registrationDoesNotRewriteTheRecordedMultiverseName() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/link/MultiverseCoreLink.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/link/MultiverseCoreLink.java")).replace("\r\n", "\n"); assertFalse("worlds are created under the startup name, so the recorded name needs no correction", source.contains("setLegacyWorldName")); diff --git a/core/src/test/java/art/arcane/iris/core/pack/PackExportClosureTest.java b/core/src/test/java/art/arcane/iris/core/pack/PackExportClosureTest.java index b416edf31..031795e0c 100644 --- a/core/src/test/java/art/arcane/iris/core/pack/PackExportClosureTest.java +++ b/core/src/test/java/art/arcane/iris/core/pack/PackExportClosureTest.java @@ -56,7 +56,7 @@ public class PackExportClosureTest { @Test public void bothPackagersExportSpawnersMarkersAndTheFullEntityGraph() throws Exception { String bukkit = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/project/IrisPackageCompiler.java")); + "src/main/java/art/arcane/iris/core/project/IrisPackageCompiler.java")).replace("\r\n", "\n"); assertTrue("Bukkit packager must write spawners/", bukkit.contains("\"spawners/\"")); assertTrue("Bukkit packager must write markers/", bukkit.contains("\"markers/\"")); assertTrue("Bukkit packager must export region objects alongside biome objects", @@ -64,7 +64,7 @@ public class PackExportClosureTest { assertTrue("Bukkit packager must export entity loot tables", bukkit.contains("getLoot().getTables()")); String modded = Files.readString(Path.of( - "../adapters/modded-common/src/main/java/art/arcane/iris/modded/command/ModdedStudioCommands.java")); + "../adapters/modded-common/src/main/java/art/arcane/iris/modded/command/ModdedStudioCommands.java")).replace("\r\n", "\n"); assertTrue("modded packager must write spawners/", modded.contains("\"spawners\"")); assertTrue("modded packager must write markers/", modded.contains("\"markers\"")); assertTrue("modded packager must include initial spawns", modded.contains("getInitialSpawns")); diff --git a/core/src/test/java/art/arcane/iris/core/runtime/StudioEntitySpawningTest.java b/core/src/test/java/art/arcane/iris/core/runtime/StudioEntitySpawningTest.java index 3d2a6de62..5c26b11cc 100644 --- a/core/src/test/java/art/arcane/iris/core/runtime/StudioEntitySpawningTest.java +++ b/core/src/test/java/art/arcane/iris/core/runtime/StudioEntitySpawningTest.java @@ -21,7 +21,7 @@ public class StudioEntitySpawningTest { @Test public void studioWorldRulesEnableVanillaMobSpawning() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/WorldRuntimeControlService.java")); + "src/main/java/art/arcane/iris/core/runtime/WorldRuntimeControlService.java")).replace("\r\n", "\n"); int helperStart = source.indexOf("static void enableStudioEntitySpawning"); int helperEnd = source.indexOf("public boolean applyNoonTimeLock", helperStart); String helper = source.substring(helperStart, helperEnd); @@ -38,7 +38,7 @@ public class StudioEntitySpawningTest { @Test public void generalStudioUsesAPlayerModeEligibleForNaturalSpawning() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/project/IrisProject.java")); + "src/main/java/art/arcane/iris/core/project/IrisProject.java")).replace("\r\n", "\n"); assertFalse(source.contains("GameMode.SPECTATOR")); assertTrue(source.contains("GameMode.CREATIVE")); diff --git a/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorOpenKindTest.java b/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorOpenKindTest.java index 808841bf3..07f5f6660 100644 --- a/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorOpenKindTest.java +++ b/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorOpenKindTest.java @@ -65,7 +65,7 @@ public class StudioOpenCoordinatorOpenKindTest { @Test public void studioTimingSeparatesOrderedLifecyclePhases() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")); + "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")).replace("\r\n", "\n"); int previous = -1; for (String phase : List.of( "resolve_dimension_and_cleanup", @@ -87,7 +87,7 @@ public class StudioOpenCoordinatorOpenKindTest { @Test public void structureStateActivatesAfterStandardTeleportBeforeFinalization() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")); + "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")).replace("\r\n", "\n"); int entryReady = source.indexOf( "entryLoadFuture.get(STUDIO_ENTRY_LOAD_TIMEOUT_SECONDS, TimeUnit.SECONDS)"); int teleport = source.indexOf( @@ -121,7 +121,7 @@ public class StudioOpenCoordinatorOpenKindTest { @Test public void failedOpenMarshalsRetainedStateAbandonmentToTheServerScheduler() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")); + "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")).replace("\r\n", "\n"); int methodStart = source.indexOf( "private void abandonStudioEntryBootstrap(World world, Throwable failure)"); int methodEnd = source.indexOf("private void deferFailedOpenCleanup", methodStart); @@ -135,7 +135,7 @@ public class StudioOpenCoordinatorOpenKindTest { @Test public void queuedRestartDefersFailedOpenCleanupWithoutAcquiringALiveCloseLease() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")); + "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")).replace("\r\n", "\n"); int openCatch = source.indexOf("} catch (Throwable e) {"); int restartCheck = source.indexOf( ".active(LifecycleOperationCoordinator.Domain.SERVER_LIFECYCLE)", @@ -160,7 +160,7 @@ public class StudioOpenCoordinatorOpenKindTest { @Test public void openFinalizerReturnsToTheServerThreadBeforeCompletion() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")); + "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")).replace("\r\n", "\n"); int finalizerCall = source.indexOf("runOpenFinalizer(request.onDone(), world);"); int futureCompletion = source.indexOf( "future.complete(new StudioOpenResult(world, safeEntry))", finalizerCall); diff --git a/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorSpawnStuckRegressionTest.java b/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorSpawnStuckRegressionTest.java index 893515aa9..8258df4d9 100644 --- a/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorSpawnStuckRegressionTest.java +++ b/core/src/test/java/art/arcane/iris/core/runtime/StudioOpenCoordinatorSpawnStuckRegressionTest.java @@ -34,7 +34,7 @@ public class StudioOpenCoordinatorSpawnStuckRegressionTest { @Test public void paperEntryChunkLoadIsAsyncBeforeTheRetentionTicket() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")); + "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")).replace("\r\n", "\n"); int asyncLoad = source.indexOf("requested = WorldRuntimeControlService.get().requestChunkAsync("); int urgentFlag = source.indexOf("true);", asyncLoad); int retentionTicket = source.indexOf("world.addPluginChunkTicket", asyncLoad); @@ -47,7 +47,7 @@ public class StudioOpenCoordinatorSpawnStuckRegressionTest { @Test public void foliaRetainsItsNonBlockingTicketBootstrapPath() throws Exception { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")); + "src/main/java/art/arcane/iris/core/runtime/StudioOpenCoordinator.java")).replace("\r\n", "\n"); int foliaBranch = source.indexOf("if (!J.isFolia())"); int retentionSchedule = source.indexOf( "return scheduleEntryChunkRetention(world, chunkX, chunkZ);", diff --git a/core/src/test/java/art/arcane/iris/core/service/JigsawStudioLifecycleTest.java b/core/src/test/java/art/arcane/iris/core/service/JigsawStudioLifecycleTest.java index 387562b55..65bf2e3d6 100644 --- a/core/src/test/java/art/arcane/iris/core/service/JigsawStudioLifecycleTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/JigsawStudioLifecycleTest.java @@ -87,7 +87,7 @@ public class JigsawStudioLifecycleTest { @Test public void committedStudioActivationDisablesNaturalMobSpawning() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/service/JigsawStudioService.java")); + "src/main/java/art/arcane/iris/core/service/JigsawStudioService.java")).replace("\r\n", "\n"); int registerStart = source.indexOf("public void register("); int commitStart = source.indexOf("public void activationCommitted(", registerStart); int commitEnd = source.indexOf("public void markChunkGenerated(", commitStart); diff --git a/core/src/test/java/art/arcane/iris/core/service/PackDownloadProgressReporterTest.java b/core/src/test/java/art/arcane/iris/core/service/PackDownloadProgressReporterTest.java index d6bca1820..2cf34baec 100644 --- a/core/src/test/java/art/arcane/iris/core/service/PackDownloadProgressReporterTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/PackDownloadProgressReporterTest.java @@ -186,7 +186,7 @@ public class PackDownloadProgressReporterTest { public void playerHudAlwaysShowsLoaderLaneAndActionBarWithCleanup() throws Exception { String source = Files.readString(Path.of( "src/main/java/art/arcane/iris/core/service/PackDownloadProgressReporter.java" - )); + )).replace("\r\n", "\n"); assertFalse(source.contains("HudSlotRequest")); assertFalse(source.contains("HudSurface")); diff --git a/core/src/test/java/art/arcane/iris/core/service/StudioSVCPackDownloadContractTest.java b/core/src/test/java/art/arcane/iris/core/service/StudioSVCPackDownloadContractTest.java index a9e51292d..bc2cc0b88 100644 --- a/core/src/test/java/art/arcane/iris/core/service/StudioSVCPackDownloadContractTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/StudioSVCPackDownloadContractTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.assertTrue; public class StudioSVCPackDownloadContractTest { @Test public void downloadsUseReporterCompletionWithoutMutatingLiveDatapacks() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")).replace("\r\n", "\n"); assertTrue(source.contains("reporter.succeed(result);")); assertFalse(method(source, "public void downloadBuiltIn(VolmitSender sender, String key)") @@ -26,7 +26,7 @@ public class StudioSVCPackDownloadContractTest { @Test public void downloadLeaseIsAcquiredBeforeUnconditionalIoDispatch() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")).replace("\r\n", "\n"); int mutationStart = source.indexOf("private void runPackMutation("); int mutationEnd = source.indexOf("private void executePackMutation(", mutationStart); String runPackMutation = source.substring(mutationStart, mutationEnd); @@ -47,7 +47,7 @@ public class StudioSVCPackDownloadContractTest { @Test public void acceptedDownloadsRouteFeedbackProgressAndTerminalStatesThroughReporter() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")).replace("\r\n", "\n"); String builtIn = method(source, "public void downloadBuiltIn(VolmitSender sender, String key)"); String remote = method(source, "public void downloadUrl(VolmitSender sender, String url)"); String execute = method(source, "private void executePackMutation("); @@ -64,7 +64,7 @@ public class StudioSVCPackDownloadContractTest { @Test public void shutdownClosesAdmissionAndDrainsTrackedDownloadBeforeServiceTeardown() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/service/StudioSVC.java")).replace("\r\n", "\n"); String onDisable = method(source, "public void onDisable()"); String quiesce = method(source, "public void quiesceDownloadsForShutdown()"); diff --git a/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackFeedbackContractTest.java b/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackFeedbackContractTest.java index e59acdfbc..9a769b894 100644 --- a/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackFeedbackContractTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackFeedbackContractTest.java @@ -13,7 +13,7 @@ public class StudioSVCWorldPackFeedbackContractTest { public void persistentPackCopyUsesLocalizedStyledOperatorFeedback() throws Exception { String source = Files.readString(Path.of( "src/main/java/art/arcane/iris/core/service/StudioSVC.java" - )); + )).replace("\r\n", "\n"); assertEquals(1, occurrences(source, "STUDIO_S_V_C_PACK_COPY_REQUIRES_ASYNC_THREAD")); assertEquals(2, occurrences(source, "STUDIO_S_V_C_PACK_INSTALL_FAILED")); diff --git a/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java b/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java index 2f51f97f7..689bc1d37 100644 --- a/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java @@ -163,7 +163,7 @@ public class StudioSVCWorldPackPublishTest { @Test public void replaceExistingRejectsSymbolicTargetBeforePublication() throws Exception { String sourceCode = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/service/StudioSVC.java")); + "src/main/java/art/arcane/iris/core/service/StudioSVC.java")).replace("\r\n", "\n"); int install = sourceCode.indexOf("private IrisDimension installIntoDirectory("); int initialTargetSafety = sourceCode.indexOf( "requireSafePublicationTarget(target, replaceExisting)", @@ -296,7 +296,7 @@ public class StudioSVCWorldPackPublishTest { @Test public void replacementKeepsTargetUnauthorizedThroughPublishedFingerprintWindow() throws Exception { String sourceCode = Files.readString(Path.of( - "src/main/java/art/arcane/iris/core/service/StudioSVC.java")); + "src/main/java/art/arcane/iris/core/service/StudioSVC.java")).replace("\r\n", "\n"); int install = sourceCode.indexOf("private IrisDimension installIntoDirectory("); int beginMutation = sourceCode.indexOf("PackValidationRegistry.beginRootMutation(target)", install); int publish = sourceCode.indexOf("AtomicDirectoryPublisher.publish(stage, target)", beginMutation); diff --git a/core/src/test/java/art/arcane/iris/core/tools/IrisCreatorProgressContractTest.java b/core/src/test/java/art/arcane/iris/core/tools/IrisCreatorProgressContractTest.java index 545596d9c..b39d07025 100644 --- a/core/src/test/java/art/arcane/iris/core/tools/IrisCreatorProgressContractTest.java +++ b/core/src/test/java/art/arcane/iris/core/tools/IrisCreatorProgressContractTest.java @@ -11,7 +11,7 @@ import static org.junit.Assert.assertTrue; public class IrisCreatorProgressContractTest { @Test public void persistentCreateReportsTheWholeLifecycleInsteadOfOnlySpawnChunks() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/tools/IrisCreator.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/tools/IrisCreator.java")).replace("\r\n", "\n"); int startReporter = source.indexOf("WorldCreationProgressReporter.start(sender, name)"); int resolve = source.indexOf("0.02D, \"resolve_dimension\"", startReporter); diff --git a/core/src/test/java/art/arcane/iris/core/tools/IrisPersistentWorldCreationContractTest.java b/core/src/test/java/art/arcane/iris/core/tools/IrisPersistentWorldCreationContractTest.java index 52b1c13b3..afd3d377e 100644 --- a/core/src/test/java/art/arcane/iris/core/tools/IrisPersistentWorldCreationContractTest.java +++ b/core/src/test/java/art/arcane/iris/core/tools/IrisPersistentWorldCreationContractTest.java @@ -11,7 +11,7 @@ import static org.junit.Assert.assertTrue; public class IrisPersistentWorldCreationContractTest { @Test public void productionCreateFreezesIntoCurrentPlatformStorageBeforeWorldCreation() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/tools/IrisCreator.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/tools/IrisCreator.java")).replace("\r\n", "\n"); int createStart = source.indexOf("private World createReserved("); int createEnd = source.indexOf("static Player createTeleportTarget(", createStart); String create = source.substring(createStart, createEnd); @@ -39,7 +39,7 @@ public class IrisPersistentWorldCreationContractTest { @Test public void persistentCreatorPreservesConfiguredNameAndCanonicalIdentity() throws Exception { - String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/tools/IrisWorldCreator.java")); + String source = Files.readString(Path.of("src/main/java/art/arcane/iris/core/tools/IrisWorldCreator.java")).replace("\r\n", "\n"); int createStart = source.indexOf("public WorldCreator create()"); int createEnd = source.indexOf("private World.Environment findEnvironment()", createStart); String create = source.substring(createStart, createEnd); @@ -61,7 +61,7 @@ public class IrisPersistentWorldCreationContractTest { public void publicBukkitBackendRebuildKeepsExactFallbackWorldName() throws Exception { String source = Files.readString(Path.of( "src/main/java/art/arcane/iris/core/lifecycle/WorldLifecycleRequest.java" - )); + )).replace("\r\n", "\n"); int rebuildStart = source.indexOf("public WorldCreator toWorldCreator()"); int rebuildEnd = source.indexOf("return creator;", rebuildStart); String rebuild = source.substring(rebuildStart, rebuildEnd); diff --git a/core/src/test/java/art/arcane/iris/core/tools/WorldCreationProgressReporterTest.java b/core/src/test/java/art/arcane/iris/core/tools/WorldCreationProgressReporterTest.java index 2110c33a6..f674c48af 100644 --- a/core/src/test/java/art/arcane/iris/core/tools/WorldCreationProgressReporterTest.java +++ b/core/src/test/java/art/arcane/iris/core/tools/WorldCreationProgressReporterTest.java @@ -62,7 +62,7 @@ public class WorldCreationProgressReporterTest { public void bukkitHudMutationIsMarshalledOffTheAsyncReporterThread() throws Exception { String source = Files.readString(Path.of( "src/main/java/art/arcane/iris/core/tools/WorldCreationProgressReporter.java" - )); + )).replace("\r\n", "\n"); assertEquals(1, occurrences(source, "Bukkit.createBossBar(")); assertTrue(source.contains("J.sfut(reporter::initializePlayerHud)")); diff --git a/core/src/test/java/art/arcane/iris/engine/EngineRuntimePublicationContractTest.java b/core/src/test/java/art/arcane/iris/engine/EngineRuntimePublicationContractTest.java index a1cdb8ede..c475db299 100644 --- a/core/src/test/java/art/arcane/iris/engine/EngineRuntimePublicationContractTest.java +++ b/core/src/test/java/art/arcane/iris/engine/EngineRuntimePublicationContractTest.java @@ -12,7 +12,7 @@ public class EngineRuntimePublicationContractTest { @Test public void worldManagerStartsOnlyAfterTheRuntimeSessionIsReady() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/EngineRuntimeBuilder.java")); + "src/main/java/art/arcane/iris/engine/EngineRuntimeBuilder.java")).replace("\r\n", "\n"); int publishStart = source.indexOf("void publishRuntime("); int publishEnd = source.indexOf("private void scheduleRuntimeTasks", publishStart); String publish = source.substring(publishStart, publishEnd); @@ -27,7 +27,7 @@ public class EngineRuntimePublicationContractTest { @Test public void failedManagerStartClosesAdmissionBeforeRuntimeCleanup() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/EngineRuntimeBuilder.java")); + "src/main/java/art/arcane/iris/engine/EngineRuntimeBuilder.java")).replace("\r\n", "\n"); int publishStart = source.indexOf("void publishRuntime("); int publishEnd = source.indexOf("private void scheduleRuntimeTasks", publishStart); String publish = source.substring(publishStart, publishEnd); diff --git a/core/src/test/java/art/arcane/iris/engine/EngineShutdownOwnershipContractTest.java b/core/src/test/java/art/arcane/iris/engine/EngineShutdownOwnershipContractTest.java index b7349a752..8d814c044 100644 --- a/core/src/test/java/art/arcane/iris/engine/EngineShutdownOwnershipContractTest.java +++ b/core/src/test/java/art/arcane/iris/engine/EngineShutdownOwnershipContractTest.java @@ -12,7 +12,7 @@ public class EngineShutdownOwnershipContractTest { @Test public void ownershipCloseMustSucceedBeforeMantleRelease() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/EngineShutdownSequence.java")); + "src/main/java/art/arcane/iris/engine/EngineShutdownSequence.java")).replace("\r\n", "\n"); int ownershipClose = source.indexOf("NativeStructureOwnershipStore.close(engine)"); int ownershipGate = source.indexOf("if (ownershipFailure == null)", ownershipClose); int mantleRelease = source.indexOf("releaseMantle(failure)", ownershipGate); @@ -25,7 +25,7 @@ public class EngineShutdownOwnershipContractTest { @Test public void failedConstructionKeepsMantleOpenWhileOwnershipWritesRemain() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/EngineShutdownSequence.java")); + "src/main/java/art/arcane/iris/engine/EngineShutdownSequence.java")).replace("\r\n", "\n"); int cleanupStart = source.indexOf("void cleanupFailedConstruction"); int cleanupEnd = source.indexOf("Throwable closeAssembly", cleanupStart); String cleanup = source.substring(cleanupStart, cleanupEnd); diff --git a/core/src/test/java/art/arcane/iris/engine/NativeStructureBootstrapLifecycleContractTest.java b/core/src/test/java/art/arcane/iris/engine/NativeStructureBootstrapLifecycleContractTest.java index b3a0ed6a9..17b5a2fde 100644 --- a/core/src/test/java/art/arcane/iris/engine/NativeStructureBootstrapLifecycleContractTest.java +++ b/core/src/test/java/art/arcane/iris/engine/NativeStructureBootstrapLifecycleContractTest.java @@ -12,7 +12,7 @@ public class NativeStructureBootstrapLifecycleContractTest { @Test public void closeWaitsBeforeLifecycleMutationAndGenerationSeal() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/EngineShutdownSequence.java")); + "src/main/java/art/arcane/iris/engine/EngineShutdownSequence.java")).replace("\r\n", "\n"); int closeStart = source.indexOf("void close()"); int closeEnd = source.indexOf("void cleanupFailedConstruction", closeStart); String close = source.substring(closeStart, closeEnd); @@ -28,7 +28,7 @@ public class NativeStructureBootstrapLifecycleContractTest { @Test public void fullAndComplexHotloadWaitBeforeLifecycleMutationAndGenerationSeal() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/EngineHotloader.java")); + "src/main/java/art/arcane/iris/engine/EngineHotloader.java")).replace("\r\n", "\n"); int complexStart = source.indexOf("void hotloadComplex()"); int fullStart = source.indexOf("void hotloadSilently()", complexStart); String complex = source.substring(complexStart, fullStart); @@ -52,7 +52,7 @@ public class NativeStructureBootstrapLifecycleContractTest { @Test public void ringBootstrapStartsUnderTheSameLifecycleLock() throws IOException { String source = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/IrisEngine.java")); + "src/main/java/art/arcane/iris/engine/IrisEngine.java")).replace("\r\n", "\n"); int start = source.indexOf("public CompletableFuture startNativeStructureBootstrap("); int end = source.indexOf("void awaitNativeStructureBootstrap", start); String method = source.substring(start, end); @@ -68,7 +68,7 @@ public class NativeStructureBootstrapLifecycleContractTest { @Test public void studioVolumeQueriesStayOutsideCachesUntilTheBootstrapGateReleases() throws IOException { String engineSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/IrisEngine.java")); + "src/main/java/art/arcane/iris/engine/IrisEngine.java")).replace("\r\n", "\n"); int queryStart = engineSource.indexOf( "public KList getNativeStructureVolumes("); int queryEnd = engineSource.indexOf( @@ -77,7 +77,7 @@ public class NativeStructureBootstrapLifecycleContractTest { int setterEnd = engineSource.indexOf("public IrisEngineData getEngineData()", queryEnd); String setter = engineSource.substring(queryEnd, setterEnd); String generatorSource = Files.readString(Path.of( - "src/main/java/art/arcane/iris/engine/platform/BukkitChunkGenerator.java")); + "src/main/java/art/arcane/iris/engine/platform/BukkitChunkGenerator.java")).replace("\r\n", "\n"); int releaseStart = generatorSource.indexOf("public void endStudioEntryBootstrap()"); int releaseEnd = generatorSource.indexOf( "public boolean isStudioEntryBootstrapActive()", releaseStart); diff --git a/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java b/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java index 11a37b2fe..8530e15f4 100644 --- a/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java +++ b/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java @@ -235,7 +235,7 @@ public class StructureHandlerTest { public void completionUsesOneReachabilitySnapshotAndLocatableKeys() throws IOException { Path sourcePath = Path.of( "src/main/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandler.java"); - String source = Files.readString(sourcePath); + String source = Files.readString(sourcePath).replace("\r\n", "\n"); int methodStart = source.indexOf("public KList getPossibilities()"); int methodEnd = source.indexOf("@Override\n public String toString", methodStart); String method = source.substring(methodStart, methodEnd); diff --git a/publish-volmlib.bat b/publish-volmlib.bat new file mode 100644 index 000000000..8095840c0 --- /dev/null +++ b/publish-volmlib.bat @@ -0,0 +1,59 @@ +@echo off +REM Publishes VolmLib to the local Maven repository under the coordinate this project +REM resolves by default: com.github.VolmitSoftware:VolmLib:master-SNAPSHOT. +REM +REM VolmLib is normally picked up as a composite build straight from source, so this is +REM only needed when you build with -PuseLocalVolmLib=false, or when another tool has to +REM resolve VolmLib from the local Maven repository rather than the included build. +REM +REM The lookup mirrors settings.gradle: it walks up from this script looking for a +REM VolmLib checkout sitting beside the project root. Set VOLMLIB_DIR to override. +REM Any extra arguments are forwarded to gradle. + +setlocal + +set "SCRIPT_DIR=%~dp0" +if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" + +set "VOLMLIB_DIRECTORY=" + +if defined VOLMLIB_DIR call :check "%VOLMLIB_DIR%" +if not defined VOLMLIB_DIRECTORY call :search "%SCRIPT_DIR%" + +if not defined VOLMLIB_DIRECTORY ( + echo Could not find a VolmLib checkout. 1>&2 + echo Expected a VolmLib directory beside this project root, or VOLMLIB_DIR pointing at one. 1>&2 + exit /b 1 +) + +echo ==^> Publishing VolmLib from %VOLMLIB_DIRECTORY% + +pushd "%VOLMLIB_DIRECTORY%" +if errorlevel 1 exit /b 1 + +call gradlew.bat publishToMavenLocal -Pgroup=com.github.VolmitSoftware -Pversion=master-SNAPSHOT -PvolmLibArtifactId=VolmLib %* +set "PUBLISH_RESULT=%ERRORLEVEL%" + +popd +exit /b %PUBLISH_RESULT% + +:check +if exist "%~1\settings.gradle" set "VOLMLIB_DIRECTORY=%~f1" +if exist "%~1\settings.gradle.kts" set "VOLMLIB_DIRECTORY=%~f1" +goto :eof + +:search +set "CURRENT=%~f1" +:search_loop +if exist "%CURRENT%\VolmLib\settings.gradle" ( + set "VOLMLIB_DIRECTORY=%CURRENT%\VolmLib" + goto :eof +) +if exist "%CURRENT%\VolmLib\settings.gradle.kts" ( + set "VOLMLIB_DIRECTORY=%CURRENT%\VolmLib" + goto :eof +) +for %%I in ("%CURRENT%\..") do set "PARENT=%%~fI" +if /i "%PARENT%"=="%CURRENT%" goto :eof +set "CURRENT=%PARENT%" +goto :search_loop diff --git a/publish-volmlib.sh b/publish-volmlib.sh new file mode 100644 index 000000000..322de2278 --- /dev/null +++ b/publish-volmlib.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# +# Publishes VolmLib to the local Maven repository under the coordinate this project +# resolves by default: com.github.VolmitSoftware:VolmLib:master-SNAPSHOT. +# +# VolmLib is normally picked up as a composite build straight from source, so this is +# only needed when you build with -PuseLocalVolmLib=false, or when another tool has to +# resolve VolmLib from ~/.m2 rather than from the included build. +# +# The lookup mirrors settings.gradle: it walks up from this script looking for a +# VolmLib checkout sitting beside the project root. Set VOLMLIB_DIR to override. +# Any extra arguments are forwarded to gradle. + +set -o pipefail + +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" + +has_volmlib_settings() { + [[ -f "$1/settings.gradle" || -f "$1/settings.gradle.kts" ]] +} + +resolve_volmlib_directory() { + if [[ -n "$VOLMLIB_DIR" ]] && has_volmlib_settings "$VOLMLIB_DIR"; then + printf '%s' "$VOLMLIB_DIR" + return 0 + fi + + local current="$SCRIPT_DIR" + while [[ -n "$current" ]]; do + if has_volmlib_settings "$current/VolmLib"; then + printf '%s' "$current/VolmLib" + return 0 + fi + + local parent + parent="$(dirname -- "$current")" + [[ "$parent" == "$current" ]] && break + current="$parent" + done + + return 1 +} + +if ! VOLMLIB_DIRECTORY="$(resolve_volmlib_directory)"; then + printf 'Could not find a VolmLib checkout.\n' >&2 + printf 'Expected a VolmLib directory beside this project root, or VOLMLIB_DIR pointing at one.\n' >&2 + exit 1 +fi + +printf '==> Publishing VolmLib from %s\n' "$VOLMLIB_DIRECTORY" + +cd "$VOLMLIB_DIRECTORY" || exit 1 +./gradlew publishToMavenLocal \ + -Pgroup=com.github.VolmitSoftware \ + -Pversion=master-SNAPSHOT \ + -PvolmLibArtifactId=VolmLib \ + "$@"