|
4 | 4 | "errors"
|
5 | 5 | "fmt"
|
6 | 6 | "sort"
|
| 7 | + "strconv" |
| 8 | + "strings" |
7 | 9 |
|
8 | 10 | goversion "github.com/hashicorp/go-version"
|
9 | 11 | "github.com/pelletier/go-toml"
|
@@ -335,8 +337,38 @@ func getNextVersion(x map[string]configMigrationFunc) string {
|
335 | 337 | keys[i] = k
|
336 | 338 | i++
|
337 | 339 | }
|
338 |
| - sort.Strings(keys) |
339 |
| - requiredFunc := x[keys[len(keys)-1]] |
| 340 | + // sorting keys (versions) |
| 341 | + // each key is in format "x.x.x". Normal sort won't work if the versions |
| 342 | + // don't have same number of digits, for example 1.02.10 and 1.2.9 |
| 343 | + // so, we need a custom sort |
| 344 | + sort.Slice(keys, func(i, j int) bool { |
| 345 | + v1 := keys[i] |
| 346 | + v2 := keys[j] |
| 347 | + v1Parts := strings.Split(v1, ".") |
| 348 | + v2Parts := strings.Split(v2, ".") |
| 349 | + if len(v1Parts) > len(v2Parts) { |
| 350 | + return true |
| 351 | + } else if len(v1Parts) < len(v2Parts) { |
| 352 | + return false |
| 353 | + } |
| 354 | + for i := 0; i < len(v1Parts); i++ { |
| 355 | + n1, err1 := strconv.ParseInt(v1Parts[i], 10, 32) |
| 356 | + if err1 != nil { |
| 357 | + panic("wrong version format") |
| 358 | + } |
| 359 | + n2, err2 := strconv.ParseInt(v2Parts[i], 10, 32) |
| 360 | + if err2 != nil { |
| 361 | + panic("wrong version format") |
| 362 | + } |
| 363 | + if n1 > n2 { |
| 364 | + return true |
| 365 | + } else if n1 < n2 { |
| 366 | + return false |
| 367 | + } |
| 368 | + } |
| 369 | + return false |
| 370 | + }) |
| 371 | + requiredFunc := x[keys[0]] |
340 | 372 | tree = requiredFunc(tree)
|
341 | 373 | return tree.Get("Version").(string)
|
342 | 374 | }
|
0 commit comments