(version string, versions []string)
| 227 | } |
| 228 | |
| 229 | func FindMaxVersion(version string, versions []string) string { |
| 230 | fix := func(s string) string { |
| 231 | if i := strings.Index(s, "@"); i != -1 { |
| 232 | s = s[:i] |
| 233 | } |
| 234 | s = strings.TrimLeft(strings.TrimSpace(s), "vV") |
| 235 | // 将 ~x[.x](php范围约束) 替换为 ^x[.x](semver范围约束) |
| 236 | var fix []string |
| 237 | for sub := range strings.SplitSeq(s, ",") { |
| 238 | if strings.Contains(sub, "~") && strings.Count(sub, ".") < 2 { |
| 239 | sub = strings.ReplaceAll(sub, "~", "^") |
| 240 | } |
| 241 | fix = append(fix, sub) |
| 242 | } |
| 243 | return strings.Join(fix, ",") |
| 244 | } |
| 245 | var cs []*semver.Constraints |
| 246 | for v := range strings.SplitSeq(version, "|") { |
| 247 | c, err := semver.NewConstraint(fix(v)) |
| 248 | if err == nil { |
| 249 | cs = append(cs, c) |
| 250 | } |
| 251 | } |
| 252 | var vers []string |
| 253 | for _, v := range versions { |
| 254 | ver, err := semver.NewVersion(fix(v)) |
| 255 | if err != nil { |
| 256 | continue |
| 257 | } |
| 258 | for _, c := range cs { |
| 259 | if c.Check(ver) { |
| 260 | vers = append(vers, v) |
| 261 | break |
| 262 | } |
| 263 | } |
| 264 | } |
| 265 | sort.Slice(vers, func(i, j int) bool { |
| 266 | v1, _ := semver.NewVersion(fix(vers[i])) |
| 267 | v2, _ := semver.NewVersion(fix(vers[j])) |
| 268 | return v1.Compare(v2) > 0 |
| 269 | }) |
| 270 | if len(vers) > 0 { |
| 271 | return vers[0] |
| 272 | } |
| 273 | return version |
| 274 | } |
no test coverage detected