123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- package main
- import (
- "bytes"
- "encoding/json"
- "flag"
- "fmt"
- "os"
- "os/exec"
- "strconv"
- )
- func main() {
- tagversion := flag.String("tagversion", "", "tag a version")
- flag.Parse()
- found := false
- flag.Visit(func(f *flag.Flag) {
- if f.Name == "tagversion" {
- found = true
- }
- })
- versionFile := "version"
- if found { // 将版本打上一个tag
- fmt.Println("tagging a version", *tagversion)
- version, err := os.ReadFile(versionFile)
- if err != nil {
- fmt.Printf("version file %s error: %v\n", versionFile, err)
- os.Exit(1)
- }
- if len(version) == 0 {
- fmt.Printf("version file %s empty\n", versionFile)
- os.Exit(1)
- }
- fmt.Println("version is: ", string(version))
- cmd := exec.Command("git", "tag", string(version), "-f")
- err = cmd.Run()
- if err != nil {
- fmt.Printf("git tag %s error: %v\n", string(version), err)
- os.Exit(1)
- }
- cmd = exec.Command("git", "push", "origin", "--tags")
- err = cmd.Run()
- if err != nil {
- fmt.Printf("git push tag error: %v\n", err)
- os.Exit(1)
- }
- return
- }
- // 修改版本并添加
- b, err := os.ReadFile(versionFile)
- if err != nil {
- if os.IsNotExist(err) {
- file, err := os.OpenFile(versionFile, os.O_RDWR|os.O_CREATE, 0777)
- if err != nil {
- fmt.Printf("create file %s error: %v\n", versionFile, err)
- os.Exit(1)
- }
- defer file.Close()
- file.WriteString("v1.0.0") // 初始版本
- cmd := exec.Command("git", "add", versionFile)
- err = cmd.Run()
- if err != nil {
- fmt.Printf("git add %s error: %v\n", versionFile, err)
- os.Exit(1)
- }
- return // 正常返回
- } else {
- fmt.Printf("read file ./version error: %v\n", err)
- os.Exit(1)
- }
- }
- file, err := os.OpenFile(versionFile, os.O_RDWR|os.O_TRUNC, 0777)
- if err != nil {
- fmt.Println(err)
- return
- }
- defer file.Close()
- bs := bytes.Split(b, []byte{'.'})
- lb := bs[len(bs)-1]
- i, err := strconv.Atoi(string(lb))
- if err != nil {
- fmt.Println(err)
- return
- }
- bs[len(bs)-1] = []byte(fmt.Sprintf("%d", i+1))
- tb := bytes.Join(bs, []byte{'.'})
- _, err = file.Write(tb)
- if err != nil {
- fmt.Println("write new version error:", err)
- os.Exit(1)
- }
- cmd := exec.Command("git", "add", versionFile)
- err = cmd.Run()
- if err != nil {
- fmt.Printf("git add %s error: %v\n", versionFile, err)
- os.Exit(1)
- }
- fmt.Printf("from version %s to %s\n", string(b), string(tb))
- // Windows编译版本文件
- winVersionFile := "./versioninfo.json"
- _, err = os.Stat(winVersionFile)
- var exist bool
- if err != nil {
- if !os.IsNotExist(err) {
- fmt.Printf("stat file %s error: %v\n", winVersionFile, err)
- os.Exit(1)
- } else {
- fmt.Println("xxxxxxxxx 无 ", winVersionFile)
- return // 正常返回
- }
- } else {
- exist = true
- }
- if exist {
- winB, err := os.ReadFile(winVersionFile)
- if err != nil {
- fmt.Println("open ", winVersionFile, "error: ", err)
- os.Exit(1)
- }
- buffer := new(bytes.Buffer)
- if err := json.Compact(buffer, winB); err != nil {
- fmt.Println("json.Compact error: ", err)
- os.Exit(1)
- }
- var winV windowsVersion
- err = json.Unmarshal(buffer.Bytes(), &winV)
- if err != nil {
- fmt.Println("invalid format of Windows version info: ", err, string(winB))
- os.Exit(1)
- }
- winV.StringFileInfo.ProductVersion = string(tb)
- file1, _ := os.OpenFile(winVersionFile, os.O_RDWR|os.O_TRUNC, 0777)
- defer file1.Close()
- vb, _ := json.MarshalIndent(winV, "", " ")
- _, err = file1.Write(vb)
- if err != nil {
- fmt.Println("write new windows version error: ", err)
- os.Exit(1)
- }
- cmd2 := exec.Command("git", "add", winVersionFile)
- err = cmd2.Run()
- if err != nil {
- fmt.Printf("git add %s error: %v\n", winVersionFile, err)
- os.Exit(1)
- }
- }
- }
- type windowsVersion struct {
- FixedFileInfo struct {
- FileVersion struct {
- Major int
- Minor int
- Patch int
- Build int
- }
- ProductVersion struct {
- Major int
- Minor int
- Patch int
- Build int
- }
- FileFlagsMask string
- FileFlags string
- FileOS string
- FileType string
- FileSubType string
- }
- StringFileInfo struct {
- Comments string
- CompanyName string
- FileDescription string
- FileVersion string
- InternalName string
- LegalCopyright string
- LegalTrademarks string
- OriginalFilename string
- PrivateBuild string
- ProductName string
- ProductVersion string
- SpecialBuild string
- }
- VarFileInfo struct {
- Translation struct {
- LangID string
- CharsetID string
- }
- }
- IconPath string
- ManifestPath string
- }
|