diff options
Diffstat (limited to 'version.go')
-rw-r--r-- | version.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/version.go b/version.go new file mode 100644 index 0000000..97bf83a --- /dev/null +++ b/version.go @@ -0,0 +1,103 @@ +package main + +import ( + "fmt" + "runtime" + "runtime/debug" + "strconv" + "strings" + + "github.com/rfjakob/gocryptfs/v2/internal/stupidgcm" + "github.com/rfjakob/gocryptfs/v2/internal/tlog" +) + +const ( + gitVersionNotSet = "[GitVersion not set - please compile using ./build.bash]" + gitVersionFuseNotSet = "[GitVersionFuse not set - please compile using ./build.bash]" + buildDateNotSet = "0000-00-00" +) + +var ( + // GitVersion is the gocryptfs version according to git, set by build.bash + GitVersion = gitVersionNotSet + // GitVersionFuse is the go-fuse library version, set by build.bash + GitVersionFuse = gitVersionFuseNotSet + // BuildDate is a date string like "2017-09-06", set by build.bash + BuildDate = buildDateNotSet +) + +func init() { + versionFromBuildInfo() +} + +// raceDetector is set to true by race.go if we are compiled with "go build -race" +var raceDetector bool + +// printVersion prints a version string like this: +// gocryptfs v1.7-32-gcf99cfd; go-fuse v1.0.0-174-g22a9cb9; 2019-05-12 go1.12 linux/amd64 +func printVersion() { + var tagsSlice []string + if stupidgcm.BuiltWithoutOpenssl { + tagsSlice = append(tagsSlice, "without_openssl") + } + tags := "" + if tagsSlice != nil { + tags = " " + strings.Join(tagsSlice, " ") + } + built := fmt.Sprintf("%s %s", BuildDate, runtime.Version()) + if raceDetector { + built += " -race" + } + fmt.Printf("%s %s%s; go-fuse %s; %s %s/%s\n", + tlog.ProgramName, GitVersion, tags, GitVersionFuse, built, + runtime.GOOS, runtime.GOARCH) +} + +// versionFromBuildInfo tries to get some information out of the information baked in +// by the Go compiler. Does nothing when build.bash was used to build. +func versionFromBuildInfo() { + info, ok := debug.ReadBuildInfo() + if !ok { + tlog.Debug.Println("versionFromBuildInfo: ReadBuildInfo() failed") + return + } + // Parse BuildSettings + var vcsRevision, vcsTime string + var vcsModified bool + for _, s := range info.Settings { + switch s.Key { + case "vcs.revision": + vcsRevision = s.Value + case "vcs.time": + vcsTime = s.Value + case "vcs.modified": + vcsModified, _ = strconv.ParseBool(s.Value) + } + } + // Fill our version strings + if GitVersion == gitVersionNotSet { + GitVersion = info.Main.Version + if GitVersion == "(devel)" && vcsRevision != "" { + GitVersion = fmt.Sprintf("vcs.revision=%s", vcsRevision) + } + if vcsModified { + GitVersion += "-dirty" + } + } + if GitVersionFuse == gitVersionFuseNotSet { + for _, m := range info.Deps { + if m.Path == "github.com/hanwen/go-fuse/v2" { + GitVersionFuse = m.Version + if m.Replace != nil { + GitVersionFuse = m.Replace.Version + } + break + } + } + } + if BuildDate == buildDateNotSet { + if vcsTime != "" { + BuildDate = fmt.Sprintf("vcs.time=%s", vcsTime) + } + } +} |