application
}
-dependencies {
+changelog {
+ format = "markdown"
+ outputFileName = "CHANGELOG.md"
+
+ git {
+ baseBranch = "master"
+ }
}
application {
package io.github.aloussase.changelog
+import io.github.aloussase.changelog.config.ChangelogPluginExtension
+import io.github.aloussase.changelog.config.Config
import org.gradle.api.Plugin
import org.gradle.api.Project
class ChangelogPlugin : Plugin<Project> {
override fun apply(project: Project) {
+ val extension = project.extensions.create("changelog", ChangelogPluginExtension::class.java)
+
+ extension.gitInfo.baseBranch.convention("master")
+ extension.format.convention("markdown")
+
project.tasks.register("changelog") {
+ val config = Config.from(extension)
+ println(config)
}
}
}
--- /dev/null
+package io.github.aloussase.changelog.config
+
+import org.gradle.api.Action
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Nested
+
+abstract class ChangelogPluginExtension {
+ @get:Nested
+ abstract val gitInfo: GitInfo;
+
+ abstract val format: Property<String>
+
+ abstract val outputFileName: Property<String>
+
+ fun git(action: Action<GitInfo>) = action.execute(gitInfo)
+}
--- /dev/null
+package io.github.aloussase.changelog.config
+
+import io.github.aloussase.changelog.formats.DocumentFormat
+import org.gradle.api.GradleException
+
+data class Config(
+ val outputFileName: String,
+ val gitBranch: String,
+ val documentFormat: DocumentFormat,
+) {
+ companion object {
+ fun from(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()}")
+ }
+
+ val branchName = extension.gitInfo.baseBranch.get()
+ if (branchName.isBlank()) {
+ throw GradleException("Branch name cannot be blank")
+ }
+
+ val outputFileName = extension.outputFileName.get()
+ if (outputFileName.isBlank()) {
+ throw GradleException("Output file name cannot be blank")
+ }
+
+ return Config(
+ outputFileName,
+ branchName,
+ format
+ )
+ }
+ }
+}
--- /dev/null
+package io.github.aloussase.changelog.config
+
+import org.gradle.api.provider.Property
+
+interface GitInfo {
+
+ val baseBranch: Property<String>
+
+}
--- /dev/null
+package io.github.aloussase.changelog.formats
+
+enum class DocumentFormat {
+ Markdown;
+
+ companion object {
+ fun parse(format: String): DocumentFormat? {
+ return when (format) {
+ "markdown", "md" -> Markdown
+ else -> null
+ }
+ }
+ }
+}