From 49ccf6e45bdbaf2e96ce65e92ef80c33327a1ee1 Mon Sep 17 00:00:00 2001 From: kirillk Date: Thu, 4 Jun 2026 09:45:12 -0400 Subject: [PATCH 1/3] fix(jetbrains): render multi-release change notes --- packages/kilo-jetbrains/build.gradle.kts | 57 ++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/packages/kilo-jetbrains/build.gradle.kts b/packages/kilo-jetbrains/build.gradle.kts index fd4c091eede..ca68a9dca86 100644 --- a/packages/kilo-jetbrains/build.gradle.kts +++ b/packages/kilo-jetbrains/build.gradle.kts @@ -34,6 +34,51 @@ fun checked(value: String): String { return value } +data class Release(val major: Int, val minor: Int, val patch: Int, val rc: Int?) : Comparable { + val stable = rc == null + val base get() = if (stable) this else Release(major, minor, patch, null) + val text = listOfNotNull("$major.$minor.$patch", rc?.let { "rc.$it" }).joinToString("-") + + override fun compareTo(other: Release): Int { + val base = compareValuesBy(this, other, Release::major, Release::minor, Release::patch) + if (base != 0) return base + return compareValues(rc ?: Int.MAX_VALUE, other.rc ?: Int.MAX_VALUE) + } +} + +fun release(value: String): Release? { + val match = Regex("^(\\d+)\\.(\\d+)\\.(\\d+)(?:-rc\\.(\\d+))?$").matchEntire(value) ?: return null + return Release( + match.groupValues[1].toInt(), + match.groupValues[2].toInt(), + match.groupValues[3].toInt(), + match.groupValues[4].takeIf { it.isNotEmpty() }?.toInt(), + ) +} + +fun releases(): List { + val heading = Regex("^## \\[(.+?)](?: - .*)?$|^## ([^\\[]\\S*)$") + return file("CHANGELOG.md").readLines() + .mapNotNull { line -> + val match = heading.matchEntire(line.trim()) ?: return@mapNotNull null + release(match.groupValues[1].ifEmpty { match.groupValues[2] }) + } + .distinctBy { it.text } +} + +fun selected(value: String): List { + val current = release(value) ?: return emptyList() + val entries = releases() + val rcs = if (current.stable) emptyList() else entries + .filter { !it.stable && it.base == current.base && it <= current } + .sortedDescending() + val stables = entries + .filter { it.stable && if (current.stable) it <= current else it < current.base } + .sortedDescending() + .take(5) + return (rcs + stables).map { it.text } +} + fun gitTag(): String? { val text = providers.exec { commandLine("git", "tag", "--points-at", "HEAD") @@ -83,11 +128,15 @@ changelog { val notes = providers.gradleProperty("kilo.changeNotes").orElse( provider { + val versions = selected(ver).filter { changelog.has(it) } + if (versions.isNotEmpty()) return@provider versions.joinToString("\n") { item -> + changelog.renderItem( + changelog.get(item).withHeader(true).withEmptySections(false), + Changelog.OutputType.HTML, + ) + } val item = if (changelog.has(ver)) changelog.get(ver) else changelog.getUnreleased() - changelog.renderItem( - item.withHeader(false).withEmptySections(false), - Changelog.OutputType.HTML, - ) + changelog.renderItem(item.withHeader(false).withEmptySections(false), Changelog.OutputType.HTML) }, ) From 6cace2a29a4b53d258f7a8f9322e95e5ad8c3fe4 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 4 Jun 2026 09:58:46 -0400 Subject: [PATCH 2/3] Update packages/kilo-jetbrains/build.gradle.kts Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com> --- packages/kilo-jetbrains/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-jetbrains/build.gradle.kts b/packages/kilo-jetbrains/build.gradle.kts index ca68a9dca86..153a470d9b9 100644 --- a/packages/kilo-jetbrains/build.gradle.kts +++ b/packages/kilo-jetbrains/build.gradle.kts @@ -40,7 +40,7 @@ data class Release(val major: Int, val minor: Int, val patch: Int, val rc: Int?) val text = listOfNotNull("$major.$minor.$patch", rc?.let { "rc.$it" }).joinToString("-") override fun compareTo(other: Release): Int { - val base = compareValuesBy(this, other, Release::major, Release::minor, Release::patch) + val cmp = compareValuesBy(this, other, Release::major, Release::minor, Release::patch) if (base != 0) return base return compareValues(rc ?: Int.MAX_VALUE, other.rc ?: Int.MAX_VALUE) } From d6df2d5e9848481c64e8561b0e4f8fd2d4a47a9c Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 4 Jun 2026 10:29:04 -0400 Subject: [PATCH 3/3] Update packages/kilo-jetbrains/build.gradle.kts Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com> --- packages/kilo-jetbrains/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-jetbrains/build.gradle.kts b/packages/kilo-jetbrains/build.gradle.kts index 153a470d9b9..890853a9c22 100644 --- a/packages/kilo-jetbrains/build.gradle.kts +++ b/packages/kilo-jetbrains/build.gradle.kts @@ -41,7 +41,7 @@ data class Release(val major: Int, val minor: Int, val patch: Int, val rc: Int?) override fun compareTo(other: Release): Int { val cmp = compareValuesBy(this, other, Release::major, Release::minor, Release::patch) - if (base != 0) return base + if (cmp != 0) return cmp return compareValues(rc ?: Int.MAX_VALUE, other.rc ?: Int.MAX_VALUE) } }