diff --git a/Makefile b/Makefile index 3fd45a3071d..ceddc3373a5 100644 --- a/Makefile +++ b/Makefile @@ -62,10 +62,10 @@ endif .PHONY: build-flags build-flags: pre-build $(eval BUILD_LDFLAGS := $(LDFLAGS)) - $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/api.buildstamp=$(BUILD_DATE)') - $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/api.githash=$(GITHASH)') - $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/api.version=$(STASH_VERSION)') - $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/manager/config.officialBuild=$(OFFICIAL_BUILD)') + $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/build.buildstamp=$(BUILD_DATE)') + $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/build.githash=$(GITHASH)') + $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/build.version=$(STASH_VERSION)') + $(eval BUILD_LDFLAGS += -X 'github.com/stashapp/stash/internal/build.officialBuild=$(OFFICIAL_BUILD)') $(eval BUILD_FLAGS := -v -tags "$(GO_BUILD_TAGS)" $(GO_BUILD_FLAGS) -ldflags "$(BUILD_LDFLAGS)") # builds a dynamically-linked debug binary diff --git a/internal/api/check_version.go b/internal/api/check_version.go index a2da99c9a06..b19727ab8c6 100644 --- a/internal/api/check_version.go +++ b/internal/api/check_version.go @@ -13,6 +13,7 @@ import ( "golang.org/x/sys/cpu" + "github.com/stashapp/stash/internal/build" "github.com/stashapp/stash/pkg/logger" ) @@ -170,7 +171,7 @@ func GetLatestRelease(ctx context.Context) (*LatestRelease, error) { wantedRelease := stashReleases()[platform] url := apiReleases - if IsDevelop() { + if build.IsDevelop() { // get the release tagged with the development tag url += "/tags/" + developmentTag } else { @@ -213,7 +214,7 @@ func GetLatestRelease(ctx context.Context) (*LatestRelease, error) { } } - _, githash, _ := GetVersion() + _, githash, _ := build.Version() shLength := len(githash) if shLength == 0 { shLength = defaultSHLength @@ -273,7 +274,7 @@ func printLatestVersion(ctx context.Context) { if err != nil { logger.Errorf("Couldn't retrieve latest version: %v", err) } else { - _, githash, _ = GetVersion() + _, githash, _ := build.Version() switch { case githash == "": logger.Infof("Latest version: %s (%s)", latestRelease.Version, latestRelease.ShortHash) diff --git a/internal/api/resolver.go b/internal/api/resolver.go index 0e1d33bbed7..3932270b794 100644 --- a/internal/api/resolver.go +++ b/internal/api/resolver.go @@ -7,6 +7,7 @@ import ( "sort" "strconv" + "github.com/stashapp/stash/internal/build" "github.com/stashapp/stash/internal/manager" "github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/models" @@ -188,7 +189,7 @@ func (r *queryResolver) Stats(ctx context.Context) (*StatsResultType, error) { } func (r *queryResolver) Version(ctx context.Context) (*Version, error) { - version, hash, buildtime := GetVersion() + version, hash, buildtime := build.Version() return &Version{ Version: &version, diff --git a/internal/api/server.go b/internal/api/server.go index 6450a27b43f..217d68543e5 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -11,7 +11,6 @@ import ( "net/http" "os" "path" - "regexp" "runtime/debug" "strconv" "strings" @@ -30,6 +29,7 @@ import ( "github.com/go-chi/cors" "github.com/go-chi/httplog" "github.com/stashapp/stash/internal/api/loaders" + "github.com/stashapp/stash/internal/build" "github.com/stashapp/stash/internal/manager" "github.com/stashapp/stash/internal/manager/config" "github.com/stashapp/stash/pkg/fsutil" @@ -46,10 +46,6 @@ const ( playgroundEndpoint = "/playground" ) -var version string -var buildstamp string -var githash string - var uiBox = ui.UIBox var loginUIBox = ui.LoginUIBox @@ -270,7 +266,7 @@ func Start() error { TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)), } - printVersion() + logger.Infof("stash version: %s\n", build.VersionString()) go printLatestVersion(context.TODO()) logger.Infof("stash is listening on " + address) if tlsConfig != nil { @@ -390,49 +386,6 @@ func customLocalesHandler(c *config.Instance) func(w http.ResponseWriter, r *htt } } -func printVersion() { - var versionString string - switch { - case version != "": - if githash != "" && !IsDevelop() { - versionString = version + " (" + githash + ")" - } else { - versionString = version - } - case githash != "": - versionString = githash - default: - versionString = "unknown" - } - if config.IsOfficialBuild() { - versionString += " - Official Build" - } else { - versionString += " - Unofficial Build" - } - if buildstamp != "" { - versionString += " - " + buildstamp - } - logger.Infof("stash version: %s\n", versionString) -} - -func GetVersion() (string, string, string) { - return version, githash, buildstamp -} - -func IsDevelop() bool { - if githash == "" { - return false - } - - // if the version is suffixed with -x-xxxx, then we are running a development build - develop := false - re := regexp.MustCompile(`-\d+-g\w+$`) - if re.MatchString(version) { - develop = true - } - return develop -} - func makeTLSConfig(c *config.Instance) (*tls.Config, error) { c.InitTLS() certFile, keyFile := c.GetTLSFiles() diff --git a/internal/build/version.go b/internal/build/version.go new file mode 100644 index 00000000000..84c5f819f4f --- /dev/null +++ b/internal/build/version.go @@ -0,0 +1,57 @@ +package build + +import ( + "regexp" +) + +var version string +var buildstamp string +var githash string +var officialBuild string + +func Version() (string, string, string) { + return version, githash, buildstamp +} + +func VersionString() string { + var versionString string + switch { + case version != "": + if githash != "" && !IsDevelop() { + versionString = version + " (" + githash + ")" + } else { + versionString = version + } + case githash != "": + versionString = githash + default: + versionString = "unknown" + } + if IsOfficial() { + versionString += " - Official Build" + } else { + versionString += " - Unofficial Build" + } + if buildstamp != "" { + versionString += " - " + buildstamp + } + return versionString +} + +func IsOfficial() bool { + return officialBuild == "true" +} + +func IsDevelop() bool { + if githash == "" { + return false + } + + // if the version is suffixed with -x-xxxx, then we are running a development build + develop := false + re := regexp.MustCompile(`-\d+-g\w+$`) + if re.MatchString(version) { + develop = true + } + return develop +} diff --git a/internal/desktop/desktop.go b/internal/desktop/desktop.go index 91d87ac10be..1e69a6c76cf 100644 --- a/internal/desktop/desktop.go +++ b/internal/desktop/desktop.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/pkg/browser" + "github.com/stashapp/stash/internal/build" "github.com/stashapp/stash/internal/manager/config" "github.com/stashapp/stash/pkg/fsutil" "github.com/stashapp/stash/pkg/logger" @@ -104,7 +105,7 @@ func writeStashIcon(faviconProvider FaviconProvider) { func IsAllowedAutoUpdate() bool { // Only try to update if downloaded from official sources - if !config.IsOfficialBuild() { + if !build.IsOfficial() { return false } diff --git a/internal/manager/config/config.go b/internal/manager/config/config.go index 2a242c114a3..3a339a13687 100644 --- a/internal/manager/config/config.go +++ b/internal/manager/config/config.go @@ -23,8 +23,6 @@ import ( "github.com/stashapp/stash/pkg/models/paths" ) -var officialBuild string - const ( Stash = "stash" Cache = "cache" @@ -275,10 +273,6 @@ func (s *StashBoxError) Error() string { return "Stash-box: " + s.msg } -func IsOfficialBuild() bool { - return officialBuild == "true" -} - type Instance struct { // main instance - backed by config file main *viper.Viper diff --git a/internal/manager/config/init.go b/internal/manager/config/init.go index 37a19143692..18cda5aa764 100644 --- a/internal/manager/config/init.go +++ b/internal/manager/config/init.go @@ -11,6 +11,7 @@ import ( "github.com/spf13/pflag" "github.com/spf13/viper" + "github.com/stashapp/stash/internal/build" "github.com/stashapp/stash/pkg/fsutil" "github.com/stashapp/stash/pkg/logger" ) @@ -25,6 +26,7 @@ type flagStruct struct { cpuProfilePath string nobrowser bool helpFlag bool + versionFlag bool } func GetInstance() *Instance { @@ -47,6 +49,11 @@ func Initialize() (*Instance, error) { os.Exit(0) } + if flags.versionFlag { + fmt.Printf(build.VersionString() + "\n") + os.Exit(0) + } + overrides := makeOverrideConfig() _ = GetInstance() @@ -134,6 +141,7 @@ func initFlags() flagStruct { pflag.StringVar(&flags.cpuProfilePath, "cpuprofile", "", "write cpu profile to file") pflag.BoolVar(&flags.nobrowser, "nobrowser", false, "Don't open a browser window after launch") pflag.BoolVarP(&flags.helpFlag, "help", "h", false, "show this help text and exit") + pflag.BoolVarP(&flags.versionFlag, "version", "v", false, "show version number and exit") pflag.Parse()