mirror of https://github.com/knative/func.git
				
				
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| package cmd
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/ory/viper"
 | |
| 	"github.com/spf13/cobra"
 | |
| )
 | |
| 
 | |
| // metadata about the build process/binary etc.
 | |
| // Not populated if building from source with go build.
 | |
| // Set by the `make` targets.
 | |
| var version = Version{}
 | |
| 
 | |
| // SetMeta is called by `main` with any provided build metadata
 | |
| func SetMeta(date, vers, hash string) {
 | |
| 	version.Date = date // build timestamp
 | |
| 	version.Vers = vers // version tag
 | |
| 	version.Hash = hash // git commit hash
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	root.AddCommand(versionCmd)
 | |
| }
 | |
| 
 | |
| var versionCmd = &cobra.Command{
 | |
| 	Use:   "version",
 | |
| 	Short: "Show the version",
 | |
| 	Long: `Show the version
 | |
| 
 | |
| Use the --verbose option to include the build date stamp and commit hash"
 | |
| `,
 | |
| 	SuggestFor: []string{"vers", "verison"},
 | |
| 	Run:        runVersion,
 | |
| }
 | |
| 
 | |
| func runVersion(cmd *cobra.Command, args []string) {
 | |
| 	// update version with the value of the (global) flag 'verbose'
 | |
| 	version.Verbose = viper.GetBool("verbose")
 | |
| 
 | |
| 	// version is the metadata, serialized.
 | |
| 	fmt.Println(version)
 | |
| }
 | |
| 
 | |
| // versionMetadata is set by the main package.
 | |
| // When compiled from source, they remain the zero value.
 | |
| // When compiled via `make`, they are initialized to the noted values.
 | |
| type Version struct {
 | |
| 	// Date of compilation
 | |
| 	Date string
 | |
| 	// Version tag of the git commit, or 'tip' if no tag.
 | |
| 	Vers string
 | |
| 	// Hash of the currently active git commit on build.
 | |
| 	Hash string
 | |
| 	// Verbose printing enabled for the string representation.
 | |
| 	Verbose bool
 | |
| }
 | |
| 
 | |
| func (v Version) String() string {
 | |
| 	// If 'vers' is not a semver already, then the binary was built either
 | |
| 	// from an untagged git commit (set semver to v0.0.0), or was built
 | |
| 	// directly from source (set semver to v0.0.0-source).
 | |
| 	if strings.HasPrefix(v.Vers, "v") {
 | |
| 		// Was built via make with a tagged commit
 | |
| 		if v.Verbose {
 | |
| 			return fmt.Sprintf("%s-%s-%s", v.Vers, v.Hash, v.Date)
 | |
| 		} else {
 | |
| 			return v.Vers
 | |
| 		}
 | |
| 	} else if v.Vers == "tip" {
 | |
| 		// Was built via make from an untagged commit
 | |
| 		v.Vers = "v0.0.0"
 | |
| 		if v.Verbose {
 | |
| 			return fmt.Sprintf("%s-%s-%s", v.Vers, v.Hash, v.Date)
 | |
| 		} else {
 | |
| 			return v.Vers
 | |
| 		}
 | |
| 	} else {
 | |
| 		// Was likely built from source
 | |
| 		v.Vers = "v0.0.0"
 | |
| 		v.Hash = "source"
 | |
| 		if v.Verbose {
 | |
| 			return fmt.Sprintf("%s-%s", v.Vers, v.Hash)
 | |
| 		} else {
 | |
| 			return v.Vers
 | |
| 		}
 | |
| 	}
 | |
| }
 |