main.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "os"
  7. "os/exec"
  8. "strconv"
  9. )
  10. func main() {
  11. versionFile := "version"
  12. b, err := os.ReadFile(versionFile)
  13. if err != nil {
  14. if os.IsNotExist(err) {
  15. file, err := os.OpenFile(versionFile, os.O_RDWR|os.O_CREATE, 0777)
  16. if err != nil {
  17. fmt.Printf("create file %s error: %v\n", versionFile, err)
  18. os.Exit(1)
  19. }
  20. defer file.Close()
  21. file.WriteString("v1.0.0") // 初始版本
  22. cmd := exec.Command("git", "add", versionFile)
  23. err = cmd.Run()
  24. if err != nil {
  25. fmt.Printf("git add %s error: %v\n", versionFile, err)
  26. os.Exit(1)
  27. }
  28. return // 正常返回
  29. } else {
  30. fmt.Printf("read file ./version error: %v\n", err)
  31. os.Exit(1)
  32. }
  33. }
  34. file, err := os.OpenFile(versionFile, os.O_RDWR|os.O_TRUNC, 0777)
  35. if err != nil {
  36. fmt.Println(err)
  37. return
  38. }
  39. defer file.Close()
  40. bs := bytes.Split(b, []byte{'.'})
  41. lb := bs[len(bs)-1]
  42. i, err := strconv.Atoi(string(lb))
  43. if err != nil {
  44. fmt.Println(err)
  45. return
  46. }
  47. bs[len(bs)-1] = []byte(fmt.Sprintf("%d", i+1))
  48. tb := bytes.Join(bs, []byte{'.'})
  49. _, err = file.Write(tb)
  50. if err != nil {
  51. fmt.Println("write new version error:", err)
  52. os.Exit(1)
  53. }
  54. cmd := exec.Command("git", "add", versionFile)
  55. err = cmd.Run()
  56. if err != nil {
  57. fmt.Printf("git add %s error: %v\n", versionFile, err)
  58. os.Exit(1)
  59. }
  60. fmt.Printf("from version %s to %s\n", string(b), string(tb))
  61. // Windows编译版本文件
  62. winVersionFile := "./versioninfo.json"
  63. _, err = os.Stat(winVersionFile)
  64. var exist bool
  65. if err != nil {
  66. if !os.IsNotExist(err) {
  67. fmt.Printf("stat file %s error: %v\n", winVersionFile, err)
  68. os.Exit(1)
  69. } else {
  70. fmt.Println("xxxxxxxxx 无 ", winVersionFile)
  71. return // 正常返回
  72. }
  73. } else {
  74. exist = true
  75. }
  76. if exist {
  77. winB, err := os.ReadFile(winVersionFile)
  78. if err != nil {
  79. fmt.Println("open ", winVersionFile, "error: ", err)
  80. os.Exit(1)
  81. }
  82. buffer := new(bytes.Buffer)
  83. if err := json.Compact(buffer, winB); err != nil {
  84. fmt.Println("json.Compact error: ", err)
  85. os.Exit(1)
  86. }
  87. var winV windowsVersion
  88. err = json.Unmarshal(buffer.Bytes(), &winV)
  89. if err != nil {
  90. fmt.Println("invalid format of Windows version info: ", err, string(winB))
  91. os.Exit(1)
  92. }
  93. winV.StringFileInfo.ProductVersion = string(tb)
  94. file1, _ := os.OpenFile(winVersionFile, os.O_RDWR|os.O_TRUNC, 0777)
  95. defer file1.Close()
  96. vb, _ := json.MarshalIndent(winV, "", " ")
  97. _, err = file1.Write(vb)
  98. if err != nil {
  99. fmt.Println("write new windows version error: ", err)
  100. os.Exit(1)
  101. }
  102. cmd2 := exec.Command("git", "add", winVersionFile)
  103. err = cmd2.Run()
  104. if err != nil {
  105. fmt.Printf("git add %s error: %v\n", winVersionFile, err)
  106. os.Exit(1)
  107. }
  108. }
  109. }
  110. type windowsVersion struct {
  111. FixedFileInfo struct {
  112. FileVersion struct {
  113. Major int
  114. Minor int
  115. Patch int
  116. Build int
  117. }
  118. ProductVersion struct {
  119. Major int
  120. Minor int
  121. Patch int
  122. Build int
  123. }
  124. FileFlagsMask string
  125. FileFlags string
  126. FileOS string
  127. FileType string
  128. FileSubType string
  129. }
  130. StringFileInfo struct {
  131. Comments string
  132. CompanyName string
  133. FileDescription string
  134. FileVersion string
  135. InternalName string
  136. LegalCopyright string
  137. LegalTrademarks string
  138. OriginalFilename string
  139. PrivateBuild string
  140. ProductName string
  141. ProductVersion string
  142. SpecialBuild string
  143. }
  144. VarFileInfo struct {
  145. Translation struct {
  146. LangID string
  147. CharsetID string
  148. }
  149. }
  150. IconPath string
  151. ManifestPath string
  152. }