@@ -6,6 +6,7 @@ package main
66
77import (
88 "context"
9+ _ "embed"
910 "flag"
1011 "fmt"
1112 "log/slog"
@@ -24,13 +25,32 @@ import (
2425 "github.com/google/go-github/v57/github"
2526)
2627
28+ // VERSION file embedded at compile time (created by make release)
29+ //
30+ //go:embed VERSION
31+ var versionFile string
32+
2733// Version information - set during build with -ldflags.
34+ // If not set via ldflags, getVersion() will read from embedded VERSION file.
2835var (
2936 version = "dev"
3037 commit = "unknown"
3138 date = "unknown"
3239)
3340
41+ // getVersion returns the version string, preferring ldflags but falling back to VERSION file.
42+ func getVersion () string {
43+ // If version was set via ldflags and isn't the default, use it
44+ if version != "" && version != "dev" {
45+ return version
46+ }
47+ // Fall back to embedded VERSION file
48+ if v := strings .TrimSpace (versionFile ); v != "" {
49+ return v
50+ }
51+ return "dev"
52+ }
53+
3454const (
3555 cacheTTL = 10 * 24 * time .Hour // 10 days - rely mostly on PR UpdatedAt
3656 runningTestsCacheTTL = 2 * time .Minute // Short TTL for PRs with incomplete tests to catch completions quickly
@@ -117,19 +137,27 @@ func main() {
117137 var targetUser string
118138 var noCache bool
119139 var debugMode bool
140+ var showVersion bool
120141 var updateInterval time.Duration
121142 var browserOpenDelay time.Duration
122143 var maxBrowserOpensMinute int
123144 var maxBrowserOpensDay int
124145 flag .StringVar (& targetUser , "user" , "" , "GitHub user to query PRs for (defaults to authenticated user)" )
125146 flag .BoolVar (& noCache , "no-cache" , false , "Bypass cache for debugging" )
126147 flag .BoolVar (& debugMode , "debug" , false , "Enable debug logging" )
148+ flag .BoolVar (& showVersion , "version" , false , "Show version information and exit" )
127149 flag .DurationVar (& updateInterval , "interval" , defaultUpdateInterval , "Update interval (e.g. 30s, 1m, 5m)" )
128150 flag .DurationVar (& browserOpenDelay , "browser-delay" , 1 * time .Minute , "Minimum delay before opening PRs in browser after startup" )
129151 flag .IntVar (& maxBrowserOpensMinute , "browser-max-per-minute" , 2 , "Maximum browser windows to open per minute" )
130152 flag .IntVar (& maxBrowserOpensDay , "browser-max-per-day" , defaultMaxBrowserOpensDay , "Maximum browser windows to open per day" )
131153 flag .Parse ()
132154
155+ // Handle version flag
156+ if showVersion {
157+ fmt .Printf ("goose version %s\n commit: %s\n built: %s\n " , getVersion (), commit , date )
158+ os .Exit (0 )
159+ }
160+
133161 // Validate target user if provided
134162 if targetUser != "" {
135163 if err := validateGitHubUsername (targetUser ); err != nil {
@@ -168,7 +196,7 @@ func main() {
168196 Level : logLevel ,
169197 }
170198 slog .SetDefault (slog .New (slog .NewTextHandler (os .Stderr , opts )))
171- slog .Info ("Starting Goose" , "version" , version , "commit" , commit , "date" , date )
199+ slog .Info ("Starting Goose" , "version" , getVersion () , "commit" , commit , "date" , date )
172200 slog .Info ("Configuration" , "update_interval" , updateInterval , "max_retries" , maxRetries , "max_delay" , maxRetryDelay )
173201 slog .Info ("Browser auto-open configuration" ,
174202 "startup_delay" , browserOpenDelay ,
0 commit comments