Skip to content
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
194 changes: 82 additions & 112 deletions cmd/git-semver/git-semver.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ package git_semver
import (
"fmt"
"log"
"strings"
"os"

"github.com/Masterminds/semver"
git_semver "github.com/crqra/git-semver/internal/git-semver"
git "github.com/libgit2/git2go/v31"
"github.com/carlsberg/git-semver/internal/git"
git_semver "github.com/carlsberg/git-semver/internal/git-semver"
"github.com/spf13/cobra"
)

Expand All @@ -20,144 +20,55 @@ var bumpCmd = &cobra.Command{
Use: "bump",
Short: "Bumps the latest version to the next version and tags it",
Run: func(cmd *cobra.Command, args []string) {
repo, err := git_semver.OpenRepository("./")
if err != nil {
log.Fatal(err)
}

versions, err := git_semver.ListVersions(repo)
if err != nil {
log.Fatal(err)
}

versionsLen := len(versions) - 1

var commits []*git.Commit
var latestVersion *semver.Version

if versionsLen >= 0 {
latestVersion = versions[versionsLen]

commits, err = git_semver.ListCommitsInRange(repo, latestVersion.String(), "HEAD")
if err != nil {
log.Fatal(err)
}
} else {
latestVersion, err = semver.NewVersion("0.0.0")
if err != nil {
log.Fatal(err)
project := newProjectOrPanic(cmd)
versionFilenamesAndKeys := getVersionFilenamesAndKeysOrFail(cmd)
latest := getLatestVersionOrFail(project)
next := getNextVersionOrFail(project)

if len(versionFilenamesAndKeys) > 0 {
for _, filenameAndKey := range versionFilenamesAndKeys {
updateVersionFileOrPanic(filenameAndKey, latest, next)
}

commits, err = git_semver.ListCommits(repo)
if err != nil {
if err := git.CreateCommit(project.Repo(), fmt.Sprintf("bump: %s -> %s", latest.String(), next.String())); err != nil {
log.Fatal(err)
}
}

increment := git_semver.DetectIncrement(commits)

if increment == git_semver.None {
log.Fatal("No increment detected to bump the version")
}

nextVersion := git_semver.BumpVersion(*latestVersion, increment)

versionFiles := make([]git_semver.VersionFile, 0)
versionFilenamesAndKeys, err := cmd.Flags().GetStringArray("version-file")
if err != nil {
log.Fatal(err)
}

for _, filenameAndKey := range versionFilenamesAndKeys {
slice := strings.Split(filenameAndKey, ":")
tagName := git_semver.TagNameFromProjectAndVersion(project, next)
tagMessage := fmt.Sprintf("Release %s", tagName)

if len(slice) != 2 {
log.Fatalf("%s is not correctly formatted. Should be `filename:key`", filenameAndKey)
}

versionFiles = append(versionFiles, git_semver.VersionFile{Filename: slice[0], Key: slice[1]})
}

if err := git_semver.UpdateVersionFiles(repo, versionFiles, *latestVersion, nextVersion); err != nil {
if err := git.CreateTag(project.Repo(), tagName, tagMessage); err != nil {
log.Fatal(err)
}

if err := git_semver.TagVersion(repo, nextVersion); err != nil {
if err := git.PushTagToRemotes(project.Repo(), tagName); err != nil {
log.Fatal(err)
}

if err := git_semver.PushVersionTagToRemotes(repo, nextVersion); err != nil {
log.Fatal(err)
}
fmt.Printf("bump %s from %s to %s\n", project.Dir(), latest, next)
},
}

var nextCmd = &cobra.Command{
Use: "next",
Short: "Outputs the next unreleased version",
Run: func(cmd *cobra.Command, args []string) {
repo, err := git_semver.OpenRepository("./")
if err != nil {
log.Fatal(err)
}

versions, err := git_semver.ListVersions(repo)
if err != nil {
log.Fatal(err)
}

versionsLen := len(versions) - 1

var commits []*git.Commit
var latestVersion *semver.Version

if versionsLen >= 0 {
latestVersion = versions[versionsLen]

commits, err = git_semver.ListCommitsInRange(repo, latestVersion.String(), "HEAD")
if err != nil {
log.Fatal(err)
}
} else {
latestVersion, err = semver.NewVersion("0.0.0")
if err != nil {
log.Fatal(err)
}

commits, err = git_semver.ListCommits(repo)
if err != nil {
log.Fatal(err)
}
}

increment := git_semver.DetectIncrement(commits)
nextVersion := git_semver.BumpVersion(*latestVersion, increment)
project := newProjectOrPanic(cmd)
next := getNextVersionOrFail(project)

fmt.Println(nextVersion.String())
fmt.Println(next.String())
},
}

var latestCmd = &cobra.Command{
Use: "latest",
Short: "Outputs the latest released version",
Run: func(cmd *cobra.Command, args []string) {
repo, err := git_semver.OpenRepository("./")
if err != nil {
log.Fatal(err)
}

versions, err := git_semver.ListVersions(repo)
if err != nil {
log.Fatal(err)
}

versionsLen := len(versions) - 1

if versionsLen < 0 {
log.Fatal("No released versions found")
}
project := newProjectOrPanic(cmd)
latest := getLatestVersionOrFail(project)

fmt.Println(versions[versionsLen].String())
fmt.Println(latest.String())
},
}

Expand All @@ -169,6 +80,65 @@ func init() {
rootCmd.AddCommand(bumpCmd)
rootCmd.AddCommand(nextCmd)
rootCmd.AddCommand(latestCmd)
rootCmd.PersistentFlags().StringP("project", "p", "", "Project")

bumpCmd.Flags().StringArrayP("version-file", "f", make([]string, 0), "Specify version files to be updated with the new version in the format `filename:key` (i.e. `package.json:\"version\"`)")
}

func newProjectOrPanic(cmd *cobra.Command) *git_semver.Project {
cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}

dir, err := cmd.Flags().GetString("project")
if err != nil {
log.Fatal(err)
}

project, err := git_semver.NewProject(cwd, dir)
if err != nil {
log.Fatal(err)
}

return project
}

func updateVersionFileOrPanic(filenameAndKey string, latest, next *semver.Version) {
vf, err := git_semver.NewVersionFile("./", filenameAndKey)
if err != nil {
log.Fatal(err)
}

vf.UpdateVersion(latest, next)
if err != nil {
log.Fatal(err)
}
}

func getLatestVersionOrFail(project *git_semver.Project) *semver.Version {
latest, err := project.LatestVersion()
if err != nil {
log.Fatal(err)
}

return latest
}

func getNextVersionOrFail(project *git_semver.Project) *semver.Version {
next, err := project.NextVersion()
if err != nil {
log.Fatal(err)
}

return next
}

func getVersionFilenamesAndKeysOrFail(cmd *cobra.Command) []string {
versionFilenamesAndKeys, err := cmd.Flags().GetStringArray("version-file")
if err != nil {
log.Fatal(err)
}

return versionFilenamesAndKeys
}
7 changes: 5 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
module github.com/crqra/git-semver
module github.com/carlsberg/git-semver

go 1.17

require (
github.com/Masterminds/semver v1.5.0
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/libgit2/git2go/v31 v31.6.1
github.com/spf13/cobra v1.2.1
)

require (
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c // indirect
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
Expand Down
Loading