Skip to content

Commit c58af0b

Browse files
feat: add slug to plugin info
1 parent feb827a commit c58af0b

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

pkg/plugin/plugin.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type PluginInfo struct {
2020
ShortNormalizedName string
2121
Constraint *semver.Constraints
2222
Resolver string
23+
RepoSlug string
2324
PluginPath string
2425
BinPath string
2526
}
@@ -42,14 +43,17 @@ func normalizedPluginType(t string) string {
4243
return ""
4344
}
4445

46+
var nameNormalizer = strings.NewReplacer(":", "-", "/", "-")
47+
4548
func GetPluginInfo(pluginType, pluginName string) (*PluginInfo, error) {
4649
nPluginType := normalizedPluginType(pluginType)
4750
if nPluginType == "" {
4851
return nil, fmt.Errorf("invalid plugin type: %s", pluginType)
4952
}
5053
resolver := "default"
54+
repoSlug := ""
5155
name := pluginName
52-
normalizedName := fmt.Sprintf("%s-%s", nPluginType, pluginName)
56+
normalizedName := nameNormalizer.Replace(fmt.Sprintf("%s-%s", nPluginType, pluginName))
5357

5458
if strings.Contains(name, ":") {
5559
parts := strings.Split(name, ":")
@@ -58,16 +62,20 @@ func GetPluginInfo(pluginType, pluginName string) (*PluginInfo, error) {
5862
}
5963
resolver = parts[0]
6064
name = parts[1]
61-
normalizedName = strings.ReplaceAll(normalizedName, ":", "-")
6265
}
6366

6467
if strings.Contains(name, "/") {
65-
parts := strings.Split(name, "/")
66-
if len(parts) != 2 {
67-
return nil, fmt.Errorf("invalid plugin name format")
68+
slashParts := strings.Split(name, "/")
69+
pName := slashParts[len(slashParts)-1]
70+
// remove version constraint from the slug
71+
if strings.Contains(pName, "@") {
72+
nameWithoutVersion, _, _ := strings.Cut(pName, "@")
73+
repoSlug = strings.Join(slashParts[:len(slashParts)-1], "/") + "/" + nameWithoutVersion
74+
} else {
75+
repoSlug = name
6876
}
69-
name = parts[1]
70-
normalizedName = strings.ReplaceAll(normalizedName, "/", "-")
77+
// the last part is the plugin name
78+
name = pName
7179
}
7280

7381
var constraint *semver.Constraints
@@ -82,7 +90,10 @@ func GetPluginInfo(pluginType, pluginName string) (*PluginInfo, error) {
8290
}
8391
name = parts[0]
8492
constraint = v
85-
normalizedName, _, _ = strings.Cut(normalizedName, "@")
93+
94+
// remove version constraint from the normalized name
95+
normalizedParts := strings.Split(normalizedName, "@")
96+
normalizedName = strings.Join(normalizedParts[:len(normalizedParts)-1], "@")
8697
}
8798

8899
return &PluginInfo{
@@ -92,5 +103,6 @@ func GetPluginInfo(pluginType, pluginName string) (*PluginInfo, error) {
92103
ShortNormalizedName: fmt.Sprintf("%s-%s", nPluginType, name),
93104
Constraint: constraint,
94105
Resolver: resolver,
106+
RepoSlug: repoSlug,
95107
}, nil
96108
}

pkg/plugin/plugin_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,23 @@ func TestGetPluginInfo(t *testing.T) {
3232
NormalizedName: "provider-github-myorg-myplugin",
3333
ShortNormalizedName: "provider-myplugin",
3434
Resolver: "github",
35+
RepoSlug: "myorg/myplugin",
3536
}},
3637
{"ci_condition", "github:myorg/myplugin", &PluginInfo{
3738
Type: "ci_condition",
3839
Name: "myplugin",
3940
NormalizedName: "condition-github-myorg-myplugin",
4041
ShortNormalizedName: "condition-myplugin",
4142
Resolver: "github",
43+
RepoSlug: "myorg/myplugin",
4244
}},
4345
{"provider", "github:myorg/myplugin@^1.0.0", &PluginInfo{
4446
Type: "provider",
4547
Name: "myplugin",
4648
NormalizedName: "provider-github-myorg-myplugin",
4749
ShortNormalizedName: "provider-myplugin",
4850
Resolver: "github",
51+
RepoSlug: "myorg/myplugin",
4952
Constraint: parseConstraint("^1.0.0"),
5053
}},
5154
{"provider", "git@2.0.0", &PluginInfo{
@@ -63,6 +66,23 @@ func TestGetPluginInfo(t *testing.T) {
6366
ShortNormalizedName: "hooks-logger",
6467
Resolver: "registry",
6568
}},
69+
{"hooks", "myresolver:@myorg/myplugin", &PluginInfo{
70+
Type: "hooks",
71+
Name: "myplugin",
72+
NormalizedName: "hooks-myresolver-@myorg-myplugin",
73+
ShortNormalizedName: "hooks-myplugin",
74+
Resolver: "myresolver",
75+
RepoSlug: "@myorg/myplugin",
76+
}},
77+
{"hooks", "myresolver:@myorg/myplugin@1.2.3", &PluginInfo{
78+
Type: "hooks",
79+
Name: "myplugin",
80+
NormalizedName: "hooks-myresolver-@myorg-myplugin",
81+
ShortNormalizedName: "hooks-myplugin",
82+
Resolver: "myresolver",
83+
RepoSlug: "@myorg/myplugin",
84+
Constraint: parseConstraint("1.2.3"),
85+
}},
6686
}
6787
for _, testCase := range testCases {
6888
results, err := GetPluginInfo(testCase.t, testCase.input)

0 commit comments

Comments
 (0)