From 46a5def9d2d76854ec696b6dc11ae73ffb65eacb Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Thu, 27 Aug 2026 09:28:49 +0100 Subject: [PATCH] Use mod-specific Mineralogy Maven group --- build.gradle | 39 ++++++++++++++++++- gradle.properties | 2 +- .../mc/mineralogy/WorkflowContractTest.java | 4 ++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 091365ff..727c0e53 100644 --- a/build.gradle +++ b/build.gradle @@ -263,6 +263,9 @@ def mainReleaseName = "Mineralogy-${project.version}.jar" def sourcesReleaseName = "Mineralogy-${project.version}-sources.jar" def javadocReleaseName = "Mineralogy-${project.version}-javadoc.jar" def expectedReleaseNames = [mainReleaseName, sourcesReleaseName, javadocReleaseName] +def expectedMavenGroup = 'zone.moddev.mc.mineralogy' +def expectedMavenArtifact = 'Mineralogy' +def expectedMavenCoordinate = "${expectedMavenGroup}:${expectedMavenArtifact}:${project.version}" def preparedReleaseDir = project.findProperty('preparedReleaseDir') def mavenUploadUrl = System.getenv('MAVEN_UPLOAD_URL') ?: 'https://invalid.invalid/missing-maven-upload-url' def mavenUploadUsername = System.getenv('MAVEN_UPLOAD_USERNAME') ?: '' @@ -272,7 +275,7 @@ publishing { publications { mavenJava(MavenPublication) { groupId = project.group - artifactId = 'Mineralogy' + artifactId = expectedMavenArtifact version = project.version if (preparedReleaseDir != null) { artifact new File(preparedReleaseDir.toString(), mainReleaseName) @@ -311,11 +314,30 @@ publishing { } } +tasks.register('verifyMavenCoordinates') { + group = 'verification' + description = 'Verifies the generated POM uses Mineralogy\'s mod-specific Maven namespace.' + dependsOn tasks.named('generatePomFileForMavenJavaPublication') + doLast { + File pomFile = file("${buildDir}/publications/mavenJava/pom-default.xml") + if (!pomFile.isFile()) { + throw new GradleException("Generated Maven POM does not exist: ${pomFile}") + } + def pom = new XmlSlurper(false, false).parse(pomFile) + def actual = [pom.groupId.text(), pom.artifactId.text(), pom.version.text()] + def expected = [expectedMavenGroup, expectedMavenArtifact, project.version.toString()] + if (project.group.toString() != expectedMavenGroup || actual != expected) { + throw new GradleException("Expected Maven coordinate ${expected.join(':')}, found ${actual.join(':')}") + } + } +} + tasks.register('verifyReleaseConfiguration') { group = 'verification' description = 'Verifies the exact Mineralogy 1.15 release identity.' doLast { if (project.mod_version != '6.0.1.115021' + || project.mod_group != expectedMavenGroup || project.minecraft_version != '1.15.2' || project.forge_version != '31.2.57' || project.mcp_mappings_channel != 'snapshot' @@ -399,6 +421,19 @@ tasks.register('verifyReleaseArtifacts') { ].each { required -> if (!names.contains(required)) throw new GradleException("Release jar is missing ${required}") } + def manifestEntry = zip.getEntry('META-INF/MANIFEST.MF') + if (manifestEntry == null) throw new GradleException('Release jar is missing META-INF/MANIFEST.MF') + def manifestStream = zip.getInputStream(manifestEntry) + try { + def manifest = new java.util.jar.Manifest(manifestStream) + def actualMavenCoordinate = manifest.mainAttributes.getValue('Maven-Artifact') + if (actualMavenCoordinate != expectedMavenCoordinate) { + throw new GradleException("Expected manifest Maven-Artifact ${expectedMavenCoordinate}, found ${actualMavenCoordinate}") + } + } + finally { + manifestStream.close() + } if (names.any { it.startsWith('com/mcmoddev/mineralogy/') || it.startsWith('zone/moddev/mc/mineralogy/worldgen/') || it.startsWith('zone/moddev/mc/mineralogy/probe/') || @@ -514,6 +549,7 @@ tasks.register('validateMavenReleaseCredentials') { tasks.withType(PublishToMavenRepository).configureEach { dependsOn tasks.named('validateMavenReleaseCredentials') + dependsOn tasks.named('verifyMavenCoordinates') dependsOn(preparedReleaseDir == null ? tasks.named('verifyReleaseArtifacts') : tasks.named('verifyPreparedReleaseArtifacts')) @@ -713,4 +749,5 @@ tasks.matching { it.name == 'eclipse' }.configureEach { tasks.named('check') { dependsOn tasks.named('verifyReleaseDependencies') + dependsOn tasks.named('verifyMavenCoordinates') } diff --git a/gradle.properties b/gradle.properties index 9fb11ab0..8e0be62d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.parallel=false net.minecraftforge.gradle.merge-source-sets=false mod_version=6.0.1.115021 -mod_group=zone.moddev.mc +mod_group=zone.moddev.mc.mineralogy # Release metadata consumed by the generic dispatcher. minecraft_version=1.15.2 diff --git a/src/test/java/zone/moddev/mc/mineralogy/WorkflowContractTest.java b/src/test/java/zone/moddev/mc/mineralogy/WorkflowContractTest.java index ce25ba0e..a7ee87f3 100644 --- a/src/test/java/zone/moddev/mc/mineralogy/WorkflowContractTest.java +++ b/src/test/java/zone/moddev/mc/mineralogy/WorkflowContractTest.java @@ -28,6 +28,7 @@ public void releaseMetadataIdentifiesTheGenericForgeTarget() throws Exception { assertEquals("8.0.502+7", properties.getProperty("java_toolchain_version")); assertEquals("17", properties.getProperty("gradle_java_version")); assertEquals("240974", properties.getProperty("curseforge_project_id")); + assertEquals("zone.moddev.mc.mineralogy", properties.getProperty("mod_group")); } @Test @@ -75,6 +76,9 @@ public void buildPublishesOnlyThePreparedRemoteBundle() throws Exception { assertTrue(build.contains("def preparedReleaseDir = project.findProperty('preparedReleaseDir')")); assertTrue(build.contains("tasks.register('verifyPreparedReleaseArtifacts')")); assertTrue(build.contains("tasks.withType(PublishToMavenRepository).configureEach")); + assertTrue(build.contains("tasks.register('verifyMavenCoordinates')")); + assertTrue(build.contains("generatePomFileForMavenJavaPublication")); + assertTrue(build.contains("dependsOn tasks.named('verifyMavenCoordinates')")); assertTrue(build.contains("Maven release publication must use a remote repository")); assertTrue(build.contains("name = 'release'")); assertFalse(build.contains("file:///${project.projectDir}/mcmodsrepo"));