// Package globals holds application-wide metadata (name, version, // commit) that is populated at build time via linker flags. package globals import ( "regexp" "strings" "time" ) // Appname is the application name, populated from main(). var Appname = "vaultik" //nolint:gochecknoglobals // set via -ldflags at build time // DevVersion is the version a binary reports when it was built without // git metadata: script/version emits it outside a git checkout, and an // unstamped `go build` keeps it. goreleaser's snapshot template stamps // it followed by "-" and the commit it was built from. It is // deliberately not a number. const DevVersion = "dev" // Version is the application version, populated from main(). var Version = DevVersion //nolint:gochecknoglobals // set via -ldflags at build time // Commit is the git commit hash, populated from main(). var Commit = "unknown" //nolint:gochecknoglobals // set via -ldflags at build time // CommitDate is the ISO-8601 date of the commit, populated from main(). var CommitDate = "unknown" //nolint:gochecknoglobals // set via -ldflags at build time // Author identifies the upstream author of vaultik. const Author = "Jeffrey Paul " // Homepage is the canonical URL for vaultik. const Homepage = "https://sneak.berlin/go/vaultik" // ReleasesURL is where tagged release artifacts are published. const ReleasesURL = "https://git.eeqj.de/sneak/vaultik/releases" // License is the SPDX identifier for the project license. const License = "MIT" // Globals contains application-wide configuration and metadata. type Globals struct { Appname string Version string Commit string CommitDate string StartTime time.Time } // New creates and returns a new Globals instance initialized with the // package-level variables. func New() (*Globals, error) { return &Globals{ Appname: Appname, Version: Version, Commit: Commit, CommitDate: CommitDate, }, nil } // IsDevVersion reports whether v names a development build rather than // a release. "dev" and goreleaser's snapshot "dev-" count, and so // does what `git describe --tags --always --dirty` gives a make or // docker build of an untagged commit: the bare short commit, or // tag-N-gHASH on a commit after a tag. Any version ending in "-dirty" // counts, a modified checkout of a tag ("v1.0.0-dirty") included. // A plain tag such as "v1.0.0" or "1.0.0" is a release. // // The empty string counts too. Nothing that knows its version reports // no version, so an empty Version means the stamping failed, and the // safe reading of "we could not establish that this is a release" is // that it is not one. The Makefile refuses to build at all in that // case; this is the second line of defence, for a binary linked by // something other than the Makefile. func IsDevVersion(v string) bool { if v == "" || v == DevVersion || strings.HasPrefix(v, DevVersion+"-") || strings.HasSuffix(v, "-dirty") { return true } return regexp.MustCompile(`^(.+-[0-9]+-g)?[0-9a-f]+$`).MatchString(v) } // shortCommitLen is the number of commit-hash characters ShortCommit keeps. const shortCommitLen = 12 // ShortCommit returns the first 12 chars of the commit hash, or the // whole string if it's shorter (e.g. "unknown"). func (g *Globals) ShortCommit() string { if len(g.Commit) > shortCommitLen { return g.Commit[:shortCommitLen] } return g.Commit }