git_data.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright 2025 BackendServerTemplate Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package git
  5. import (
  6. "fmt"
  7. "github.com/SongZihuan/BackendServerTemplate/tool/generate/basefile"
  8. "github.com/SongZihuan/BackendServerTemplate/tool/utils/fileutils"
  9. "github.com/SongZihuan/BackendServerTemplate/tool/utils/gitutils"
  10. "github.com/SongZihuan/BackendServerTemplate/tool/utils/modutils"
  11. "strings"
  12. "sync"
  13. )
  14. var once sync.Once
  15. var lastCommit string = ""
  16. var lastTag string = ""
  17. var lastTagCommit string = ""
  18. var secondToLastTag string = ""
  19. var secondToLastTagCommit string = ""
  20. var firstCommit string = ""
  21. func InitGitData() (err error) {
  22. once.Do(func() {
  23. err = initGitData()
  24. })
  25. return err
  26. }
  27. func initGitData() (err error) {
  28. if !gitutils.HasGit() {
  29. return nil
  30. }
  31. defer func() {
  32. if err != nil {
  33. lastCommit = ""
  34. lastTag = ""
  35. lastTagCommit = ""
  36. secondToLastTag = ""
  37. secondToLastTagCommit = ""
  38. firstCommit = ""
  39. }
  40. }()
  41. lastCommit, err = gitutils.GetLastCommit()
  42. if err != nil {
  43. return err
  44. }
  45. firstCommit, err = gitutils.GetFirstCommit()
  46. if err != nil {
  47. return err
  48. }
  49. tagList, err := gitutils.GetTagListWithFilter(func(s string) bool {
  50. return strings.HasPrefix(s, "v")
  51. })
  52. if err == nil {
  53. return err
  54. }
  55. if len(tagList) > 0 {
  56. lastTag = tagList[0]
  57. lastTagCommit, err = gitutils.GetTagCommit(lastTag)
  58. if err != nil {
  59. return err
  60. }
  61. }
  62. if len(tagList) > 1 {
  63. secondToLastTag = tagList[1]
  64. secondToLastTagCommit, err = gitutils.GetTagCommit(secondToLastTag)
  65. if err != nil {
  66. return err
  67. }
  68. } else {
  69. secondToLastTag = ""
  70. secondToLastTagCommit = ""
  71. }
  72. return nil
  73. }
  74. func Version() string {
  75. _ = InitGitData()
  76. return lastTag
  77. }
  78. func WriteGitData() (err error) {
  79. _ = InitGitData()
  80. err = fileutils.Write(basefile.FileCommitDateTxt, lastCommit)
  81. if err != nil {
  82. return err
  83. }
  84. err = fileutils.Write(basefile.FileTagDataTxt, lastTag)
  85. if err != nil {
  86. return err
  87. }
  88. err = fileutils.Write(basefile.FileTagCommitData, lastTagCommit)
  89. if err != nil {
  90. return err
  91. }
  92. return nil
  93. }
  94. func GetGitHubCompareMD() string {
  95. _ = InitGitData()
  96. compare, url := GetGitHubCompareURL()
  97. if compare == "" || url == "" {
  98. return ""
  99. }
  100. return fmt.Sprintf("**Git Changelog:[%s](%s)", compare, url)
  101. }
  102. func GetGitHubCompareURL() (string, string) {
  103. _ = InitGitData()
  104. if !modutils.IsGitHub || lastTag == "" || firstCommit == lastTagCommit {
  105. return "", ""
  106. }
  107. if secondToLastTag != "" {
  108. compare := fmt.Sprintf("%s...%s", secondToLastTag, lastTag)
  109. return compare, fmt.Sprintf("https://%s/compare/%s", modutils.ModPath, compare)
  110. }
  111. return lastTag, fmt.Sprintf("https://%s/compare/%s...%s", modutils.ModPath, firstCommit, lastTag)
  112. }