commit 847ae29a70c74351502c064e9ed9d2fef1c9a456 Author: George Antoniadis Date: Thu Oct 29 21:56:53 2020 +0000 feat: add manual version file bumping diff --git a/main.go b/main.go new file mode 100644 index 0000000..3703f74 --- /dev/null +++ b/main.go @@ -0,0 +1,138 @@ +package main + +import ( + "flag" + "io/ioutil" + "log" + + "github.com/Masterminds/semver" + "github.com/davecgh/go-spew/spew" + git "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/octago/sflags/gen/gflag" +) + +type ( + config struct { + // action + AutodetectBump bool `flag:"bump-auto" desc:"Bump version based on semantic commits"` + BumpMajor bool `flag:"bump-major" desc:"Bump major"` + BumpMinor bool `flag:"bump-minor" desc:"Bump minor"` + BumpPatch bool `flag:"bump-patch" desc:"Bump patch"` + + // version file config + FileUpdate bool `flag:"file-update" desc:"Use version file"` + FilePath string `flag:"file-path" desc:"Version file path"` + + // git tag config + GitTagCreate bool + + // version config + VersionPrefix string `flag:"version-prefix" desc:"Version prefix"` + + // changelog config + ChangelogGenerate bool + ChangelogTemplatePath string + } +) + +func detectBump(c *config) error { + if !c.AutodetectBump { + return nil + } + repo, err := git.PlainOpen(".") + if err != nil { + return err + } + tagrefs, err := repo.Tags() + err = tagrefs.ForEach(func(t *plumbing.Reference) error { + log.Println(t.Hash(), t.String()) + return nil + }) + return nil +} + +func fileUpdate(c *config) error { + if !c.FileUpdate { + return nil + } + currentVersion := "0.0.0" + versionFileBody, err := ioutil.ReadFile(c.FilePath) + if err != nil { + return err + } + currentVersion = string(versionFileBody) + if currentVersion == "" { + currentVersion = c.VersionPrefix + "0.0.0" + } + newVersion, err := bumpVersion(currentVersion, c) + if err != nil { + return err + } + return ioutil.WriteFile(c.FilePath, []byte(newVersion), 0644) +} + +// func changelogGenerate(c *config) error { +// if !c.FileUpdate { +// return nil +// } +// currentVersion := "0.0.0" +// versionFileBody, err := ioutil.ReadFile(c.FilePath) +// if err != nil { +// return err +// } +// currentVersion = string(versionFileBody) +// if currentVersion == "" { +// currentVersion = c.VersionPrefix + "0.0.0" +// } +// newVersion, err := bumpVersion(currentVersion, c) +// if err != nil { +// return err +// } +// return ioutil.WriteFile(c.FilePath, []byte(newVersion), 0644) +// } + +func bumpVersion(currentVersion string, c *config) (string, error) { + cleanCurrentVersionString := currentVersion[len(c.VersionPrefix):] + cleanCurrentVersion, err := semver.NewVersion(cleanCurrentVersionString) + if err != nil { + return "", err + } + cleanNewVersion := *cleanCurrentVersion + if c.BumpMajor { + cleanNewVersion = cleanNewVersion.IncMajor() + } + if c.BumpMinor { + cleanNewVersion = cleanNewVersion.IncMinor() + } + if c.BumpPatch { + cleanNewVersion = cleanNewVersion.IncPatch() + } + if cleanCurrentVersion.Equal(&cleanNewVersion) { + cleanNewVersion = cleanNewVersion.IncPatch() + } + return c.VersionPrefix + cleanNewVersion.String(), nil +} + +func main() { + c := &config{ + FilePath: "VERSION", + VersionPrefix: "v", + } + err := gflag.ParseToDef(c) + if err != nil { + log.Fatalf("err: %v", err) + } + flag.Parse() + spew.Dump(c) + + actions := []func(*config) error{ + detectBump, + fileUpdate, + } + for _, action := range actions { + if err := action(c); err != nil { + log.Fatalf("err: %v", err) + } + } +}