diff --git a/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgeClient.kt b/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgeClient.kt index fc88b46..ee21a5e 100644 --- a/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgeClient.kt +++ b/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgeClient.kt @@ -32,7 +32,10 @@ internal class CurseForgeClient( logger, ) - suspend fun uploadFile(spec: ReleaseArtifact) = uploadFile(spec.artifact.toFile()) { + suspend fun uploadFile( + spec: ReleaseArtifact, + excludeVersions: List = emptyList(), + ) = uploadFile(spec.artifact.toFile()) { displayName(spec.displayName) releaseType(spec.versionType.toCurseForge()) @@ -45,7 +48,7 @@ internal class CurseForgeClient( spec.loaders, spec.curseForgeEnvironments, spec.curseForgeJavaVersions, - spec.curseForgeMinecraftVersions, + spec.curseForgeMinecraftVersions.filterNot(excludeVersions::contains), ).flatten().forEach(::addGameVersion) spec.relationships.forEach { (slug, _, type) -> diff --git a/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgePlatform.kt b/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgePlatform.kt index ca29a0e..fc7bae2 100644 --- a/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgePlatform.kt +++ b/curseforge/src/main/kotlin/net/xolt/freecam/publish/platforms/CurseForgePlatform.kt @@ -32,8 +32,25 @@ internal class DefaultCurseForgePlatform( override suspend fun publishRelease(metadata: ReleaseMetadata, artifacts: List) { artifacts.forEach { spec -> - logger.info { "publishing artifact ${spec.name}" } - client.uploadFile(spec) + try { + logger.info { "publishing artifact ${spec.name}" } + client.uploadFile(spec) + } catch (e: IllegalArgumentException /* TODO: InvalidCurseVersionException */) { + val infix = " is not a valid game version." + e.message?.takeIf { infix in it }?.let { msg -> + // TODO: CurseUpload4J 1.1.1's `InvalidCurseVersionException` will list all invalid versions. + val invalid = listOf(msg.substringBefore(infix)) + + // CurseForge has flaky support for snapshot versions, + // so retry if all invalid versions end in '-snapshot'. + if (invalid.all { it.endsWith("-snapshot") }) { + logger.warn { "retrying ${spec.name} without invalid snapshot versions: $invalid" } + client.uploadFile(spec, excludeVersions = invalid) + return@forEach + } + } + throw e + } } } }