/
plugin.go
108 lines (97 loc) 路 2.97 KB
/
plugin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package plugin
import (
"fmt"
"strings"
"github.com/Masterminds/semver/v3"
"github.com/go-semantic-release/semantic-release/v2/pkg/analyzer"
"github.com/go-semantic-release/semantic-release/v2/pkg/condition"
"github.com/go-semantic-release/semantic-release/v2/pkg/generator"
"github.com/go-semantic-release/semantic-release/v2/pkg/hooks"
"github.com/go-semantic-release/semantic-release/v2/pkg/provider"
"github.com/go-semantic-release/semantic-release/v2/pkg/updater"
)
type Info struct {
Type string
Name string
NormalizedName string
ShortNormalizedName string
Constraint *semver.Constraints
Resolver string
RepoSlug string
PluginPath string
BinPath string
}
func normalizedPluginType(t string) string {
switch t {
case analyzer.CommitAnalyzerPluginName:
return "commit-analyzer"
case condition.CIConditionPluginName:
return "condition"
case generator.ChangelogGeneratorPluginName:
return "changelog-generator"
case provider.PluginName:
return "provider"
case updater.FilesUpdaterPluginName:
return "files-updater"
case hooks.PluginName:
return "hooks"
}
return ""
}
var nameNormalizer = strings.NewReplacer(":", "-", "/", "-")
func GetPluginInfo(pluginType, pluginName string) (*Info, error) {
nPluginType := normalizedPluginType(pluginType)
if nPluginType == "" {
return nil, fmt.Errorf("invalid plugin type: %s", pluginType)
}
resolver := "default"
repoSlug := ""
name := pluginName
normalizedName := nameNormalizer.Replace(fmt.Sprintf("%s-%s", nPluginType, pluginName))
if strings.Contains(name, ":") {
parts := strings.Split(name, ":")
if len(parts) != 2 {
return nil, fmt.Errorf("invalid plugin name format")
}
resolver = parts[0]
name = parts[1]
}
if strings.Contains(name, "/") {
slashParts := strings.Split(name, "/")
pName := slashParts[len(slashParts)-1]
// remove version constraint from the slug
if strings.Contains(pName, "@") {
nameWithoutVersion, _, _ := strings.Cut(pName, "@")
repoSlug = strings.Join(slashParts[:len(slashParts)-1], "/") + "/" + nameWithoutVersion
} else {
repoSlug = name
}
// the last part is the plugin name
name = pName
}
var constraint *semver.Constraints
if strings.Contains(name, "@") {
parts := strings.Split(name, "@")
if len(parts) != 2 {
return nil, fmt.Errorf("invalid plugin name format")
}
v, err := semver.NewConstraint(parts[1])
if err != nil {
return nil, err
}
name = parts[0]
constraint = v
// remove version constraint from the normalized name
normalizedParts := strings.Split(normalizedName, "@")
normalizedName = strings.Join(normalizedParts[:len(normalizedParts)-1], "@")
}
return &Info{
Type: pluginType,
Name: name,
NormalizedName: normalizedName,
ShortNormalizedName: fmt.Sprintf("%s-%s", nPluginType, name),
Constraint: constraint,
Resolver: resolver,
RepoSlug: repoSlug,
}, nil
}