From 6f1dbc4c679ee86c3ff3f601d936caa3bc7b92a1 Mon Sep 17 00:00:00 2001 From: Thomas Stromberg Date: Wed, 1 Oct 2025 11:55:22 -0400 Subject: [PATCH 1/4] More sprinkler reliability tuning --- cmd/goose/cache.go | 12 ++++- cmd/goose/github.go | 101 ++++++++++++++++++++++++++++++++------ cmd/goose/main.go | 10 ++++ cmd/goose/reliability.go | 17 ++++++- cmd/goose/sprinkler.go | 103 +++++++++++++++++++++++++++++++++------ go.mod | 8 +-- go.sum | 8 +++ 7 files changed, 221 insertions(+), 38 deletions(-) diff --git a/cmd/goose/cache.go b/cmd/goose/cache.go index 574b2a5..61280d9 100644 --- a/cmd/goose/cache.go +++ b/cmd/goose/cache.go @@ -161,6 +161,16 @@ func (app *App) turnData(ctx context.Context, url string, updatedAt time.Time) ( app.healthMonitor.recordAPICall(true) } + // Log Turn API response for debugging + if data != nil { + slog.Info("[TURN] API response details", + "url", url, + "test_state", data.PullRequest.TestState, + "state", data.PullRequest.State, + "merged", data.PullRequest.Merged, + "pending_checks", len(data.PullRequest.CheckSummary.Pending)) + } + // Save to cache (don't fail if caching fails) - skip if --no-cache is set // Don't cache when tests are incomplete - always re-poll to catch completion if !app.noCache { @@ -177,7 +187,7 @@ func (app *App) turnData(ctx context.Context, url string, updatedAt time.Time) ( slog.Debug("[CACHE] Skipping cache for PR with incomplete tests", "url", url, "test_state", testState, - "pending_checks", len(data.PullRequest.CheckSummary.PendingStatuses)) + "pending_checks", len(data.PullRequest.CheckSummary.Pending)) } if shouldCache { diff --git a/cmd/goose/github.go b/cmd/goose/github.go index 6f8023b..762477d 100644 --- a/cmd/goose/github.go +++ b/cmd/goose/github.go @@ -59,6 +59,91 @@ func (app *App) initClients(ctx context.Context) error { return nil } +// initSprinklerOrgs fetches the user's organizations and starts sprinkler monitoring. +func (app *App) initSprinklerOrgs(ctx context.Context) error { + if app.client == nil || app.sprinklerMonitor == nil { + return fmt.Errorf("client or sprinkler not initialized") + } + + // Get current user + user := "" + if app.currentUser != nil { + user = app.currentUser.GetLogin() + } + if app.targetUser != "" { + user = app.targetUser + } + if user == "" { + return fmt.Errorf("no user configured") + } + + slog.Info("[SPRINKLER] Fetching user's organizations", "user", user) + + // Fetch all orgs the user is a member of with retry + opts := &github.ListOptions{PerPage: 100} + var allOrgs []string + + for { + var orgs []*github.Organization + var resp *github.Response + + err := retry.Do(func() error { + // Create timeout context for API call + apiCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + var retryErr error + orgs, resp, retryErr = app.client.Organizations.List(apiCtx, user, opts) + if retryErr != nil { + slog.Debug("[SPRINKLER] Organizations.List failed (will retry)", "error", retryErr, "page", opts.Page) + return retryErr + } + return nil + }, + retry.Attempts(maxRetries), + retry.DelayType(retry.CombineDelay(retry.BackOffDelay, retry.RandomDelay)), + retry.MaxDelay(maxRetryDelay), + retry.OnRetry(func(n uint, err error) { + slog.Warn("[SPRINKLER] Organizations.List retry", "attempt", n+1, "error", err, "page", opts.Page) + }), + retry.Context(ctx), + ) + if err != nil { + // Gracefully degrade - continue without sprinkler if org fetch fails + slog.Warn("[SPRINKLER] Failed to fetch organizations after retries, sprinkler will not start", + "error", err, + "maxRetries", maxRetries) + return nil // Return nil to avoid blocking startup + } + + for _, org := range orgs { + if org.Login != nil { + allOrgs = append(allOrgs, *org.Login) + } + } + + if resp.NextPage == 0 { + break + } + opts.Page = resp.NextPage + } + + slog.Info("[SPRINKLER] Discovered user organizations", + "user", user, + "orgs", allOrgs, + "count", len(allOrgs)) + + // Update sprinkler with all orgs at once + if len(allOrgs) > 0 { + app.sprinklerMonitor.updateOrgs(allOrgs) + if err := app.sprinklerMonitor.start(); err != nil { + return fmt.Errorf("start sprinkler: %w", err) + } + } + + return nil +} + // token retrieves the GitHub token from GITHUB_TOKEN env var or gh CLI. func (*App) token(ctx context.Context) (string, error) { // Check GITHUB_TOKEN environment variable first @@ -410,22 +495,6 @@ func (app *App) fetchPRsInternal(ctx context.Context) (incoming []PR, outgoing [ // Only log summary, not individual PRs slog.Info("[GITHUB] GitHub PR summary", "incoming", len(incoming), "outgoing", len(outgoing)) - // Update sprinkler monitor with discovered orgs - app.mu.RLock() - orgs := make([]string, 0, len(app.seenOrgs)) - for org := range app.seenOrgs { - orgs = append(orgs, org) - } - app.mu.RUnlock() - - if app.sprinklerMonitor != nil && len(orgs) > 0 { - app.sprinklerMonitor.updateOrgs(orgs) - // Start monitor if not already running - if err := app.sprinklerMonitor.start(); err != nil { - slog.Warn("[SPRINKLER] Failed to start monitor", "error", err) - } - } - // Fetch Turn API data // Always synchronous now for simplicity - Turn API calls are fast with caching app.fetchTurnDataSync(ctx, allIssues, user, &incoming, &outgoing) diff --git a/cmd/goose/main.go b/cmd/goose/main.go index 06bc848..e623357 100644 --- a/cmd/goose/main.go +++ b/cmd/goose/main.go @@ -227,6 +227,9 @@ func main() { githubCircuit: newCircuitBreaker("github", 5, 2*time.Minute), } + // Set app reference in health monitor for sprinkler status + app.healthMonitor.app = app + // Load saved settings app.loadSettings() @@ -270,6 +273,13 @@ func main() { if app.targetUser != "" && app.targetUser != user.GetLogin() { slog.Info("Querying PRs for different user", "targetUser", sanitizeForLog(app.targetUser)) } + + // Initialize sprinkler with user's organizations now that we have the user + go func() { + if err := app.initSprinklerOrgs(ctx); err != nil { + slog.Warn("[SPRINKLER] Failed to initialize organizations", "error", err) + } + }() } else { slog.Warn("GitHub API returned nil user") } diff --git a/cmd/goose/reliability.go b/cmd/goose/reliability.go index 5882181..f522716 100644 --- a/cmd/goose/reliability.go +++ b/cmd/goose/reliability.go @@ -114,6 +114,7 @@ type healthMonitor struct { apiErrors int64 cacheHits int64 cacheMisses int64 + app *App // Reference to app for accessing sprinkler status } func newHealthMonitor() *healthMonitor { @@ -174,10 +175,24 @@ func (hm *healthMonitor) getMetrics() map[string]interface{} { func (hm *healthMonitor) logMetrics() { metrics := hm.getMetrics() + + // Get sprinkler connection status + sprinklerConnected := false + sprinklerLastConnected := "" + if hm.app.sprinklerMonitor != nil { + connected, lastConnectedAt := hm.app.sprinklerMonitor.connectionStatus() + sprinklerConnected = connected + if !lastConnectedAt.IsZero() { + sprinklerLastConnected = time.Since(lastConnectedAt).Round(time.Second).String() + " ago" + } + } + slog.Info("[HEALTH] Application metrics", "uptime", metrics["uptime"], "api_calls", metrics["api_calls"], "api_errors", metrics["api_errors"], "error_rate_pct", fmt.Sprintf("%.1f", metrics["error_rate"]), - "cache_hit_rate_pct", fmt.Sprintf("%.1f", metrics["cache_hit_rate"])) + "cache_hit_rate_pct", fmt.Sprintf("%.1f", metrics["cache_hit_rate"]), + "sprinkler_connected", sprinklerConnected, + "sprinkler_last_connected", sprinklerLastConnected) } diff --git a/cmd/goose/sprinkler.go b/cmd/goose/sprinkler.go index 2c8dd90..76805ab 100644 --- a/cmd/goose/sprinkler.go +++ b/cmd/goose/sprinkler.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "log/slog" + "sort" "strings" "sync" "time" @@ -27,16 +28,18 @@ const ( // sprinklerMonitor manages WebSocket event subscriptions for all user orgs. type sprinklerMonitor struct { - app *App - client *client.Client - cancel context.CancelFunc - eventChan chan string // Channel for PR URLs that need checking - lastEventMap map[string]time.Time // Track last event per URL to dedupe - token string - orgs []string - ctx context.Context - mu sync.RWMutex - isRunning bool + app *App + client *client.Client + cancel context.CancelFunc + eventChan chan string // Channel for PR URLs that need checking + lastEventMap map[string]time.Time // Track last event per URL to dedupe + token string + orgs []string + ctx context.Context + mu sync.RWMutex + isRunning bool + isConnected bool // Track WebSocket connection status + lastConnectedAt time.Time // Last successful connection time } // newSprinklerMonitor creates a new sprinkler monitor for real-time PR events. @@ -58,21 +61,58 @@ func (sm *sprinklerMonitor) updateOrgs(orgs []string) { sm.mu.Lock() defer sm.mu.Unlock() - // Check if orgs changed - if len(orgs) == len(sm.orgs) { + // Sort both lists for comparison + sortedNew := make([]string, len(orgs)) + copy(sortedNew, orgs) + sort.Strings(sortedNew) + + sortedOld := make([]string, len(sm.orgs)) + copy(sortedOld, sm.orgs) + sort.Strings(sortedOld) + + // Check if orgs changed after sorting + if len(sortedNew) == len(sortedOld) { same := true - for i := range orgs { - if orgs[i] != sm.orgs[i] { + for i := range sortedNew { + if sortedNew[i] != sortedOld[i] { same = false break } } if same { + slog.Debug("[SPRINKLER] Org list unchanged (same after sorting)", + "orgs", sortedNew, + "count", len(sortedNew)) return // No change } } - slog.Info("[SPRINKLER] Updating monitored organizations", "orgs", orgs) + // Find what changed + added := []string{} + removed := []string{} + oldMap := make(map[string]bool) + for _, org := range sm.orgs { + oldMap[org] = true + } + newMap := make(map[string]bool) + for _, org := range orgs { + newMap[org] = true + if !oldMap[org] { + added = append(added, org) + } + } + for _, org := range sm.orgs { + if !newMap[org] { + removed = append(removed, org) + } + } + + slog.Info("[SPRINKLER] Organization list changed", + "previous", sm.orgs, + "new", orgs, + "added", added, + "removed", removed) + sm.orgs = make([]string, len(orgs)) copy(sm.orgs, orgs) @@ -127,9 +167,16 @@ func (sm *sprinklerMonitor) start() error { NoReconnect: false, Logger: sprinklerLogger, OnConnect: func() { + sm.mu.Lock() + sm.isConnected = true + sm.lastConnectedAt = time.Now() + sm.mu.Unlock() slog.Info("[SPRINKLER] WebSocket connected") }, OnDisconnect: func(err error) { + sm.mu.Lock() + sm.isConnected = false + sm.mu.Unlock() if err != nil && !errors.Is(err, context.Canceled) { slog.Warn("[SPRINKLER] WebSocket disconnected", "error", err) } @@ -269,12 +316,29 @@ func (sm *sprinklerMonitor) handleEvent(event client.Event) { // processEvents handles PR events by checking if they're blocking and notifying. func (sm *sprinklerMonitor) processEvents() { + defer func() { + if r := recover(); r != nil { + slog.Error("[SPRINKLER] Event processor panic", + "panic", r) + } + }() + for { select { case <-sm.ctx.Done(): return case prURL := <-sm.eventChan: - sm.checkAndNotify(prURL) + // Process each event with panic recovery + func() { + defer func() { + if r := recover(); r != nil { + slog.Error("[SPRINKLER] Event processing panic", + "panic", r, + "url", prURL) + } + }() + sm.checkAndNotify(prURL) + }() } } } @@ -550,6 +614,13 @@ func (sm *sprinklerMonitor) stop() { sm.isRunning = false } +// connectionStatus returns the current WebSocket connection status. +func (sm *sprinklerMonitor) connectionStatus() (connected bool, lastConnectedAt time.Time) { + sm.mu.RLock() + defer sm.mu.RUnlock() + return sm.isConnected, sm.lastConnectedAt +} + // parseRepoAndNumberFromURL extracts repo and PR number from URL. func parseRepoAndNumberFromURL(url string) (repo string, number int) { // URL format: https://github.com/org/repo/pull/123 diff --git a/go.mod b/go.mod index 5aba8e4..791306c 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ module github.com/ready-to-review/goose -go 1.24.0 +go 1.25.1 require ( github.com/codeGROOVE-dev/retry v1.2.0 - github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001125233-5fa6f0ff4582 - github.com/codeGROOVE-dev/turnclient v0.0.0-20250922145707-664c2dcdf5b8 + github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d + github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826 github.com/energye/systray v1.0.2 github.com/gen2brain/beeep v0.11.1 github.com/google/go-github/v57 v57.0.0 @@ -14,7 +14,7 @@ require ( require ( git.sr.ht/~jackmordaunt/go-toast v1.1.2 // indirect - github.com/codeGROOVE-dev/prx v0.0.0-20250923100916-d2b60be50274 // indirect + github.com/codeGROOVE-dev/prx v0.0.0-20251001143458-17e6b58fb46c // indirect github.com/esiqveland/notify v0.13.3 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect diff --git a/go.sum b/go.sum index 6151a8d..079c23e 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,20 @@ git.sr.ht/~jackmordaunt/go-toast v1.1.2 h1:/yrfI55LRt1M7H1vkaw+NaH1+L1CDxrqDltwm git.sr.ht/~jackmordaunt/go-toast v1.1.2/go.mod h1:jA4OqHKTQ4AFBdwrSnwnskUIIS3HYzlJSgdzCKqfavo= github.com/codeGROOVE-dev/prx v0.0.0-20250923100916-d2b60be50274 h1:9eLzQdOaQEn30279ai3YjNdJOM/efbcYanWC9juAJ+M= github.com/codeGROOVE-dev/prx v0.0.0-20250923100916-d2b60be50274/go.mod h1:7qLbi18baOyS8yO/6/64SBIqtyzSzLFdsDST15NPH3w= +github.com/codeGROOVE-dev/prx v0.0.0-20251001143458-17e6b58fb46c h1:/rrjFoqwFqKNzc1f14vQt6QJ9U5tQ4Uh6U8hgixkSqw= +github.com/codeGROOVE-dev/prx v0.0.0-20251001143458-17e6b58fb46c/go.mod h1:7qLbi18baOyS8yO/6/64SBIqtyzSzLFdsDST15NPH3w= github.com/codeGROOVE-dev/retry v1.2.0 h1:xYpYPX2PQZmdHwuiQAGGzsBm392xIMl4nfMEFApQnu8= github.com/codeGROOVE-dev/retry v1.2.0/go.mod h1:8OgefgV1XP7lzX2PdKlCXILsYKuz6b4ZpHa/20iLi8E= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001125233-5fa6f0ff4582 h1:IPCaNGRWdyMZKyjnjv+wdSmPmOZtKFD6SVaha5DuCqk= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001125233-5fa6f0ff4582/go.mod h1:RZ/Te7HkY5upHQlnmf3kV4GHVM0R8AK3U+yPItCZAoQ= +github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001144140-ed20651ca4e9 h1:Nuyy0vMl6YD96N6WwZeqClPa/VlaILJYZoG50ezOAHw= +github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001144140-ed20651ca4e9/go.mod h1:RZ/Te7HkY5upHQlnmf3kV4GHVM0R8AK3U+yPItCZAoQ= +github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d h1:tQX67dAzyWVAaNe0EhYpj/AmWZo1Wwhaah6KVj7M3qs= +github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d/go.mod h1:RZ/Te7HkY5upHQlnmf3kV4GHVM0R8AK3U+yPItCZAoQ= github.com/codeGROOVE-dev/turnclient v0.0.0-20250922145707-664c2dcdf5b8 h1:3088TLJGgxzjM/bR1gafKQ609NMkBNlZe1Fd5SnRrrY= github.com/codeGROOVE-dev/turnclient v0.0.0-20250922145707-664c2dcdf5b8/go.mod h1:7lBF4vS6T+D1rNjmJ+CNVrXALQvdwNfBVEy7vhIQtYk= +github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826 h1:ly6n4spiC6r0IOMl8QfZjv+qUnMHLvo/qErGPVMV3IE= +github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826/go.mod h1:JXk9gT6Qb496lnTcgpk9h917XaREGa+t6Kvg0YHAQJY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 3b814a3d4820cb651c890a8969b68b9dfd4b4f00 Mon Sep 17 00:00:00 2001 From: Thomas Stromberg Date: Wed, 1 Oct 2025 12:04:02 -0400 Subject: [PATCH 2/4] downgrade to go 1.24, add auto-open debugging --- cmd/goose/browser_rate_limiter.go | 14 ++++-- cmd/goose/icons.go | 13 ----- cmd/goose/main.go | 7 +++ cmd/goose/sprinkler.go | 82 +++---------------------------- go.sum | 8 --- 5 files changed, 24 insertions(+), 100 deletions(-) diff --git a/cmd/goose/browser_rate_limiter.go b/cmd/goose/browser_rate_limiter.go index 639fb37..9f0909b 100644 --- a/cmd/goose/browser_rate_limiter.go +++ b/cmd/goose/browser_rate_limiter.go @@ -37,15 +37,20 @@ func (b *BrowserRateLimiter) CanOpen(startTime time.Time, prURL string) bool { b.mu.Lock() defer b.mu.Unlock() + slog.Info("[BROWSER] CanOpen check", + "url", prURL, + "time_since_start", time.Since(startTime).Round(time.Second), + "startup_delay", b.startupDelay) + // Check if we've already opened this PR if b.openedPRs[prURL] { - slog.Debug("[BROWSER] Skipping auto-open: PR already opened", "url", prURL) + slog.Info("[BROWSER] Skipping auto-open: PR already opened", "url", prURL) return false } // Check startup delay if time.Since(startTime) < b.startupDelay { - slog.Debug("[BROWSER] Skipping auto-open: within startup delay period", + slog.Info("[BROWSER] Skipping auto-open: within startup delay period", "remaining", b.startupDelay-time.Since(startTime)) return false } @@ -57,18 +62,19 @@ func (b *BrowserRateLimiter) CanOpen(startTime time.Time, prURL string) bool { // Check per-minute limit if len(b.openedLastMinute) >= b.maxPerMinute { - slog.Debug("[BROWSER] Rate limit: per-minute limit reached", + slog.Info("[BROWSER] Rate limit: per-minute limit reached", "opened", len(b.openedLastMinute), "max", b.maxPerMinute) return false } // Check per-day limit if len(b.openedToday) >= b.maxPerDay { - slog.Debug("[BROWSER] Rate limit: daily limit reached", + slog.Info("[BROWSER] Rate limit: daily limit reached", "opened", len(b.openedToday), "max", b.maxPerDay) return false } + slog.Info("[BROWSER] CanOpen returning true", "url", prURL) return true } diff --git a/cmd/goose/icons.go b/cmd/goose/icons.go index aa8bdf3..b6babf2 100644 --- a/cmd/goose/icons.go +++ b/cmd/goose/icons.go @@ -2,8 +2,6 @@ package main import ( "log/slog" - "os" - "path/filepath" ) // Icon variables are defined in platform-specific files: @@ -43,17 +41,6 @@ func getIcon(iconType IconType) []byte { } } -// loadIconFromFile loads an icon from the filesystem (fallback if embed fails). -func loadIconFromFile(filename string) []byte { - iconPath := filepath.Join("icons", filename) - data, err := os.ReadFile(iconPath) - if err != nil { - slog.Warn("Failed to load icon file", "path", iconPath, "error", err) - return nil - } - return data -} - // setTrayIcon updates the system tray icon based on PR counts. func (app *App) setTrayIcon(iconType IconType) { iconBytes := getIcon(iconType) diff --git a/cmd/goose/main.go b/cmd/goose/main.go index e623357..4cd83f5 100644 --- a/cmd/goose/main.go +++ b/cmd/goose/main.go @@ -832,7 +832,14 @@ func (app *App) updatePRsWithWait(ctx context.Context) { // tryAutoOpenPR attempts to open a PR in the browser if enabled and rate limits allow. func (app *App) tryAutoOpenPR(ctx context.Context, pr PR, autoBrowserEnabled bool, startTime time.Time) { + slog.Debug("[BROWSER] tryAutoOpenPR called", + "repo", pr.Repository, + "number", pr.Number, + "enabled", autoBrowserEnabled, + "time_since_start", time.Since(startTime).Round(time.Second)) + if !autoBrowserEnabled { + slog.Debug("[BROWSER] Auto-open disabled, skipping") return } diff --git a/cmd/goose/sprinkler.go b/cmd/goose/sprinkler.go index 76805ab..bf2f067 100644 --- a/cmd/goose/sprinkler.go +++ b/cmd/goose/sprinkler.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "log/slog" - "sort" "strings" "sync" "time" @@ -56,75 +55,19 @@ func newSprinklerMonitor(app *App, token string) *sprinklerMonitor { } } -// updateOrgs updates the list of organizations to monitor. +// updateOrgs sets the list of organizations to monitor. func (sm *sprinklerMonitor) updateOrgs(orgs []string) { sm.mu.Lock() defer sm.mu.Unlock() - // Sort both lists for comparison - sortedNew := make([]string, len(orgs)) - copy(sortedNew, orgs) - sort.Strings(sortedNew) - - sortedOld := make([]string, len(sm.orgs)) - copy(sortedOld, sm.orgs) - sort.Strings(sortedOld) - - // Check if orgs changed after sorting - if len(sortedNew) == len(sortedOld) { - same := true - for i := range sortedNew { - if sortedNew[i] != sortedOld[i] { - same = false - break - } - } - if same { - slog.Debug("[SPRINKLER] Org list unchanged (same after sorting)", - "orgs", sortedNew, - "count", len(sortedNew)) - return // No change - } - } - - // Find what changed - added := []string{} - removed := []string{} - oldMap := make(map[string]bool) - for _, org := range sm.orgs { - oldMap[org] = true - } - newMap := make(map[string]bool) - for _, org := range orgs { - newMap[org] = true - if !oldMap[org] { - added = append(added, org) - } - } - for _, org := range sm.orgs { - if !newMap[org] { - removed = append(removed, org) - } + if len(orgs) == 0 { + slog.Debug("[SPRINKLER] No organizations provided") + return } - slog.Info("[SPRINKLER] Organization list changed", - "previous", sm.orgs, - "new", orgs, - "added", added, - "removed", removed) - + slog.Info("[SPRINKLER] Setting organizations", "orgs", orgs, "count", len(orgs)) sm.orgs = make([]string, len(orgs)) copy(sm.orgs, orgs) - - // Restart if running - if sm.isRunning { - slog.Info("[SPRINKLER] Restarting monitor with new org list") - sm.stop() - sm.ctx, sm.cancel = context.WithCancel(context.Background()) - if err := sm.start(); err != nil { - slog.Error("[SPRINKLER] Failed to restart", "error", err) - } - } } // start begins monitoring for PR events across all user orgs. @@ -318,8 +261,7 @@ func (sm *sprinklerMonitor) handleEvent(event client.Event) { func (sm *sprinklerMonitor) processEvents() { defer func() { if r := recover(); r != nil { - slog.Error("[SPRINKLER] Event processor panic", - "panic", r) + slog.Error("[SPRINKLER] Event processor panic", "panic", r) } }() @@ -328,17 +270,7 @@ func (sm *sprinklerMonitor) processEvents() { case <-sm.ctx.Done(): return case prURL := <-sm.eventChan: - // Process each event with panic recovery - func() { - defer func() { - if r := recover(); r != nil { - slog.Error("[SPRINKLER] Event processing panic", - "panic", r, - "url", prURL) - } - }() - sm.checkAndNotify(prURL) - }() + sm.checkAndNotify(prURL) } } } diff --git a/go.sum b/go.sum index 079c23e..d6ec960 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,11 @@ git.sr.ht/~jackmordaunt/go-toast v1.1.2 h1:/yrfI55LRt1M7H1vkaw+NaH1+L1CDxrqDltwm5euVuE= git.sr.ht/~jackmordaunt/go-toast v1.1.2/go.mod h1:jA4OqHKTQ4AFBdwrSnwnskUIIS3HYzlJSgdzCKqfavo= -github.com/codeGROOVE-dev/prx v0.0.0-20250923100916-d2b60be50274 h1:9eLzQdOaQEn30279ai3YjNdJOM/efbcYanWC9juAJ+M= -github.com/codeGROOVE-dev/prx v0.0.0-20250923100916-d2b60be50274/go.mod h1:7qLbi18baOyS8yO/6/64SBIqtyzSzLFdsDST15NPH3w= github.com/codeGROOVE-dev/prx v0.0.0-20251001143458-17e6b58fb46c h1:/rrjFoqwFqKNzc1f14vQt6QJ9U5tQ4Uh6U8hgixkSqw= github.com/codeGROOVE-dev/prx v0.0.0-20251001143458-17e6b58fb46c/go.mod h1:7qLbi18baOyS8yO/6/64SBIqtyzSzLFdsDST15NPH3w= github.com/codeGROOVE-dev/retry v1.2.0 h1:xYpYPX2PQZmdHwuiQAGGzsBm392xIMl4nfMEFApQnu8= github.com/codeGROOVE-dev/retry v1.2.0/go.mod h1:8OgefgV1XP7lzX2PdKlCXILsYKuz6b4ZpHa/20iLi8E= -github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001125233-5fa6f0ff4582 h1:IPCaNGRWdyMZKyjnjv+wdSmPmOZtKFD6SVaha5DuCqk= -github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001125233-5fa6f0ff4582/go.mod h1:RZ/Te7HkY5upHQlnmf3kV4GHVM0R8AK3U+yPItCZAoQ= -github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001144140-ed20651ca4e9 h1:Nuyy0vMl6YD96N6WwZeqClPa/VlaILJYZoG50ezOAHw= -github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001144140-ed20651ca4e9/go.mod h1:RZ/Te7HkY5upHQlnmf3kV4GHVM0R8AK3U+yPItCZAoQ= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d h1:tQX67dAzyWVAaNe0EhYpj/AmWZo1Wwhaah6KVj7M3qs= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d/go.mod h1:RZ/Te7HkY5upHQlnmf3kV4GHVM0R8AK3U+yPItCZAoQ= -github.com/codeGROOVE-dev/turnclient v0.0.0-20250922145707-664c2dcdf5b8 h1:3088TLJGgxzjM/bR1gafKQ609NMkBNlZe1Fd5SnRrrY= -github.com/codeGROOVE-dev/turnclient v0.0.0-20250922145707-664c2dcdf5b8/go.mod h1:7lBF4vS6T+D1rNjmJ+CNVrXALQvdwNfBVEy7vhIQtYk= github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826 h1:ly6n4spiC6r0IOMl8QfZjv+qUnMHLvo/qErGPVMV3IE= github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826/go.mod h1:JXk9gT6Qb496lnTcgpk9h917XaREGa+t6Kvg0YHAQJY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 9f0a12fab9797329d43dcfc058b9f7c4c59f738d Mon Sep 17 00:00:00 2001 From: Thomas Stromberg Date: Wed, 1 Oct 2025 15:52:58 -0400 Subject: [PATCH 3/4] use go1.24, add cockroach --- cmd/goose/icons.go | 15 +++++++++------ cmd/goose/icons_unix.go | 3 +++ cmd/goose/icons_windows.go | 5 ++++- cmd/goose/ui.go | 27 +++++++++++++++++++++++++-- go.mod | 7 +++---- go.sum | 8 ++++---- 6 files changed, 48 insertions(+), 17 deletions(-) diff --git a/cmd/goose/icons.go b/cmd/goose/icons.go index b6babf2..73212b7 100644 --- a/cmd/goose/icons.go +++ b/cmd/goose/icons.go @@ -12,12 +12,13 @@ import ( type IconType int const ( - IconSmiling IconType = iota // No blocked PRs - IconGoose // Incoming PRs blocked - IconPopper // Outgoing PRs blocked - IconBoth // Both incoming and outgoing blocked - IconWarning // General error/warning - IconLock // Authentication error + IconSmiling IconType = iota // No blocked PRs + IconGoose // Incoming PRs blocked + IconPopper // Outgoing PRs blocked + IconCockroach // Outgoing PRs blocked (fix_tests only) + IconBoth // Both incoming and outgoing blocked + IconWarning // General error/warning + IconLock // Authentication error ) // getIcon returns the icon bytes for the given type. @@ -27,6 +28,8 @@ func getIcon(iconType IconType) []byte { return iconGoose case IconPopper: return iconPopper + case IconCockroach: + return iconCockroach case IconSmiling: return iconSmiling case IconWarning: diff --git a/cmd/goose/icons_unix.go b/cmd/goose/icons_unix.go index 86210b1..9a82e46 100644 --- a/cmd/goose/icons_unix.go +++ b/cmd/goose/icons_unix.go @@ -22,3 +22,6 @@ var iconLock []byte //go:embed icons/warning.png var iconWarning []byte + +//go:embed icons/cockroach.png +var iconCockroach []byte diff --git a/cmd/goose/icons_windows.go b/cmd/goose/icons_windows.go index 1afb253..4a9af74 100644 --- a/cmd/goose/icons_windows.go +++ b/cmd/goose/icons_windows.go @@ -20,5 +20,8 @@ var iconSmiling []byte //go:embed icons/warning.ico var iconWarning []byte +//go:embed icons/cockroach.ico +var iconCockroach []byte + // lock.ico not yet created, using warning as fallback -var iconLock = iconWarning \ No newline at end of file +var iconLock = iconWarning diff --git a/cmd/goose/ui.go b/cmd/goose/ui.go index dc76ef2..8a1816e 100644 --- a/cmd/goose/ui.go +++ b/cmd/goose/ui.go @@ -190,6 +190,21 @@ func (app *App) countPRs() PRCounts { func (app *App) setTrayTitle() { counts := app.countPRs() + // Check if all outgoing blocked PRs are fix_tests only + allOutgoingAreFixTests := false + if counts.OutgoingBlocked > 0 && counts.IncomingBlocked == 0 { + app.mu.RLock() + allFixTests := true + for i := range app.outgoing { + if app.outgoing[i].IsBlocked && app.outgoing[i].ActionKind != "fix_tests" { + allFixTests = false + break + } + } + app.mu.RUnlock() + allOutgoingAreFixTests = allFixTests + } + // Set title and icon based on PR state var title string var iconType IconType @@ -210,7 +225,11 @@ func (app *App) setTrayTitle() { iconType = IconGoose default: title = fmt.Sprintf("%d", counts.OutgoingBlocked) - iconType = IconPopper + if allOutgoingAreFixTests { + iconType = IconCockroach + } else { + iconType = IconPopper + } } } else { // All other platforms: icon only, no text @@ -223,7 +242,11 @@ func (app *App) setTrayTitle() { case counts.IncomingBlocked > 0: iconType = IconGoose default: - iconType = IconPopper + if allOutgoingAreFixTests { + iconType = IconCockroach + } else { + iconType = IconPopper + } } } diff --git a/go.mod b/go.mod index 791306c..d7a1393 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ -module github.com/ready-to-review/goose +module github.com/codeGROOVE-dev/goose -go 1.25.1 +go 1.24.0 require ( github.com/codeGROOVE-dev/retry v1.2.0 github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d - github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826 + github.com/codeGROOVE-dev/turnclient v0.0.0-20251001194229-2aaea2e63cc7 github.com/energye/systray v1.0.2 github.com/gen2brain/beeep v0.11.1 github.com/google/go-github/v57 v57.0.0 @@ -18,7 +18,6 @@ require ( github.com/esiqveland/notify v0.13.3 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/jackmordaunt/icns/v3 v3.0.1 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect diff --git a/go.sum b/go.sum index d6ec960..8781f1b 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/codeGROOVE-dev/retry v1.2.0 h1:xYpYPX2PQZmdHwuiQAGGzsBm392xIMl4nfMEFA github.com/codeGROOVE-dev/retry v1.2.0/go.mod h1:8OgefgV1XP7lzX2PdKlCXILsYKuz6b4ZpHa/20iLi8E= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d h1:tQX67dAzyWVAaNe0EhYpj/AmWZo1Wwhaah6KVj7M3qs= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251001154245-068712aa969d/go.mod h1:RZ/Te7HkY5upHQlnmf3kV4GHVM0R8AK3U+yPItCZAoQ= -github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826 h1:ly6n4spiC6r0IOMl8QfZjv+qUnMHLvo/qErGPVMV3IE= -github.com/codeGROOVE-dev/turnclient v0.0.0-20251001151440-a58eb9b17826/go.mod h1:JXk9gT6Qb496lnTcgpk9h917XaREGa+t6Kvg0YHAQJY= +github.com/codeGROOVE-dev/turnclient v0.0.0-20251001194229-2aaea2e63cc7 h1:iRWrlJusl5FiEC1sCiPoW8IFei5bebAIornGtQFUHbc= +github.com/codeGROOVE-dev/turnclient v0.0.0-20251001194229-2aaea2e63cc7/go.mod h1:Rt0k+aoZ13TvXKl9n2AeBabWIXZ/xIvurdwFTgyNk0w= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -23,8 +23,8 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v57 v57.0.0 h1:L+Y3UPTY8ALM8x+TV0lg+IEBI+upibemtBD8Q9u7zHs= github.com/google/go-github/v57 v57.0.0/go.mod h1:s0omdnye0hvK/ecLvpsGfJMiRt85PimQh4oygmLIxHw= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= From 1c3a2afdf930365154167ae7d34787fb865717cb Mon Sep 17 00:00:00 2001 From: Thomas Stromberg Date: Wed, 1 Oct 2025 15:54:13 -0400 Subject: [PATCH 4/4] add missing cockroaches --- cmd/goose/icons/cockroach.ico | Bin 0 -> 37738 bytes cmd/goose/icons/cockroach.png | Bin 0 -> 34022 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 cmd/goose/icons/cockroach.ico create mode 100644 cmd/goose/icons/cockroach.png diff --git a/cmd/goose/icons/cockroach.ico b/cmd/goose/icons/cockroach.ico new file mode 100644 index 0000000000000000000000000000000000000000..bb5dae76437342c51d9b112af028ecb293a60e3d GIT binary patch literal 37738 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 C@{mdZ literal 0 HcmV?d00001 diff --git a/cmd/goose/icons/cockroach.png b/cmd/goose/icons/cockroach.png new file mode 100644 index 0000000000000000000000000000000000000000..b5696f1d0aa7590290de12d7b516a27297d4fb0c GIT binary patch literal 34022 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 literal 0 HcmV?d00001