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 }