diff --git a/internal/core/core.go b/internal/core/core.go index 3bec217..dfda3c1 100644 --- a/internal/core/core.go +++ b/internal/core/core.go @@ -277,6 +277,13 @@ func (b *Base) finalizeUpgrades() { // 3) bulk refresh version cache per upgraded package (after cleanup) b.bulkTouchVersionCache(uniq) + // Refresh Brew's outdated snapshot after the upgrades have completed. The + // snapshot is otherwise reused for up to 24 hours, which would make the + // next `upgrade --check` report packages that were already upgraded. + if _, err := brew.FetchOutdatedPackages(b.Runner); err != nil { + logger.Debug("failed to refresh brew outdated cache: %v", err) + } + // reset for next HandlePackages run b.upgradedPkgs = b.upgradedPkgs[:0] } diff --git a/internal/core/core_test.go b/internal/core/core_test.go index 07eb6a4..af4cc21 100644 --- a/internal/core/core_test.go +++ b/internal/core/core_test.go @@ -467,6 +467,28 @@ func TestTouchVersionCache_Touch(t *testing.T) { } } +func TestFinalizeUpgradesRefreshesOutdatedCache(t *testing.T) { + withIsolatedState(t) + mr := runner.NewMockRunner() + mr.AddResponse("brew|outdated|--json=v2", []byte(`{ + "formulae": [], + "casks": [] + }`), nil) + + b := NewBase(&models.Config{}, mr) + b.upgradedPkgs = []string{"foo"} + b.finalizeUpgrades() + + if !mr.VerifyCommand("brew", "outdated", "--json=v2") { + t.Fatalf("expected outdated cache refresh, got commands: %+v", mr.Commands) + } + + path := utils.MakeFilePath(utils.CacheDir, utils.OutdatedFile) + if ok, err := utils.FileExists(path); err != nil || !ok { + t.Fatalf("expected outdated cache at %s, exists=%v, err=%v", path, ok, err) + } +} + /* ----------------------------- Helpers for writing test cache