99 "strconv"
1010 "strings"
1111
12+ "github.com/Masterminds/semver"
1213 log "github.com/sirupsen/logrus"
1314)
1415
@@ -19,6 +20,8 @@ type Gitter interface {
1920 Sha () (sha string , err error )
2021 Branch () (string , error )
2122 IsTagged () bool
23+ NextVersion () (* string , error )
24+ BumpVersion (string ) (* string , error )
2225}
2326
2427type git struct {
@@ -38,9 +41,8 @@ func New(directory string) (Gitter, error) {
3841
3942// ~r4.8-40-g56a99c2~
4043func (g * git ) Tag () (tag string , err error ) {
41- tag = os .Getenv ("LAST_TAG" )
42-
43- if tag != "" {
44+ tag , exists := os .LookupEnv ("LAST_TAG" )
45+ if exists {
4446 return
4547 }
4648
@@ -162,6 +164,101 @@ func (g *git) Branch() (string, error) {
162164 return strings .ToLower (branch ), err
163165}
164166
167+ func (g * git ) gitSemVersion () (* semver.Version , error ) {
168+ tag , err := g .Tag ()
169+ if err != nil || tag == "" {
170+ tag = "0.0.1"
171+ log .Infof ("unable to find any git tags using %s" , tag )
172+ }
173+
174+ tag = strings .TrimPrefix (tag , "v" )
175+ tag = strings .TrimPrefix (tag , "r" )
176+ ver , err := semver .NewVersion (tag )
177+ if err != nil {
178+ return nil , fmt .Errorf ("%s %s" , tag , err )
179+ }
180+ return ver , nil
181+ }
182+
183+ func (g * git ) BumpVersion (bump string ) (* string , error ) {
184+ ver , err := g .gitSemVersion ()
185+ if err != nil {
186+ return nil , err
187+ }
188+
189+ version := * ver
190+ if bump == "major" {
191+ version = version .IncMajor ()
192+ } else if bump == "minor" {
193+ version = version .IncMinor ()
194+ } else {
195+ version = version .IncPatch ()
196+ }
197+
198+ verStr := version .String ()
199+ return & verStr , err
200+ }
201+
202+ // NextVersion determines the correct version
203+ func (g * git ) NextVersion () (* string , error ) {
204+ commits , err := g .Commits ()
205+ if err != nil {
206+ return nil , err
207+ }
208+
209+ sha , err := g .Sha ()
210+ if err != nil {
211+ return nil , fmt .Errorf ("failed to fetch git sha %s" , err )
212+ }
213+
214+ branch , err := g .Branch ()
215+ if err != nil {
216+ return nil , fmt .Errorf ("failed to fetch git branch %s" , err )
217+ }
218+
219+ ver , err := g .gitSemVersion ()
220+ if err != nil {
221+ return nil , err
222+ }
223+
224+ version := * ver
225+ prerel := ""
226+ tagged := g .IsTagged ()
227+ if ! tagged {
228+ if branch == "head" && commits == 0 {
229+ return nil , errors .New ("this is likely an light-weight git tag. please use a annotated tag for helm release to function properly" )
230+ }
231+ version = version .IncPatch ()
232+ if branch != "master" {
233+ prerel = "0." + branch
234+ }
235+ }
236+
237+ if branch == "master" {
238+ if commits != 0 {
239+ if prerel != "" {
240+ prerel += "."
241+ }
242+ prerel += strconv .Itoa (commits )
243+ }
244+ }
245+
246+ if prerel != "" {
247+ version , err = version .SetPrerelease (prerel )
248+ if err != nil {
249+ return nil , err
250+ }
251+ }
252+
253+ version , err = version .SetMetadata (sha )
254+ if err != nil {
255+ return nil , err
256+ }
257+
258+ verStr := version .String ()
259+ return & verStr , err
260+ }
261+
165262func validate (dir string ) error {
166263 cmd := exec .Command ("git" , "rev-parse" , "--git-dir" )
167264 cmd .Dir = dir
0 commit comments