libgocryptfs/version.go

104 lines
2.7 KiB
Go

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)
}
}
}