fun getChangelog()

in tools/changelog/changelog.main.kts [169:256]


    fun getChangelog(firstCommit: String, lastCommit: String, firstVersion: String, lastVersion: String): String {
        val isPrerelease = lastVersion.contains("-")

        val entries = entriesForRepo("JetBrains/compose-multiplatform-core", firstCommit, lastCommit) +
                entriesForRepo("JetBrains/compose-multiplatform", firstCommit, lastCommit)

        return buildString {
            appendLine("# $lastVersion (${currentChangelogDate()})")

            appendLine()
            appendLine("_Changes since ${firstVersion}_")
            appendLine()

            entries
                .filter { isPrerelease || !it.isPrerelease }
                .sortedBy { it.sectionOrder() }
                .groupBy { it.sectionName() }
                .forEach { (section, sectionEntries) ->
                    appendLine("## $section")
                    appendLine()

                    sectionEntries
                        .sortedBy { it.subsectionOrder() }
                        .groupBy { it.subsectionName() }
                        .forEach { (subsection, subsectionEntries) ->
                            appendLine("### $subsection")
                            appendLine()
                            subsectionEntries.forEach {
                                appendLine(it.run { "- $title [#$prNumber]($link)" })
                                if (it.details != null) {
                                    if (!it.details.startsWith("-")) {
                                        appendLine()
                                    }
                                    appendLine(it.details.prependIndent("  "))
                                }
                            }
                            appendLine()
                        }
                }

            append(
                """
                    ## Components

                    ### Gradle plugin

                    `org.jetbrains.compose` version `$versionCompose`

                    ### Libraries

                    | Library group | Coordinates | Based on Jetpack |
                    |---------------|-------------|------------------|
                    | Runtime | `org.jetbrains.compose.runtime:runtime*:$versionCompose` | [Runtime $versionRedirectingCompose](https://developer.android.com/jetpack/androidx/releases/compose-runtime#$versionRedirectingCompose) |
                    | UI | `org.jetbrains.compose.ui:ui*:$versionCompose` | [UI $versionRedirectingCompose](https://developer.android.com/jetpack/androidx/releases/compose-ui#$versionRedirectingCompose) |
                    | Foundation | `org.jetbrains.compose.foundation:foundation*:$versionCompose` | [Foundation $versionRedirectingCompose](https://developer.android.com/jetpack/androidx/releases/compose-foundation#$versionRedirectingCompose) |
                    | Material | `org.jetbrains.compose.material:material*:$versionCompose` | [Material $versionRedirectingCompose](https://developer.android.com/jetpack/androidx/releases/compose-material#$versionRedirectingCompose) |
                    | Material3 | `org.jetbrains.compose.material3:material3*:$versionComposeMaterial3` | [Material3 $versionRedirectingComposeMaterial3](https://developer.android.com/jetpack/androidx/releases/compose-material3#$versionRedirectingComposeMaterial3) |
                    | Material3 Adaptive | `org.jetbrains.compose.material3.adaptive:adaptive*:$versionComposeMaterial3Adaptive` | [Material3 Adaptive $versionRedirectingComposeMaterial3Adaptive](https://developer.android.com/jetpack/androidx/releases/compose-material3-adaptive#$versionRedirectingComposeMaterial3Adaptive) |
                    | Lifecycle | `org.jetbrains.androidx.lifecycle:lifecycle-*:$versionLifecycle` | [Lifecycle $versionRedirectingLifecycle](https://developer.android.com/jetpack/androidx/releases/lifecycle#$versionRedirectingLifecycle) |
                    | Navigation | `org.jetbrains.androidx.navigation:navigation-*:2.9.1` | [Navigation 2.9.4](https://developer.android.com/jetpack/androidx/releases/navigation#2.9.4) |
                    | Navigation3 | `org.jetbrains.androidx.navigation3:navigation3-*:$versionNavigation3` | [Navigation3 $versionRedirectingNavigation3](https://developer.android.com/jetpack/androidx/releases/navigation3#$versionRedirectingNavigation3) |
                    | Navigation Event | `org.jetbrains.androidx.navigationevent:navigationevent-compose:$versionNavigationEvent` | [Navigation Event $versionRedirectingNavigationEvent](https://developer.android.com/jetpack/androidx/releases/navigationevent#$versionRedirectingNavigationEvent) |
                    | Savedstate | `org.jetbrains.androidx.savedstate:savedstate*:$versionSavedstate` | [Savedstate $versionRedirectingSavedstate](https://developer.android.com/jetpack/androidx/releases/savedstate#$versionRedirectingSavedstate) |
                    | WindowManager Core | `org.jetbrains.androidx.window:window-core:$versionWindow` | [WindowManager $versionRedirectingWindow](https://developer.android.com/jetpack/androidx/releases/window#$versionRedirectingWindow) |

                    ---
                """.trimIndent()
            )

            appendLine()
            appendLine()

            val nonstandardSectionEntries = entries
                .filter {
                    it.section != null && it.subsection != null
                            && it.section !in standardSections && it.subsection !in standardSubsections
                }

            if (nonstandardSectionEntries.isNotEmpty()) {
                println()
                println("WARNING! Changelog contains nonstandard sections. Please change them to the standard ones, or enhance the list in the PR template.")

                for (entry in nonstandardSectionEntries) {
                    println("${entry.section} - ${entry.subsection} in ${entry.link}")
                }
            }
        }
    }