main.go 4.4 KB

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