Skip to content
Draft
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: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## [0.31.0] - TBD
Enables vergo clients to specify the version increment strategy when computing
the current version through `vergo get cv`

## [0.30.0] - 20-12-2024
Add Axion current behaviour when getting and bumping tag behind
Add NearestRelease flag to enable this new feature
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,10 @@ go install github.com/sky-uk/vergo@latest

`vergo get current-version --tag-prefix=banana`

* returns the current tag/release prefixed with banana, bumping to the next major version if HEAD is not on tag, maybe a SNAPSHOT

`vergo get current-version --increment=major --tag-prefix=banana`

* returns the current tag/release prefixed with banana, maybe a SNAPSHOT, using the first tag matched in the commit history

`vergo get current-version --tag-prefix=banana --nearest-release`
Expand Down
2 changes: 2 additions & 0 deletions cmd/cmd_consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,5 @@ const sortDirection = "sort-direction"
const maxListSize = "max-list-size"

const tokenEnvVarKey = "token-env-var-key"

const increment = "increment"
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wanted to double-check the name of the option. Used it because it seems to be the (internal) nomenclature used for the release command.
Iirc Axion uses incrementer (or version incrementer).

A couple of options to consider:

  • --increment (as is)
  • --incrementer
  • --version-incrementer
  • --increment-strategy
  • ??

Any thoughts?

Copy link
Copy Markdown
Collaborator

@chuckydev chuckydev Apr 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I personally am a fan of --increment. It is short and to the point.

17 changes: 14 additions & 3 deletions cmd/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"errors"
"fmt"

"github.com/Masterminds/semver/v3"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
Expand Down Expand Up @@ -57,7 +58,11 @@ func GetCmd(latest, previous RefFunc, current vergo.CurrentVersionFunc) *cobra.C
if err != nil {
return err
}
ref, err := get(latest, previous, current, rootFlags, modifier, withMetadata)
increment, err := cmd.Flags().GetString(increment)
if err != nil {
return err
}
ref, err := get(latest, previous, current, rootFlags, modifier, withMetadata, increment)
if err != nil {
return err
}
Expand All @@ -70,10 +75,11 @@ func GetCmd(latest, previous RefFunc, current vergo.CurrentVersionFunc) *cobra.C
},
}
cmd.Flags().BoolP(withMetadata, "m", false, "returns current version with commit hash as metadata")
cmd.Flags().StringP(increment, "i", "minor", "uses the specified increment strategy to compute the current version as necessary")
return cmd
}

func get(latest, previous RefFunc, current vergo.CurrentVersionFunc, rootFlags *RootFlags, modifier string, withMetadata bool) (vergo.SemverRef, error) {
func get(latest, previous RefFunc, current vergo.CurrentVersionFunc, rootFlags *RootFlags, modifier string, withMetadata bool, increment string) (vergo.SemverRef, error) {
repo, err := git.PlainOpenWithOptions(rootFlags.repositoryLocation, &git.PlainOpenOptions{DetectDotGit: true})
if err != nil {
return vergo.EmptyRef, err
Expand All @@ -85,7 +91,12 @@ func get(latest, previous RefFunc, current vergo.CurrentVersionFunc, rootFlags *
case "pr", "previous-release":
return previous(repo, rootFlags.tagPrefix)
case "cv", "current-version":
ref, err := current(repo, rootFlags.tagPrefix, release.PreRelease(repo, release.PreReleaseOptions{WithMetadata: withMetadata}), vergo.GetOptions{NearestRelease: rootFlags.nearestRelease})
ref, err := current(
repo,
rootFlags.tagPrefix,
release.PreRelease(repo, release.PreReleaseOptions{WithMetadata: withMetadata, Increment: increment}),
vergo.GetOptions{NearestRelease: rootFlags.nearestRelease},
)
if errors.Is(err, plumbing.ErrReferenceNotFound) || errors.Is(err, vergo.ErrNoTagFound) {
return vergo.SemverRef{Version: semver.MustParse("0.0.0-SNAPSHOT")}, nil
}
Expand Down
5 changes: 5 additions & 0 deletions fun-tests/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ fi
[[ "$(vergo get cv --tag-prefix=app)" == "0.2.0-SNAPSHOT" ]]
[[ "$(vergo get cv --tag-prefix=orange/v)" == "2.4.0-SNAPSHOT" ]]

#test get current-version with increment strategy provided
[[ "$(vergo get cv --tag-prefix=apple --increment=patch)" == "0.1.2-SNAPSHOT" ]]
[[ "$(vergo get cv --tag-prefix=apple --increment=minor)" == "0.2.0-SNAPSHOT" ]]
[[ "$(vergo get cv --tag-prefix=apple --increment=major)" == "1.0.0-SNAPSHOT" ]]

#test get current-version with prefix included in the output
[[ "$(vergo get cv --tag-prefix=apple -p)" == "apple-0.2.0-SNAPSHOT" ]]
[[ "$(vergo get cv --tag-prefix=app -p)" == "app-0.2.0-SNAPSHOT" ]]
Expand Down
31 changes: 26 additions & 5 deletions release/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,22 @@ package release
import (
"errors"
"fmt"
"regexp"
"strings"

"github.com/Masterminds/semver/v3"
gogit "github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
"github.com/go-git/go-git/v5/plumbing/storer"
log "github.com/sirupsen/logrus"
"github.com/thoas/go-funk"
"regexp"
"strings"
)

var (
ErrNoIncrement = errors.New("increment hint not present")
ErrSkipRelease = errors.New("skip release hint present")
ErrInvalidIncrement = errors.New("increment strategy is invalid")
ErrNoIncrement = errors.New("increment hint not present")
ErrSkipRelease = errors.New("skip release hint present")
)

func checkSkipHint(aString, tagPrefix string) bool {
Expand Down Expand Up @@ -132,21 +134,40 @@ func ValidateHEAD(repo *gogit.Repository, remoteName string, versionedBranches [
type PreReleaseFunc func(version *semver.Version) (semver.Version, error)
type PreReleaseOptions struct {
WithMetadata bool
Increment string
}

func PreRelease(repo *gogit.Repository, options PreReleaseOptions) PreReleaseFunc {
return func(version *semver.Version) (semver.Version, error) {
pre, err := version.IncMinor().SetPrerelease("SNAPSHOT")
var pre semver.Version
var err error
switch strings.ToLower(options.Increment) {
case "patch":
pre = version.IncPatch()
case "", "minor":
pre = version.IncMinor()
case "major":
pre = version.IncMajor()
default:
err = fmt.Errorf("%w : %s", ErrInvalidIncrement, options.Increment)
}
if err != nil {
return semver.Version{}, err
}

pre, err = pre.SetPrerelease("SNAPSHOT")
if err != nil {
return semver.Version{}, err
}

if options.WithMetadata {
head, err := repo.Head()
if err != nil {
return semver.Version{}, err
}
return pre.SetMetadata(head.Hash().String()[0:7])
}

return pre, nil
}
}
Expand Down