ver.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Author: NiuJiuRu
  2. // Email: niujiuru@qq.com
  3. package baseapp
  4. import (
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "strconv"
  9. "strings"
  10. )
  11. // 用32位无符号整数表示版本号, 组成格式:
  12. // [major(8bit)][minor(8bit)][patch(8bit)][build(8bit)]
  13. // 对应的字符串组成格式必须为: "x.y.z.w"
  14. type VersionCode uint32
  15. func NewVersionCode(major, minor, patch, build uint32) VersionCode {
  16. return VersionCode(major<<24 | minor<<16 | patch<<8 | build)
  17. }
  18. func (v *VersionCode) FromString(s string) error {
  19. parts := strings.Split(s, ".")
  20. if len(parts) != 4 {
  21. return fmt.Errorf("invalid version string: %s", s)
  22. }
  23. var u uint32
  24. for i, p := range parts {
  25. n, err := strconv.Atoi(p)
  26. if err != nil || n < 0 || n > 255 {
  27. return fmt.Errorf("invalid version part: %s", p)
  28. }
  29. u |= uint32(n) << uint((3-i)*8)
  30. }
  31. *v = VersionCode(u)
  32. return nil
  33. }
  34. func (v VersionCode) String() string {
  35. return fmt.Sprintf("%d.%d.%d.%d", v.Major(), v.Minor(), v.Patch(), v.Build())
  36. }
  37. func (v VersionCode) Parts() [4]uint32 {
  38. shifts := [4]uint{24, 16, 8, 0}
  39. var parts [4]uint32
  40. for i, s := range shifts {
  41. parts[i] = uint32(v>>s) & 0xFF
  42. }
  43. return parts
  44. }
  45. func (v VersionCode) Major() uint32 { return v.Parts()[0] }
  46. func (v VersionCode) Minor() uint32 { return v.Parts()[1] }
  47. func (v VersionCode) Patch() uint32 { return v.Parts()[2] }
  48. func (v VersionCode) Build() uint32 { return v.Parts()[3] }
  49. func WriteVersionFile(dir, version string) error {
  50. file := filepath.Join(dir, "version.txt")
  51. tmp := file + ".tmp"
  52. if err := os.MkdirAll(dir, 0755); err != nil {
  53. return err
  54. }
  55. if err := os.WriteFile(tmp, []byte(version+"\n"), 0644); err != nil {
  56. return err
  57. }
  58. return os.Rename(tmp, file)
  59. }