@@ -159,18 +159,49 @@ func (dg DefaultGitter) CheckGitRepo(dir string) (repo string, err error) {
159159// with or without a leading "v".
160160var reMatchSemver = regexp .MustCompile (`^v?[0-9]+(?:\.[0-9]+)?(?:\.[0-9]+)?$` )
161161
162- func semverKey (tag string ) [3 ]int {
163- var key [3 ]int
162+ func normalizeNumericString (s string ) string {
163+ s = strings .TrimLeft (s , "0" )
164+ if s == "" {
165+ return "0"
166+ }
167+ return s
168+ }
169+
170+ func compareNumericStrings (a , b string ) int {
171+ a = normalizeNumericString (a )
172+ b = normalizeNumericString (b )
173+ if len (a ) != len (b ) {
174+ if len (a ) > len (b ) {
175+ return 1
176+ }
177+ return - 1
178+ }
179+ if a == b {
180+ return 0
181+ }
182+ if a > b {
183+ return 1
184+ }
185+ return - 1
186+ }
187+
188+ func semverPart (tag string , index int ) string {
164189 core := strings .TrimPrefix (tag , "v" )
165190 parts := strings .Split (core , "." )
166- for i := 0 ; i < len (parts ) && i < len (key ); i ++ {
167- n , err := strconv .Atoi (parts [i ])
168- if err != nil {
169- break
191+ if index >= 0 && index < len (parts ) {
192+ return parts [index ]
193+ }
194+ return "0"
195+ }
196+
197+ func semverGreater (leftTag , rightTag string ) bool {
198+ for idx := 0 ; idx < 3 ; idx ++ {
199+ cmp := compareNumericStrings (semverPart (leftTag , idx ), semverPart (rightTag , idx ))
200+ if cmp != 0 {
201+ return cmp > 0
170202 }
171- key [i ] = n
172203 }
173- return key
204+ return false
174205}
175206
176207// GetTags returns all tags, sorted by version descending.
@@ -186,14 +217,7 @@ func (dg DefaultGitter) GetTags(repo string) (tags []string, err error) {
186217 // Git's multi-pattern listing can interleave v-prefixed and non-prefixed
187218 // tags in a way that is not globally version-sorted. Normalize here.
188219 sort .SliceStable (tags , func (i , j int ) bool {
189- left := semverKey (tags [i ])
190- right := semverKey (tags [j ])
191- for idx := range left {
192- if left [idx ] != right [idx ] {
193- return left [idx ] > right [idx ]
194- }
195- }
196- return false
220+ return semverGreater (tags [i ], tags [j ])
197221 })
198222 }
199223 return
0 commit comments