Skip to content

Commit cddc13b

Browse files
authored
Merge pull request kptdev#312 from Nordix/porchctl-get-single
Fix porchctl rpkg get fails on a PR with a semantic workspace name
2 parents 07466ae + 6c1c93c commit cddc13b

4 files changed

Lines changed: 151 additions & 2 deletions

File tree

pkg/repository/repository.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,14 @@ func K8SName2PkgRevWSName(k8sNamePkg, k8sName string) string {
5858
}
5959

6060
func PkgRevK8sName2Key(k8sNamespace, k8sName string) (PackageRevisionKey, error) {
61-
parsedPRSlice := util.SplitIn3OnDelimiter(k8sName, ".")
61+
workspaceName := util.GetPRWorkspaceName(k8sName)
62+
63+
conditionedK8SName := k8sName
64+
if strings.Contains(workspaceName, ".") {
65+
conditionedK8SName = k8sName[:len(k8sName)-len(workspaceName)] + strings.ReplaceAll(workspaceName, ".", "-")
66+
}
67+
68+
parsedPRSlice := util.SplitIn3OnDelimiter(conditionedK8SName, ".")
6269
parsedPkgSlice := util.SplitIn3OnDelimiter(parsedPRSlice[0]+"."+parsedPRSlice[1], ".")
6370

6471
packagePath := strings.ReplaceAll(parsedPkgSlice[1], ".", "/")
@@ -75,7 +82,7 @@ func PkgRevK8sName2Key(k8sNamespace, k8sName string) (PackageRevisionKey, error)
7582
Path: packagePath,
7683
Package: parsedPkgSlice[2],
7784
},
78-
WorkspaceName: parsedPRSlice[2],
85+
WorkspaceName: workspaceName,
7986
}, nil
8087
}
8188

pkg/repository/repository_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package repository
1616

1717
import (
18+
"strings"
1819
"testing"
1920

2021
"github.com/stretchr/testify/assert"
@@ -173,3 +174,63 @@ func TestPackageRevisionKey(t *testing.T) {
173174
_, err = PkgRevK8sName2Key("my-ns", "")
174175
assert.NotNil(t, err)
175176
}
177+
178+
func TestGetPRWorkspaceName(t *testing.T) {
179+
_, err := PkgRevK8sName2Key("my-ns", "")
180+
assert.NotNil(t, err)
181+
assert.True(t, strings.Contains(err.Error(), "package name part \"\" of object name invalid"))
182+
183+
_, err = PkgRevK8sName2Key("my-ns", "hello")
184+
assert.NotNil(t, err)
185+
assert.True(t, strings.Contains(err.Error(), "package name part \"\" of object name invalid"))
186+
187+
prKey, err := PkgRevK8sName2Key("my-ns", "repo.hello.there")
188+
assert.Nil(t, err)
189+
assert.Equal(t, "hello", prKey.PkgKey.Package)
190+
assert.Equal(t, "", prKey.PkgKey.Path)
191+
assert.Equal(t, "there", prKey.WorkspaceName)
192+
193+
prKey, err = PkgRevK8sName2Key("my-ns", "repo..")
194+
assert.NotNil(t, err)
195+
assert.True(t, strings.Contains(err.Error(), "package name part \"\" of object name invalid"))
196+
197+
prKey, err = PkgRevK8sName2Key("my-ns", "v.")
198+
assert.NotNil(t, err)
199+
assert.True(t, strings.Contains(err.Error(), "workspace name part \"\" of package revision name invalid"))
200+
201+
prKey, err = PkgRevK8sName2Key("my-ns", "repo.hello.v1.2.3")
202+
assert.Nil(t, err)
203+
assert.Equal(t, "hello", prKey.PkgKey.Package)
204+
assert.Equal(t, "", prKey.PkgKey.Path)
205+
assert.Equal(t, "v1.2.3", prKey.WorkspaceName)
206+
207+
prKey, err = PkgRevK8sName2Key("my-ns", "repo.hello.v1.2")
208+
assert.Nil(t, err)
209+
assert.Equal(t, "hello", prKey.PkgKey.Package)
210+
assert.Equal(t, "", prKey.PkgKey.Path)
211+
assert.Equal(t, "v1.2", prKey.WorkspaceName)
212+
213+
prKey, err = PkgRevK8sName2Key("my-ns", "repo.hello.v1")
214+
assert.Nil(t, err)
215+
assert.Equal(t, "hello", prKey.PkgKey.Package)
216+
assert.Equal(t, "", prKey.PkgKey.Path)
217+
assert.Equal(t, "v1", prKey.WorkspaceName)
218+
219+
prKey, err = PkgRevK8sName2Key("my-ns", "repo.hello.v1.v1")
220+
assert.Nil(t, err)
221+
assert.Equal(t, "v1", prKey.PkgKey.Package)
222+
assert.Equal(t, "hello", prKey.PkgKey.Path)
223+
assert.Equal(t, "v1", prKey.WorkspaceName)
224+
225+
prKey, err = PkgRevK8sName2Key("my-ns", "repo.hello.v1.2.3.v4.5.6")
226+
assert.Nil(t, err)
227+
assert.Equal(t, "3", prKey.PkgKey.Package)
228+
assert.Equal(t, "hello/v1/2", prKey.PkgKey.Path)
229+
assert.Equal(t, "v4.5.6", prKey.WorkspaceName)
230+
231+
prKey, err = PkgRevK8sName2Key("my-ns", "repo.hello.v1.2.3.end")
232+
assert.Nil(t, err)
233+
assert.Equal(t, "3", prKey.PkgKey.Package)
234+
assert.Equal(t, "hello/v1/2", prKey.PkgKey.Path)
235+
assert.Equal(t, "end", prKey.WorkspaceName)
236+
}

pkg/util/util.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"os"
2323
"path/filepath"
2424
"reflect"
25+
"regexp"
2526
"slices"
2627
"strings"
2728

@@ -229,6 +230,18 @@ func validPkgNamePart(repoName, path, packageName string) []string {
229230
return errSlice
230231
}
231232

233+
func GetPRWorkspaceName(k8sName string) string {
234+
if !strings.Contains(k8sName, ".") {
235+
return ""
236+
}
237+
238+
if semverFound, _ := regexp.MatchString("\\.v[0-9\\.]*[0-9]$", k8sName); semverFound {
239+
return k8sName[strings.LastIndex(k8sName, ".v")+1:]
240+
} else {
241+
return k8sName[strings.LastIndex(k8sName, ".")+1:]
242+
}
243+
}
244+
232245
func SplitIn3OnDelimiter(splitee, delimiter string) []string {
233246
splitSlice := make([]string, 3)
234247

pkg/util/util_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,74 @@ import (
2828
"k8s.io/apimachinery/pkg/types"
2929
)
3030

31+
func TestGetPRWorkspaceName(t *testing.T) {
32+
wsName := GetPRWorkspaceName("")
33+
assert.Equal(t, "", wsName)
34+
35+
wsName = GetPRWorkspaceName("hello")
36+
assert.Equal(t, "", wsName)
37+
38+
wsName = GetPRWorkspaceName("hello.there")
39+
assert.Equal(t, "there", wsName)
40+
41+
wsName = GetPRWorkspaceName(".")
42+
assert.Equal(t, "", wsName)
43+
44+
wsName = GetPRWorkspaceName("v.")
45+
assert.Equal(t, "", wsName)
46+
47+
wsName = GetPRWorkspaceName("hello.v1.2.3")
48+
assert.Equal(t, "v1.2.3", wsName)
49+
50+
wsName = GetPRWorkspaceName("hello.v1.2")
51+
assert.Equal(t, "v1.2", wsName)
52+
53+
wsName = GetPRWorkspaceName("hello.v1")
54+
assert.Equal(t, "v1", wsName)
55+
56+
wsName = GetPRWorkspaceName("hello.v1.v1")
57+
assert.Equal(t, "v1", wsName)
58+
59+
wsName = GetPRWorkspaceName("hello.v1.2.3.v4.5.6")
60+
assert.Equal(t, "v4.5.6", wsName)
61+
62+
wsName = GetPRWorkspaceName("hello.v1.2.3.end")
63+
assert.Equal(t, "end", wsName)
64+
65+
wsName = GetPRWorkspaceName("repo.")
66+
assert.Equal(t, "", wsName)
67+
68+
wsName = GetPRWorkspaceName("repo.hello")
69+
assert.Equal(t, "hello", wsName)
70+
71+
wsName = GetPRWorkspaceName("repo.hello.there")
72+
assert.Equal(t, "there", wsName)
73+
74+
wsName = GetPRWorkspaceName(".")
75+
assert.Equal(t, "", wsName)
76+
77+
wsName = GetPRWorkspaceName("repo.v.")
78+
assert.Equal(t, "", wsName)
79+
80+
wsName = GetPRWorkspaceName("repo.hello.v1.2.3")
81+
assert.Equal(t, "v1.2.3", wsName)
82+
83+
wsName = GetPRWorkspaceName("repo.hello.v1.2")
84+
assert.Equal(t, "v1.2", wsName)
85+
86+
wsName = GetPRWorkspaceName("repo.hello.v1")
87+
assert.Equal(t, "v1", wsName)
88+
89+
wsName = GetPRWorkspaceName("repo.hello.v1.v1")
90+
assert.Equal(t, "v1", wsName)
91+
92+
wsName = GetPRWorkspaceName("repo.hello.v1.2.3.v4.5.6")
93+
assert.Equal(t, "v4.5.6", wsName)
94+
95+
wsName = GetPRWorkspaceName("repo.hello.v1.2.3.end")
96+
assert.Equal(t, "end", wsName)
97+
}
98+
3199
func TestParseRepositoryNameOK(t *testing.T) {
32100
testCases := map[string]struct {
33101
pkgRevId string

0 commit comments

Comments
 (0)