aboutsummaryrefslogtreecommitdiff
path: root/version.go
blob: 97bf83a15f05c1b1fb49f01e59454ef525aa09a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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)
		}
	}
}