val commits: List<Commit> = emptyList(),
) : Comparable<ChangelogEntry> {
override fun compareTo(other: ChangelogEntry): Int {
+
+ // Unreleased always goes at the top.
+ if (release == "Unreleased") return -1
+ if (other.release == "Unreleased") return 1
+
val myRelease = release.split(".").map { it.toInt() }
val otherRelease = other.release.split(".").map { it.toInt() }
return Comparator
import io.github.aloussase.changelog.config.Config
import io.github.aloussase.changelog.formatter.ChangelogFormatterFactory
-import io.github.aloussase.changelog.git.GetCurrentBranchCommand
+import io.github.aloussase.changelog.git.GitService
+import io.github.aloussase.changelog.git.commands.GetCurrentBranchCommand
+import io.github.aloussase.changelog.git.commands.GetCurrentBranchCommitsCommand
+import io.github.aloussase.changelog.git.commands.GetCurrentReleaseCommand
import io.github.aloussase.changelog.parser.ChangelogParserFactory
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
@Input
lateinit var config: Config
+ private val gitService = GitService(
+ GetCurrentBranchCommand(),
+ GetCurrentBranchCommitsCommand(),
+ GetCurrentReleaseCommand(),
+ )
+
@TaskAction
fun run() {
val parser = ChangelogParserFactory.createParser(config.documentFormat)
val document = changelogFile.readText()
val changelog = parser.parse(document).getOrThrow()
- // TODO: Add commits from current branch here.
- println(GetCurrentBranchCommand().execute())
+ val changes = gitService.getCurrrentBranchChanges()
+ val releaseExists = changelog.entries.any { it.release == changes.release }
+
+ val newChangelog =
+ if (releaseExists) {
+ Changelog(
+ changelog
+ .entries
+ .map {
+ if (it.release == changes.release) {
+ ChangelogEntry(
+ changes.release,
+ it.commits.toSet()
+ .union(changes.commits.toSet())
+ .toList()
+ )
+ } else {
+ it
+ }
+ }
+ )
+ } else {
+ Changelog(listOf(changes) + changelog.entries)
+ }
val formatter = ChangelogFormatterFactory.create(config.documentFormat)
- changelogFile.writeText(formatter.format(changelog))
+
+ changelogFile.writeText(formatter.format(newChangelog))
}
}
+++ /dev/null
-package io.github.aloussase.changelog.git
-
-abstract class AbstractGitCommand<T> : GitCommand<T> {
-
- 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 ->
- transform(br.readText().trim())
- }
- }
-
-}
--- /dev/null
+package io.github.aloussase.changelog.git
+
+data class Branch(
+ val name: String,
+)
+++ /dev/null
-package io.github.aloussase.changelog.git
-
-class GetCurrentBranchCommand : AbstractGitCommand<String>() {
- override fun transform(rawOutput: String): String = rawOutput
-
- override val commandLine: String
- get() = "git branch --show-current"
-}
+++ /dev/null
-package io.github.aloussase.changelog.git
-
-class GetCurrentBranchCommitsCommand : AbstractGitCommand<List<Pair<String, String>>>() {
- override val commandLine: String
- get() = "git log main..HEAD --no-merges --oneline --pretty=format:\"%an|%s\""
-
- override fun transform(rawOutput: String): List<Pair<String, String>> =
- rawOutput
- .split("\n")
- .map { it.split("|") }
- .map { Pair(it[0], it[1]) }
-}
+++ /dev/null
-package io.github.aloussase.changelog.git
-
-class GetCurrentReleaseCommand : AbstractGitCommand<String>() {
- override val commandLine: String
- get() = "git tag | tail -n1"
-
- override fun transform(rawOutput: String): String = rawOutput
-}
+++ /dev/null
-package io.github.aloussase.changelog.git
-
-interface GitCommand<T> {
-
- val commandLine: String
-
- fun execute(): T
-
-}
--- /dev/null
+package io.github.aloussase.changelog.git
+
+import io.github.aloussase.changelog.ChangelogEntry
+import io.github.aloussase.changelog.git.commands.GitCommand
+
+class GitService(
+ val currentBranchCommand: GitCommand<Branch>,
+ val currentBranchCommitsCommand: GitCommand<List<RawCommit>>,
+ val currentReleaseCommand: GitCommand<Tag>
+) {
+
+ fun getCurrrentBranchChanges(): ChangelogEntry {
+ val currentBranch = currentBranchCommand.execute()
+ val commits = currentBranchCommitsCommand.execute()
+ val release = Tag("Unreleased")
+ return ChangelogEntry(
+ release.name,
+ commits.map {
+ Commit(
+ it.author,
+ currentBranch.name,
+ it.message
+ )
+ }
+ )
+ }
+
+}
--- /dev/null
+package io.github.aloussase.changelog.git
+
+data class RawCommit(
+ val author: String,
+ val message: String,
+)
--- /dev/null
+package io.github.aloussase.changelog.git
+
+data class Tag(
+ val name: String,
+)
--- /dev/null
+package io.github.aloussase.changelog.git.commands
+
+abstract class AbstractGitCommand<T> : GitCommand<T> {
+
+ 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 ->
+ transform(br.readText().trim())
+ }
+ }
+
+}
--- /dev/null
+package io.github.aloussase.changelog.git.commands
+
+import io.github.aloussase.changelog.git.Branch
+
+class GetCurrentBranchCommand : AbstractGitCommand<Branch>() {
+ override fun transform(rawOutput: String): Branch = Branch(rawOutput)
+
+ override val commandLine: String
+ get() = "git branch --show-current"
+}
--- /dev/null
+package io.github.aloussase.changelog.git.commands
+
+import io.github.aloussase.changelog.git.RawCommit
+
+class GetCurrentBranchCommitsCommand : AbstractGitCommand<List<RawCommit>>() {
+ override val commandLine: String
+ get() = "git log main..HEAD --no-merges --oneline --pretty=format:\"%an|%s\""
+
+ override fun transform(rawOutput: String): List<RawCommit> =
+ rawOutput
+ .split("\n")
+ .map { it.split("|") }
+ .map { RawCommit(it[0], it[1]) }
+}
--- /dev/null
+package io.github.aloussase.changelog.git.commands
+
+import io.github.aloussase.changelog.git.Tag
+
+class GetCurrentReleaseCommand : AbstractGitCommand<Tag>() {
+ override val commandLine: String
+ get() = "git tag | tail -n1"
+
+ override fun transform(rawOutput: String): Tag = Tag(rawOutput)
+}
--- /dev/null
+package io.github.aloussase.changelog.git.commands
+
+interface GitCommand<T> {
+
+ val commandLine: String
+
+ fun execute(): T
+
+}
class MarkdownChangelogParser : ChangelogParser {
companion object {
- private val RELEASE_VERSION_REGEX = Regex("## \\[(\\d+\\.\\d+\\.\\d+)]")
- private val COMMIT_REGEX = Regex("- ([\\w-]+): ([\\w ]+) \\(([\\w.]+@[\\w.]+)\\)")
+ private val RELEASE_VERSION_REGEX = Regex("## (\\[(\\d+\\.\\d+\\.\\d+|Unreleased)])")
+ private val COMMIT_REGEX = Regex("- ([\\w-]+): ([\\w :]+) \\(([\\w.]+@[\\w.]+|[\\w ]+)\\)")
private val DOC_TITLE_REGEX = Regex("# (Changelog|CHANGELOG)")
}
)
}
- val releaseVersion = releaseMatch.groupValues[1]
+ val releaseVersion = releaseMatch.groupValues[2]
val commits = arrayListOf<Commit>()
for (line in lines.subList(1, lines.size)) {