github.com/jmigpin/editor@v1.6.0/core/version.go (about) 1 package core 2 3 import ( 4 "fmt" 5 "runtime/debug" 6 "time" 7 ) 8 9 func Version() string { 10 // NOTE: equivalent "go get" version in format x.y.z is 1.x.y (z not used) (ex: 3.3.0 -> 1.3.3). This is done because go doesn't seem to allow having versions bigger then 1 without altering the import paths. 11 12 v := "3.6.0" 13 typ := "release" 14 //typ := "rc" // release candidate 15 //typ := "alpha" // development 16 return taggedVersion(v, typ) 17 } 18 func taggedVersion(v string, typ string) string { 19 tag := "nobuildinfo" 20 bi, ok := getBuildInfo() 21 if ok { 22 tag = bi 23 } 24 25 switch typ { 26 case "alpha": 27 return fmt.Sprintf("%s-alpha.%s", v, tag) 28 case "rc": 29 return fmt.Sprintf("%s-rc.%s", v, tag) 30 case "release": 31 // "+" is build-metadata; ignored to determine version precedence 32 return fmt.Sprintf("%s+%s", v, tag) 33 default: 34 panic("!") 35 } 36 } 37 38 //---------- 39 40 func getBuildInfo() (string, bool) { 41 bi, ok := debug.ReadBuildInfo() 42 if !ok { 43 return "", false 44 } 45 //spew.Dump(bi) 46 47 get := func(name string) (string, bool) { 48 for _, bs := range bi.Settings { 49 if bs.Key == name { 50 return bs.Value, true 51 } 52 } 53 return "", false 54 } 55 56 str := "" 57 addToStr := func(s string) { 58 if len(str) > 0 { 59 str += "-" 60 } 61 str += s 62 } 63 64 // vcs revision commit time 65 tstr, ok := get("vcs.time") 66 if ok { 67 t, err := time.Parse(time.RFC3339, tstr) 68 if err != nil { 69 return "", false 70 } 71 str := t.Format("20060102150405") 72 addToStr(str) 73 } 74 75 // vcs revision string 76 rev, ok := get("vcs.revision") 77 if ok { 78 if len(rev) > 12 { 79 rev = rev[:12] 80 } 81 addToStr(rev) 82 } 83 84 // modified since last commit 85 modified, ok := get("vcs.modified") 86 if ok && modified == "true" { 87 addToStr("modified") 88 } 89 90 return str, str != "" 91 }