github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/version/version.go (about)

     1  package version
     2  
     3  import (
     4  	"os"
     5  	"runtime/debug"
     6  	"strings"
     7  
     8  	"github.com/blang/semver/v4"
     9  )
    10  
    11  // Version is a "vSEMVER" string, and is either populated at build-time using `--ldflags -X`, or at
    12  // init()-time by inspecting the binary's own debug info.
    13  var (
    14  	Version    string         //nolint:gochecknoglobals // constant
    15  	Structured semver.Version //nolint:gochecknoglobals // constant
    16  )
    17  
    18  func init() {
    19  	// Prefer version number inserted at build using --ldflags, but if it's not set...
    20  	Version, Structured = Init(Version, "TELEPRESENCE_VERSION")
    21  }
    22  
    23  func Init(s, envKey string) (string, semver.Version) {
    24  	if s == "" {
    25  		if info, ok := debug.ReadBuildInfo(); ok {
    26  			// Fall back to version info from "go get"
    27  			s = info.Main.Version
    28  		}
    29  		if s == "" {
    30  			if s = os.Getenv(envKey); s == "" {
    31  				s = "0.0.0-unknown"
    32  			}
    33  		}
    34  	}
    35  	if s == "(devel)" {
    36  		s = "0.0.0-devel"
    37  	}
    38  	s = strings.TrimPrefix(s, "v")
    39  	sv, err := semver.Parse(s)
    40  	if err != nil {
    41  		panic(err)
    42  	}
    43  	return "v" + s, sv
    44  }
    45  
    46  func GetExecutable() (string, error) {
    47  	executable, err := os.Executable()
    48  	if err != nil {
    49  		return "", err
    50  	}
    51  	return executable, nil
    52  }