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  }