Skip to content

Commit

Permalink
refactor: move commit and release structs in separate files
Browse files Browse the repository at this point in the history
  • Loading branch information
christophwitzko committed Aug 11, 2020
1 parent 92a5c9b commit a8fe4ea
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 105 deletions.
41 changes: 41 additions & 0 deletions pkg/semrel/commit.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package semrel

import (
"regexp"
"strings"
)

var commitPattern = regexp.MustCompile(`^(\w*)(?:\((.*)\))?\: (.*)$`)
var breakingPattern = regexp.MustCompile("BREAKING CHANGES?")

type Change struct {
Major, Minor, Patch bool
}

type Commit struct {
SHA string
Raw []string
Type string
Scope string
Message string
Change Change
}

func NewCommit(sha, msg string) *Commit {
c := new(Commit)
c.SHA = sha
c.Raw = strings.Split(msg, "\n")
found := commitPattern.FindAllStringSubmatch(c.Raw[0], -1)
if len(found) < 1 {
return c
}
c.Type = strings.ToLower(found[0][1])
c.Scope = found[0][2]
c.Message = found[0][3]
c.Change = Change{
Major: breakingPattern.MatchString(msg),
Minor: c.Type == "feat",
Patch: c.Type == "fix",
}
return c
}
76 changes: 76 additions & 0 deletions pkg/semrel/release.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package semrel

import (
"sort"
"strings"

"github.com/Masterminds/semver"
)

type Release struct {
SHA string
Version *semver.Version
}

type Releases []*Release

func (r Releases) Len() int {
return len(r)
}

func (r Releases) Less(i, j int) bool {
return r[j].Version.LessThan(r[i].Version)
}

func (r Releases) Swap(i, j int) {
r[i], r[j] = r[j], r[i]
}

func (releases Releases) GetLatestRelease(vrange string) (*Release, error) {
if len(releases) == 0 {
return &Release{"", &semver.Version{}}, nil
}

sort.Sort(releases)

var lastRelease *Release
for _, r := range releases {
if r.Version.Prerelease() == "" {
lastRelease = r
break
}
}

if vrange == "" {
if lastRelease != nil {
return lastRelease, nil
}
return &Release{"", &semver.Version{}}, nil
}

constraint, err := semver.NewConstraint(vrange)
if err != nil {
return nil, err
}
for _, r := range releases {
if constraint.Check(r.Version) {
return r, nil
}
}

nver, err := semver.NewVersion(vrange)
if err != nil {
return nil, err
}

splitPre := strings.SplitN(vrange, "-", 2)
if len(splitPre) == 1 {
return &Release{lastRelease.SHA, nver}, nil
}

npver, err := nver.SetPrerelease(splitPre[1])
if err != nil {
return nil, err
}
return &Release{lastRelease.SHA, &npver}, nil
}
105 changes: 0 additions & 105 deletions pkg/semrel/semrel.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,118 +2,13 @@ package semrel

import (
"fmt"
"regexp"
"sort"
"strconv"
"strings"

"github.com/Masterminds/semver"
"github.com/go-semantic-release/semantic-release/pkg/config"
)

var commitPattern = regexp.MustCompile(`^(\w*)(?:\((.*)\))?\: (.*)$`)
var breakingPattern = regexp.MustCompile("BREAKING CHANGES?")

type Change struct {
Major, Minor, Patch bool
}

type Commit struct {
SHA string
Raw []string
Type string
Scope string
Message string
Change Change
}

func NewCommit(sha, msg string) *Commit {
c := new(Commit)
c.SHA = sha
c.Raw = strings.Split(msg, "\n")
found := commitPattern.FindAllStringSubmatch(c.Raw[0], -1)
if len(found) < 1 {
return c
}
c.Type = strings.ToLower(found[0][1])
c.Scope = found[0][2]
c.Message = found[0][3]
c.Change = Change{
Major: breakingPattern.MatchString(msg),
Minor: c.Type == "feat",
Patch: c.Type == "fix",
}
return c
}

type Release struct {
SHA string
Version *semver.Version
}

type Releases []*Release

func (r Releases) Len() int {
return len(r)
}

func (r Releases) Less(i, j int) bool {
return r[j].Version.LessThan(r[i].Version)
}

func (r Releases) Swap(i, j int) {
r[i], r[j] = r[j], r[i]
}

func (releases Releases) GetLatestRelease(vrange string) (*Release, error) {
if len(releases) == 0 {
return &Release{"", &semver.Version{}}, nil
}

sort.Sort(releases)

var lastRelease *Release
for _, r := range releases {
if r.Version.Prerelease() == "" {
lastRelease = r
break
}
}

if vrange == "" {
if lastRelease != nil {
return lastRelease, nil
}
return &Release{"", &semver.Version{}}, nil
}

constraint, err := semver.NewConstraint(vrange)
if err != nil {
return nil, err
}
for _, r := range releases {
if constraint.Check(r.Version) {
return r, nil
}
}

nver, err := semver.NewVersion(vrange)
if err != nil {
return nil, err
}

splitPre := strings.SplitN(vrange, "-", 2)
if len(splitPre) == 1 {
return &Release{lastRelease.SHA, nver}, nil
}

npver, err := nver.SetPrerelease(splitPre[1])
if err != nil {
return nil, err
}
return &Release{lastRelease.SHA, &npver}, nil
}

func CalculateChange(commits []*Commit, latestRelease *Release) Change {
var change Change
for _, commit := range commits {
Expand Down

0 comments on commit a8fe4ea

Please sign in to comment.