go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/core/resources/versions/generic/compare.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package generic
     5  
     6  import (
     7  	"errors"
     8  	"strings"
     9  
    10  	"go.mondoo.com/cnquery/providers/core/resources/versions/apk"
    11  	"go.mondoo.com/cnquery/providers/core/resources/versions/deb"
    12  	"go.mondoo.com/cnquery/providers/core/resources/versions/rpm"
    13  	"go.mondoo.com/cnquery/providers/core/resources/versions/semver"
    14  )
    15  
    16  func Compare(format, a, b string) (int, error) {
    17  	var cmp int
    18  	var err error
    19  	switch format {
    20  	case "rpm":
    21  		var parser rpm.Parser
    22  		cmp, err = parser.Compare(a, b)
    23  	case "pacman":
    24  		var parser deb.Parser
    25  		cmp, err = parser.Compare(a, b)
    26  	case "deb":
    27  		var parser deb.Parser
    28  		cmp, err = parser.Compare(a, b)
    29  	case "apk":
    30  		var parser apk.Parser
    31  		// for apk versions, we need to remove the epoch, since it is the build version for alpine
    32  		cmp, err = parser.Compare(VersionWithoutEpoch(a), VersionWithoutEpoch(b))
    33  	case "npm":
    34  		var parser semver.Parser
    35  		cmp, err = parser.Compare(a, b)
    36  	default:
    37  		err = errors.New("unsupported pkg comparison for " + format)
    38  	}
    39  	return cmp, err
    40  }
    41  
    42  func VersionWithoutEpoch(version string) string {
    43  	splitted := strings.SplitN(version, ":", 2)
    44  	if len(splitted) == 1 {
    45  		return splitted[0]
    46  	} else {
    47  		return splitted[1]
    48  	}
    49  }