Files
dance-lessons-coach/pkg/version/version.go

111 lines
2.9 KiB
Go

// Package version provides version information and management for DanceLessonsCoach
package version
import (
"fmt"
"os"
"os/exec"
"runtime"
"strings"
)
// Version information - updated during build or from VERSION file
var (
Version = "1.0.0" // Semantic version (MAJOR.MINOR.PATCH)
Commit = "" // Git commit hash
Date = "" // Build date
GoVersion = runtime.Version() // Go version used to build
)
// init reads version from VERSION file if ldflags not used
func init() {
// Only read from VERSION file if Version is still default value
// This allows ldflags to override during build
if Version == "1.0.0" && Commit == "" && Date == "" {
readVersionFromFile()
}
}
// readVersionFromFile reads version info from VERSION file
func readVersionFromFile() {
data, err := os.ReadFile("VERSION")
if err != nil {
// File not found or can't read - keep default values
return
}
lines := strings.Split(string(data), "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "MAJOR=") {
Version = strings.TrimPrefix(line, "MAJOR=")
} else if strings.HasPrefix(line, "MINOR=") {
// Append minor to version
minor := strings.TrimPrefix(line, "MINOR=")
if Version != "1.0.0" {
Version = Version + "." + minor
}
} else if strings.HasPrefix(line, "PATCH=") {
// Append patch to version
patch := strings.TrimPrefix(line, "PATCH=")
if Version != "1.0.0" {
Version = Version + "." + patch
}
} else if strings.HasPrefix(line, "PRERELEASE=") {
pre := strings.TrimPrefix(line, "PRERELEASE=")
pre = strings.Trim(pre, `"`)
if pre != "" && Version != "1.0.0" {
Version = Version + "-" + pre
}
}
}
// Try to get git commit when running in development (go run)
if Commit == "" {
getGitCommit()
}
// Try to get build date when running in development (go run)
if Date == "" {
getBuildDate()
}
}
// getGitCommit tries to get the current git commit hash
func getGitCommit() {
cmd := exec.Command("git", "rev-parse", "--short", "HEAD")
output, err := cmd.Output()
if err == nil {
Commit = strings.TrimSpace(string(output))
}
}
// getBuildDate tries to get the current build date
func getBuildDate() {
cmd := exec.Command("date", "-u", "+%Y-%m-%dT%H:%M:%SZ")
output, err := cmd.Output()
if err == nil {
Date = strings.TrimSpace(string(output))
}
}
// Info returns formatted version information
func Info() string {
return fmt.Sprintf("DanceLessonsCoach %s (commit: %s, built: %s UTC, go: %s)", Version, Commit, Date, GoVersion)
}
// Short returns just the version number
func Short() string {
return Version
}
// Full returns detailed version information
func Full() string {
return fmt.Sprintf(`DanceLessonsCoach Version Information:
Version: %s
Commit: %s
Built: %s (UTC)
Go: %s`,
Version, Commit, Date, GoVersion)
}