8000 Add next-version command by wagoodman · Pull Request #28 · anchore/chronicle · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Add next-version command #28

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .chronicle.yaml
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
github:
include-prs: true
include-prs: true
log:
level: trace
51 changes: 51 additions & 0 deletions chronicle/release/change/semver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package change

import "strings"

type SemVerKind int

const (
SemVerUnknown SemVerKind = iota
SemVerPatch
SemVerMinor
SemVerMajor
)

var SemVerFields = []SemVerKind{
SemVerMajor,
SemVerMinor,
SemVerPatch,
}

func ParseSemVerKind(semver string) SemVerKind {
for _, f := range SemVerFields {
if f.String() == strings.ToLower(semver) {
return f
}
}
return SemVerUnknown
}

func (f SemVerKind) String() string {
switch f {
case SemVerMajor:
return "major"
case SemVerMinor:
return "minor"
case SemVerPatch:
return "patch"
}
return ""
}

func Significance(changes []Change) SemVerKind {
var current = SemVerUnknown
for _, c := range changes {
for _, t := range c.ChangeTypes {
if t.Kind > current {
current = t.Kind
}
}
}
return current
}
14 changes: 12 additions & 2 deletions chronicle/release/change/type.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,21 @@
package change

type Type string
type Type struct {
Name string
Kind SemVerKind
}

func NewType(name string, kind SemVerKind) Type {
return Type{
Name: name,
Kind: kind,
}
}

func ContainsAny(query, against []Type) bool {
for _, qt := range query {
for _, at := range against {
if qt == at {
if qt.Name == at.Name {
return true
}
}
Expand Down
57 changes: 57 additions & 0 deletions chronicle/release/find_next_version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package release

import (
"fmt"
"strings"

"github.com/anchore/chronicle/chronicle/release/change"
"github.com/coreos/go-semver/semver"
)

func FindNextVersion(currentVersion string, changes change.Changes, enforceV0 bool) (string, error) {
var breaking, feature, patch bool
for _, c := range changes {
for _, chTy := range c.ChangeTypes {
switch chTy.Kind {
case change.SemVerMajor:
if enforceV0 {
feature = true
} else {
breaking = true
}
case change.SemVerMinor:
feature = true
case change.SemVerPatch:
patch = true
}
}
}

v, err := semver.NewVersion(strings.TrimLeft(currentVersion, "v"))
if err != nil {
return "", fmt.Errorf("invalid current version given: %q: %w", currentVersion, err)
}
original := *v

if patch {
v.BumpPatch()
}

if feature {
v.BumpMinor()
}

if breaking {
v.BumpMajor()
}

if v.String() == original.String() {
return "", fmt.Errorf("no changes found that affect the version (changes=%d)", len(changes))
}

prefix := ""
if strings.HasPrefix(currentVersion, "v") {
prefix = "v"
}
return prefix + v.String(), nil
}
129 changes: 129 additions & 0 deletions chronicle/release/find_next_version_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package release

import (
"github.com/anchore/chronicle/chronicle/release/change"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"testing"
)

func TestFindNextVersion(t *testing.T) {
majorChange := change.Type{
Kind: change.SemVerMajor,
}

minorChange := change.Type{
Kind: change.SemVerMinor,
}

patchChange := change.Type{
Kind: change.SemVerPatch,
}

tests := []struct {
name string
release string
changes change.Changes
enforceV0 bool
want string
wantErr require.ErrorAssertionFunc
}{
{
name: "bump major version",
release: "v0.1.5",
changes: []change.Change{
{
ChangeTypes: []change.Type{majorChange, minorChange, patchChange},
},
},
want: "v1.0.0",
},
{
name: "bump major version -- enforce v0",
release: "v0.1.5",
enforceV0: true,
changes: []change.Change{
{
ChangeTypes: []change.Type{majorChange, minorChange, patchChange},
},
},
want: "v0.2.0",
},
{
name: "bump major version -- enforce v0 -- keep major",
release: "v6.1.5",
enforceV0: true,
changes: []change.Change{
{
ChangeTypes: []change.Type{majorChange, minorChange, patchChange},
},
},
want: "v6.2.0",
},
{
name: "bump major version -- ignore dups",
release: "v0.1.5",
changes: []change.Change{
{
ChangeTypes: []change.Type{majorChange, majorChange, majorChange, majorChange, majorChange, majorChange},
},
},
want: "v1.0.0",
},
{
name: "bump minor version",
release: "v0.1.5",
changes: []change.Change{
{
ChangeTypes: []change.Type{minorChange, patchChange},
},
},
want: "v0.2.0",
},
{
name: "bump patch version",
release: "v0.1.5",
changes: []change.Change{
{
ChangeTypes: []change.Type{patchChange},
},
},
want: "v0.1.6",
},
{
name: "honor no prefix",
release: "0.1.5",
changes: []change.Change{
{
AE8F ChangeTypes: []change.Type{patchChange},
},
},
want: "0.1.6",
},
{
name: "honor no prefix",
release: "0.1.5",
changes: []change.Change{
{
ChangeTypes: []change.Type{patchChange},
},
},
want: "0.1.6",
},
{
name: "error on bad version",
release: "a10",
wantErr: require.Error,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.wantErr == nil {
tt.wantErr = require.NoError
}
got, err := FindNextVersion(tt.release, tt.changes, tt.enforceV0)
tt.wantErr(t, err)
assert.Equal(t, tt.want, got)
})
}
}
16 changes: 8 additions & 8 deletions chronicle/release/format/markdown/presenter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,19 @@ func TestMarkdownPresenter_Present(t *testing.T) {
Description: release.Description{
SupportedChanges: []change.TypeTitle{
{
ChangeType: "bug",
ChangeType: change.NewType("bug", change.SemVerPatch),
Title: "Bug Fixes",
},
{
ChangeType: "added",
ChangeType: change.NewType("added", change.SemVerMinor),
Title: "Added Features",
},
{
ChangeType: "breaking",
ChangeType: change.NewType("breaking", change.SemVerMajor),
Title: "Breaking Changes",
},
{
ChangeType: "removed",
ChangeType: change.NewType("removed", change.SemVerMajor),
Title: "Removed Features",
},
},
Expand All @@ -55,7 +55,7 @@ func TestMarkdownPresenter_Present(t *testing.T) {
VCSChangesURL: "https://github.com/anchore/syft/compare/v0.19.0...v0.19.1",
Changes: []change.Change{
{
ChangeTypes: []change.Type{"bug"},
ChangeTypes: []change.Type{change.NewType("bug", change.SemVerPatch)},
Text: "Redirect cursor hide/show to stderr",
References: []change.Reference{
{
Expand All @@ -65,15 +65,15 @@ func TestMarkdownPresenter_Present(t *testing.T) {
},
},
{
ChangeTypes: []change.Type{"added"},
ChangeTypes: []change.Type{change.NewType("added", change.SemVerMinor)},
Text: "added feature",
},
{
ChangeTypes: []change.Type{"added"},
ChangeTypes: []change.Type{change.NewType("added", change.SemVerMinor)},
Text: "another added feature",
},
{
ChangeTypes: []change.Type{"breaking"},
ChangeTypes: []change.Type{change.NewType("breaking", change.SemVerMajor)},
Text: "breaking change",
},
},
Expand Down
4 changes: 3 additions & 1 deletion chronicle/release/release.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package release

import "time"
import (
"time"
)

type Release struct {
Version string
Expand Down
Loading
0