git.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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 main
  5. import (
  6. "github.com/SongZihuan/BackendServerTemplate/tool/global"
  7. "github.com/SongZihuan/BackendServerTemplate/tool/utils/fileutils"
  8. "github.com/SongZihuan/BackendServerTemplate/tool/utils/gitutils"
  9. "log"
  10. "strings"
  11. "sync"
  12. )
  13. const filePatchFile = "update.patch" + global.FileIgnoreExt
  14. var onceGitInfo sync.Once
  15. var toCommit string = ""
  16. var fromCommit string = ""
  17. var excludes = []string{
  18. // 配置文件
  19. "VERSION",
  20. "REPORT",
  21. "NAME",
  22. "LICENSE",
  23. "ENV_PREFIX",
  24. // 服务配置文件
  25. "SERVICE.yaml",
  26. // 文档
  27. "SECURITY.md",
  28. "README.md",
  29. "CONTRIBUTORS.md",
  30. "CONTRIBUTING.md",
  31. "CODE_OF_CONDUCT.md",
  32. "CHANGELOG_SPECIFICATION.md",
  33. "CHANGELOG.md",
  34. "dev-git-hooks/",
  35. }
  36. func InitGitData() (err error) {
  37. onceGitInfo.Do(func() {
  38. err = initGitData()
  39. })
  40. return err
  41. }
  42. func initGitData() (err error) {
  43. if !gitutils.HasGit() {
  44. log.Println("generate patch: `.git` not found, get git info skip")
  45. return nil
  46. }
  47. log.Println("generate patch: get git info")
  48. defer log.Println("generate patch: get git info finish")
  49. defer func() {
  50. if err != nil {
  51. toCommit = ""
  52. fromCommit = ""
  53. }
  54. }()
  55. tagList, err := gitutils.GetTagListWithFilter(func(s string) bool {
  56. return strings.HasPrefix(s, "v")
  57. })
  58. if err != nil {
  59. return err
  60. }
  61. log.Printf("generate patch: get git tag list length: %d\n", len(tagList))
  62. if len(tagList) == 0 {
  63. toCommit, err = gitutils.GetLastCommit()
  64. if err != nil {
  65. return err
  66. }
  67. log.Printf("generate patch: get git to commit: %s\n", toCommit)
  68. fromCommit, err = gitutils.GetFirstCommit()
  69. if err != nil {
  70. return err
  71. }
  72. log.Printf("generate patch: get git from commit: %s\n", fromCommit)
  73. } else if len(tagList) == 1 {
  74. toCommit, err = gitutils.GetTagCommit(tagList[0])
  75. if err != nil {
  76. return err
  77. }
  78. log.Printf("generate patch: get git to commist (from tag '%s') : %s\n", tagList[0], toCommit)
  79. fromCommit, err = gitutils.GetFirstCommit()
  80. if err != nil {
  81. return err
  82. }
  83. log.Printf("generate patch: get git from commit: %s\n", fromCommit)
  84. } else if len(tagList) >= 2 {
  85. toCommit, err = gitutils.GetTagCommit(tagList[0])
  86. if err != nil {
  87. return err
  88. }
  89. log.Printf("generate patch: get git to commist (from tag '%s') : %s\n", tagList[0], toCommit)
  90. fromCommit, err = gitutils.GetTagCommit(tagList[1])
  91. if err != nil {
  92. return err
  93. }
  94. log.Printf("generate patch: get git from commist (from tag '%s') : %s\n", tagList[1], toCommit)
  95. } else {
  96. panic("unreachable")
  97. }
  98. return nil
  99. }
  100. func CreatePatch() error {
  101. err := InitGitData()
  102. if err != nil {
  103. return err
  104. }
  105. if !gitutils.HasGit() {
  106. return nil
  107. }
  108. log.Println("generate patch: create patch file")
  109. defer log.Println("generate patch: create patch file")
  110. if fromCommit == toCommit {
  111. log.Println("generate patch: only one commit, skip to create patch file")
  112. return fileutils.WriteEmpty(filePatchFile)
  113. }
  114. res, err := gitutils.GetPatch(fromCommit, toCommit, excludes...)
  115. if err != nil {
  116. return err
  117. }
  118. return fileutils.WriteBytes(filePatchFile, res)
  119. }