MCPcopy Create free account
hub / github.com/XmirrorSecurity/OpenSCA-cli / FindMaxVersion

Function FindMaxVersion

opensca/sca/php/composer.go:229–274  ·  view source on GitHub ↗
(version string, versions []string)

Source from the content-addressed store, hash-verified

227}
228
229func 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}

Callers 1

ReadComposerRepoJsonFunction · 0.70

Calls 2

IndexMethod · 0.80
CheckMethod · 0.80

Tested by

no test coverage detected