2019-11-17 16:17:24 +00:00
|
|
|
package sv
|
|
|
|
|
2021-02-13 18:40:09 +00:00
|
|
|
import "github.com/Masterminds/semver/v3"
|
2019-11-17 16:17:24 +00:00
|
|
|
|
|
|
|
type versionType int
|
|
|
|
|
|
|
|
const (
|
|
|
|
none versionType = iota
|
|
|
|
patch
|
|
|
|
minor
|
|
|
|
major
|
|
|
|
)
|
|
|
|
|
|
|
|
// ToVersion parse string to semver.Version
|
|
|
|
func ToVersion(value string) (semver.Version, error) {
|
|
|
|
version := value
|
|
|
|
if version == "" {
|
|
|
|
version = "0.0.0"
|
|
|
|
}
|
|
|
|
v, err := semver.NewVersion(version)
|
2019-11-17 17:03:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return semver.Version{}, err
|
|
|
|
}
|
|
|
|
return *v, nil
|
2019-11-17 16:17:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// SemVerCommitsProcessor interface
|
|
|
|
type SemVerCommitsProcessor interface {
|
2019-11-17 16:41:00 +00:00
|
|
|
NextVersion(version semver.Version, commits []GitCommitLog) semver.Version
|
2019-11-17 16:17:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// SemVerCommitsProcessorImpl process versions using commit log
|
|
|
|
type SemVerCommitsProcessorImpl struct {
|
|
|
|
MajorVersionTypes map[string]struct{}
|
|
|
|
MinorVersionTypes map[string]struct{}
|
|
|
|
PatchVersionTypes map[string]struct{}
|
2021-02-15 05:41:43 +00:00
|
|
|
KnownTypes []string
|
2019-11-17 16:17:24 +00:00
|
|
|
IncludeUnknownTypeAsPatch bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewSemVerCommitsProcessor SemanticVersionCommitsProcessorImpl constructor
|
2021-02-15 05:41:43 +00:00
|
|
|
func NewSemVerCommitsProcessor(vcfg VersioningConfig, mcfg CommitMessageConfig) *SemVerCommitsProcessorImpl {
|
2019-11-17 16:17:24 +00:00
|
|
|
return &SemVerCommitsProcessorImpl{
|
2021-02-15 05:41:43 +00:00
|
|
|
IncludeUnknownTypeAsPatch: !vcfg.IgnoreUnknown,
|
|
|
|
MajorVersionTypes: toMap(vcfg.UpdateMajor),
|
|
|
|
MinorVersionTypes: toMap(vcfg.UpdateMinor),
|
|
|
|
PatchVersionTypes: toMap(vcfg.UpdatePatch),
|
|
|
|
KnownTypes: mcfg.Types,
|
2019-11-17 16:17:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-17 16:41:00 +00:00
|
|
|
// NextVersion calculates next version based on commit log
|
|
|
|
func (p SemVerCommitsProcessorImpl) NextVersion(version semver.Version, commits []GitCommitLog) semver.Version {
|
2019-11-17 16:17:24 +00:00
|
|
|
var versionToUpdate = none
|
|
|
|
for _, commit := range commits {
|
|
|
|
if v := p.versionTypeToUpdate(commit); v > versionToUpdate {
|
|
|
|
versionToUpdate = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch versionToUpdate {
|
|
|
|
case major:
|
|
|
|
return version.IncMajor()
|
|
|
|
case minor:
|
|
|
|
return version.IncMinor()
|
|
|
|
case patch:
|
|
|
|
return version.IncPatch()
|
|
|
|
default:
|
|
|
|
return version
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p SemVerCommitsProcessorImpl) versionTypeToUpdate(commit GitCommitLog) versionType {
|
2021-02-14 02:35:31 +00:00
|
|
|
if commit.Message.IsBreakingChange {
|
2019-11-17 16:17:24 +00:00
|
|
|
return major
|
|
|
|
}
|
2021-02-14 02:35:31 +00:00
|
|
|
if _, exists := p.MajorVersionTypes[commit.Message.Type]; exists {
|
2019-11-17 16:17:24 +00:00
|
|
|
return major
|
|
|
|
}
|
2021-02-14 02:35:31 +00:00
|
|
|
if _, exists := p.MinorVersionTypes[commit.Message.Type]; exists {
|
2019-11-17 16:17:24 +00:00
|
|
|
return minor
|
|
|
|
}
|
2021-02-14 02:35:31 +00:00
|
|
|
if _, exists := p.PatchVersionTypes[commit.Message.Type]; exists {
|
2019-11-17 16:17:24 +00:00
|
|
|
return patch
|
|
|
|
}
|
2021-02-15 05:41:43 +00:00
|
|
|
if !contains(commit.Message.Type, p.KnownTypes) && p.IncludeUnknownTypeAsPatch {
|
2019-11-17 16:17:24 +00:00
|
|
|
return patch
|
|
|
|
}
|
|
|
|
return none
|
|
|
|
}
|
|
|
|
|
|
|
|
func toMap(values []string) map[string]struct{} {
|
|
|
|
result := make(map[string]struct{})
|
|
|
|
for _, v := range values {
|
|
|
|
result[v] = struct{}{}
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|