GenerateChangelogTask.kt 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package org.mjdev.gradle.tasks
  2. import org.gradle.api.DefaultTask
  3. import org.gradle.api.tasks.Input
  4. import org.gradle.api.tasks.TaskAction
  5. import java.io.ByteArrayOutputStream
  6. @Suppress("DEPRECATION")
  7. open class GenerateChangelogTask : DefaultTask() {
  8. @Input
  9. var appName: String = ""
  10. @Input
  11. var versionName: String = ""
  12. @Input
  13. var tagPrefix: String = ""
  14. get() = field.lowercase()
  15. private val buildType: String
  16. get() = if (tagPrefix == "development") "debug" else "release"
  17. @TaskAction
  18. fun generate() {
  19. // Retrieve all tags sorted by date, latest first
  20. val tagsCommand = listOf("git", "tag", "--sort=-committerdate")
  21. val tagsOutput = execAndGetOutput(tagsCommand)
  22. val tags = tagsOutput.split("\n")
  23. // Extracting the two most recent tags
  24. val currentVersion = tags.first()
  25. val previousVersion = tags.last()
  26. // Getting changes between the latest and previous version tags
  27. val changes = execAndGetOutput(listOf(
  28. "git",
  29. "log",
  30. "--pretty=format:%s <%an>",
  31. "$previousVersion..$currentVersion"
  32. ))
  33. println("Changes between $previousVersion and $currentVersion:\n$changes")
  34. var features = "Features:\n"
  35. var fixes = "Fixes:\n"
  36. var improvements = "Improvements:\n"
  37. changes.lineSequence().forEach { line ->
  38. val parts = line.split(":", limit = 2)
  39. val prefix = parts.getOrNull(0) ?: ""
  40. val rest = parts.getOrNull(1) ?: ""
  41. when {
  42. prefix.startsWith("ft") -> features += "$rest\n"
  43. prefix.startsWith("fi") -> fixes += "$rest\n"
  44. prefix.startsWith("im") -> improvements += "$rest\n"
  45. }
  46. }
  47. val header = "Changelog from $previousVersion to $currentVersion\n\n"
  48. val changelog = header + features + "\n" + fixes + "\n" + improvements
  49. val fileName = "${appName}-${versionName}-$tagPrefix"
  50. val changelogDir = project.file("./build/outputs/apk/$buildType")
  51. val changelogFilePath = "$changelogDir/CHANGELOG-$fileName.md"
  52. println("Changelog file path: $changelogFilePath")
  53. // Ensure the directory exists
  54. changelogDir.mkdirs()
  55. // Create and write to the changelog file
  56. val changelogFile = project.file(changelogFilePath)
  57. changelogFile.createNewFile()
  58. changelogFile.writeText(changelog)
  59. println(changelog)
  60. }
  61. private fun execAndGetOutput(command: List<String>): String {
  62. val outputStream = ByteArrayOutputStream()
  63. project.providers.exec {
  64. commandLine(command)
  65. standardOutput = outputStream
  66. }
  67. return String(outputStream.toByteArray(), Charsets.UTF_8).trim()
  68. }
  69. }