diff --git a/pkg/dashboard/utils/utils.go b/pkg/dashboard/utils/utils.go index 363c9b8..7302a9d 100644 --- a/pkg/dashboard/utils/utils.go +++ b/pkg/dashboard/utils/utils.go @@ -3,13 +3,15 @@ package utils import ( "bytes" "errors" - "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" "io/ioutil" "os" "os/exec" + "regexp" "strconv" "strings" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" ) var FailLogLevel = log.WarnLevel // allows to suppress error logging in some situations @@ -17,12 +19,19 @@ var FailLogLevel = log.WarnLevel // allows to suppress error logging in some sit type ControlChan = chan struct{} func ChartAndVersion(x string) (string, string, error) { - lastInd := strings.LastIndex(x, "-") - if lastInd < 0 { + strs := strings.Split(x, "-") + lens := len(strs) + if lens < 2 { return "", "", errors.New("can't parse chart version string") + } else if lens == 2 { + return strs[0], strs[1], nil + } else { + // semver2 regex , add optional v prefix + re := regexp.MustCompile(`v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?`) + match := re.FindString(x) + lastInd := strings.LastIndex(x, match) + return x[:lastInd-1], match, nil } - - return x[:lastInd], x[lastInd+1:], nil } func TempFile(txt string) (string, func(), error) { diff --git a/pkg/dashboard/utils/utils_test.go b/pkg/dashboard/utils/utils_test.go index 20dea41..126356c 100644 --- a/pkg/dashboard/utils/utils_test.go +++ b/pkg/dashboard/utils/utils_test.go @@ -1,9 +1,10 @@ package utils import ( - "github.com/gin-gonic/gin" "net/http/httptest" "testing" + + "github.com/gin-gonic/gin" ) func TestGetQueryProps(t *testing.T) { @@ -69,6 +70,27 @@ func TestChartAndVersion(t *testing.T) { wantVer: "1.0.0", wantError: false, }, + { + name: "Chart and version - successfully parsing chart and version", + params: "chart-v1.0.0", + wantChart: "chart", + wantVer: "v1.0.0", + wantError: false, + }, + { + name: "Chart and version - successfully parsing chart and version", + params: "chart-v1.0.0-alpha", + wantChart: "chart", + wantVer: "v1.0.0-alpha", + wantError: false, + }, + { + name: "Chart and version - successfully parsing chart and version", + params: "chart-1.0.0-alpha", + wantChart: "chart", + wantVer: "1.0.0-alpha", + wantError: false, + }, { name: "Chart and version - parsing chart without version", params: "chart",