-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathversion.go
More file actions
121 lines (100 loc) · 2.16 KB
/
version.go
File metadata and controls
121 lines (100 loc) · 2.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package versionobject
import (
"errors"
"fmt"
"strconv"
"strings"
)
type Version struct {
Major int
Minor int
Patch int
Prefix string
Namespace string
}
func ParseVersion(v string) (*Version, error) {
const (
minParts = 1
numberPartsNeedLength = 3
)
parts := strings.Split(v, "/")
if len(parts) < minParts {
return nil, errors.New("version string too short")
}
numberParts := strings.Split(parts[len(parts)-1], ".")
if len(numberParts) != numberPartsNeedLength {
return nil, errors.New("invalid version")
}
prefix, major, minor, patch, err := parseNumbers(numberParts)
if err != nil {
return nil, err
}
return &Version{
Major: major,
Minor: minor,
Patch: patch,
Prefix: prefix,
Namespace: strings.Join(parts[0:len(parts)-1], "/"),
}, nil
}
func (v *Version) UpMajor() *Version {
major := v.Major
major++
return &Version{
Major: major,
Minor: 0,
Patch: 0,
Prefix: v.Prefix,
Namespace: v.Namespace,
}
}
func (v *Version) UpMinor() *Version {
minor := v.Minor
minor++
return &Version{
Major: v.Major,
Minor: minor,
Patch: 0,
Prefix: v.Prefix,
Namespace: v.Namespace,
}
}
func (v *Version) UpPatch() *Version {
patch := v.Patch
patch++
return &Version{
Major: v.Major,
Minor: v.Minor,
Patch: patch,
Prefix: v.Prefix,
Namespace: v.Namespace,
}
}
func (v *Version) String() string {
namespace := ""
if v.Namespace != "" {
namespace = v.Namespace + "/"
}
return fmt.Sprintf("%s%s%d.%d.%d", namespace, v.Prefix, v.Major, v.Minor, v.Patch)
}
func parseNumbers(parts []string) (string, int, int, int, error) {
majorStr := parts[0]
prefix := ""
if majorStr[0] == 'v' {
prefix = "v"
majorStr = majorStr[1:]
}
major, err := strconv.Atoi(majorStr)
if err != nil {
return "", 0, 0, 0, fmt.Errorf("invalid major version: %w", err)
}
minor, err := strconv.Atoi(parts[1])
if err != nil {
return "", 0, 0, 0, fmt.Errorf("invalid minor version: %w", err)
}
patch, err := strconv.Atoi(parts[2])
if err != nil {
return "", 0, 0, 0, fmt.Errorf("invalid patch version: %w", err)
}
return prefix, major, minor, patch, nil
}