1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-08 05:47:07 +09:00
anytype-heart/util/vcs/vcs.go
2024-02-07 15:01:31 +01:00

91 lines
1.7 KiB
Go

package vcs
import (
"fmt"
"runtime/debug"
"strconv"
"time"
)
var (
GitBranch, GitSummary, BuildDate, GitCommit string
)
type VCSInfo struct {
BuildDate time.Time
Revision string
Branch string
Summary string
Modified bool
CGO bool
}
func (v VCSInfo) Version() string {
if v.Summary != "" {
return v.Summary
}
if v.Revision == "" {
return "unknown"
}
rev := v.Revision
if len(rev) == 40 {
// trim sha1 to 8 chars
rev = rev[0:8]
}
if v.Modified {
rev = rev + "-dirty"
}
return rev
}
func (v VCSInfo) Description() string {
var desc string
if v.Branch != "" {
desc = fmt.Sprintf("build on %s from %s at #%s", v.BuildDate, v.Branch, v.Revision)
} else {
desc = fmt.Sprintf("build on %s at #%s", v.BuildDate, v.Revision)
}
if v.Modified {
desc += " (dirty)"
}
if !v.CGO {
desc += " (no-cgo)"
}
return desc
}
// GetVCSInfo returns git build info
// branch and summary are set by linker flags via govvv
func GetVCSInfo() VCSInfo {
info := VCSInfo{
Branch: GitBranch,
Summary: GitSummary,
CGO: true,
}
// we don't have a build date and commit in the gomobile builds, so inject it via linker flags
if BuildDate != "" {
info.BuildDate, _ = time.Parse(time.RFC3339, BuildDate)
}
if GitCommit != "" {
info.Revision = GitCommit
}
d, ok := debug.ReadBuildInfo()
if !ok {
return info
}
for _, setting := range d.Settings {
switch setting.Key {
case "vcs.time":
info.BuildDate, _ = time.Parse(time.RFC3339, setting.Value)
case "vcs.modified":
info.Modified, _ = strconv.ParseBool(setting.Value)
case "vcs.revision":
info.Revision = setting.Value
case "CGO_ENABLED":
info.CGO, _ = strconv.ParseBool(setting.Value)
}
}
return info
}