From: Alexander Goussas Date: Fri, 24 Oct 2025 15:38:26 +0000 (-0500) Subject: feat: add git command to get commits from current branch only X-Git-Url: http://git.frustrated-labs.net/?a=commitdiff_plain;h=8c1d5ab869450a08b8068d8f736bf2feb042e2b0;p=gradle-changelog-plugin.git feat: add git command to get commits from current branch only --- diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt index 955e984..594d268 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt @@ -2,11 +2,8 @@ package io.github.aloussase.changelog import io.github.aloussase.changelog.config.ChangelogPluginExtension import io.github.aloussase.changelog.config.Config -import io.github.aloussase.changelog.formatter.ChangelogFormatterFactory -import io.github.aloussase.changelog.parser.ChangelogParserFactory import org.gradle.api.Plugin import org.gradle.api.Project -import java.io.File class ChangelogPlugin : Plugin { override fun apply(project: Project) { @@ -16,20 +13,8 @@ class ChangelogPlugin : Plugin { extension.format.convention("markdown") extension.fileName.convention("CHANGELOG.md") - project.tasks.register("changelog") { - val config = Config.from(extension) - val parser = ChangelogParserFactory.createParser(config.documentFormat) - val changelogFile = File(config.fileName) - if (!changelogFile.exists()) { - changelogFile.createNewFile() - } - val document = changelogFile.readText() - val changelog = parser.parse(document).getOrThrow() - - // TODO: Add commits from current branch here. - - val formatter = ChangelogFormatterFactory.create(config.documentFormat) - changelogFile.writeText(formatter.format(changelog)) + project.tasks.register("changelog", ChangelogTask::class.java) { + it.config = Config.configure(extension) } } } diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogTask.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogTask.kt new file mode 100644 index 0000000..aafc507 --- /dev/null +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogTask.kt @@ -0,0 +1,34 @@ +package io.github.aloussase.changelog + +import io.github.aloussase.changelog.config.Config +import io.github.aloussase.changelog.formatter.ChangelogFormatterFactory +import io.github.aloussase.changelog.git.GetCurrentBranchCommits +import io.github.aloussase.changelog.parser.ChangelogParserFactory +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import java.io.File + +abstract class ChangelogTask : DefaultTask() { + + @Input + lateinit var config: Config + + @TaskAction + fun run() { + val parser = ChangelogParserFactory.createParser(config.documentFormat) + val changelogFile = File(config.fileName) + if (!changelogFile.exists()) { + changelogFile.createNewFile() + } + val document = changelogFile.readText() + val changelog = parser.parse(document).getOrThrow() + + // TODO: Add commits from current branch here. + println(GetCurrentBranchCommits().execute()) + + val formatter = ChangelogFormatterFactory.create(config.documentFormat) + changelogFile.writeText(formatter.format(changelog)) + } + +} diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/config/Config.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/config/Config.kt index 927eda3..ffd61da 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/config/Config.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/config/Config.kt @@ -3,13 +3,14 @@ package io.github.aloussase.changelog.config import io.github.aloussase.changelog.formats.DocumentFormat import org.gradle.api.GradleException -data class Config( +class Config private constructor( val fileName: String, val gitBranch: String, val documentFormat: DocumentFormat, ) { + companion object { - fun from(extension: ChangelogPluginExtension): Config { + fun configure(extension: ChangelogPluginExtension): Config { val format = DocumentFormat.parse(extension.format.get()) if (format == null) { throw GradleException("Invalid document format: cannot make a changelog from ${extension.format.get()}") diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/AbstractGitCommand.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/AbstractGitCommand.kt index 13ceb33..1a4a9ed 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/AbstractGitCommand.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/AbstractGitCommand.kt @@ -1,14 +1,16 @@ package io.github.aloussase.changelog.git -abstract class AbstractGitCommand : GitCommand { +abstract class AbstractGitCommand : GitCommand { - override fun execute(): String { + abstract fun transform(rawOutput: String): T + + override fun execute(): T { val runtime = Runtime.getRuntime() val ary = arrayOf("/bin/sh", "-c", commandLine) val process = runtime.exec(ary) process.waitFor() return process.inputReader().use { br -> - br.readText().trim() + transform(br.readText().trim()) } } diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GetCurrentBranchCommits.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GetCurrentBranchCommits.kt new file mode 100644 index 0000000..7dae1da --- /dev/null +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GetCurrentBranchCommits.kt @@ -0,0 +1,12 @@ +package io.github.aloussase.changelog.git + +class GetCurrentBranchCommits : AbstractGitCommand>>() { + override val commandLine: String + get() = "git log main..HEAD --no-merges --oneline --pretty=format:\"%an|%s\"" + + override fun transform(rawOutput: String): List> = + rawOutput + .split("\n") + .map { it.split("|") } + .map { Pair(it[0], it[1]) } +} diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GetCurrentReleaseCommand.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GetCurrentReleaseCommand.kt index 3bea08d..e9a52c3 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GetCurrentReleaseCommand.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GetCurrentReleaseCommand.kt @@ -1,6 +1,8 @@ package io.github.aloussase.changelog.git -class GetCurrentReleaseCommand : AbstractGitCommand() { +class GetCurrentReleaseCommand : AbstractGitCommand() { override val commandLine: String get() = "git tag | tail -n1" + + override fun transform(rawOutput: String): String = rawOutput } diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GitCommand.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GitCommand.kt index eb18e17..1603d5f 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GitCommand.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/git/GitCommand.kt @@ -1,9 +1,9 @@ package io.github.aloussase.changelog.git -interface GitCommand { +interface GitCommand { val commandLine: String - fun execute(): String + fun execute(): T } diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/parser/MarkdownChangelogParser.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/parser/MarkdownChangelogParser.kt index b3e2a1b..e15e413 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/parser/MarkdownChangelogParser.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/parser/MarkdownChangelogParser.kt @@ -23,7 +23,7 @@ class MarkdownChangelogParser : ChangelogParser { val entries = arrayListOf() - for (blk in doc.split("\n\n")) { + for (blk in doc.trim().split("\n\n")) { if (DOC_TITLE_REGEX.matches(blk)) continue val lines = blk.split("\n")