pub struct PrStatusCache { /* private fields */ }Expand description
The poller-written, snapshot-read resolution cache.
A plain std::Mutex map: writes come from the poll loop, reads from the tree
snapshot build. The lock is never held across an .await — every method takes
it, finishes, and drops it.
Implementations§
Source§impl PrStatusCache
impl PrStatusCache
Sourcepub fn new() -> Self
pub fn new() -> Self
An empty cache. Until the first poll lands, every lookup misses and the tree simply renders no badge — and no negative either (#1370).
Sourcepub fn get(&self, owner: &str, name: &str, branch: &str) -> Option<PrResolution>
pub fn get(&self, owner: &str, name: &str, branch: &str) -> Option<PrResolution>
The resolution for one (repo, branch): a badge, an explicit no-PR, or
None when never successfully checked.
Sourcepub fn replace(&self, next: HashMap<PrTarget, PrResolution>) -> bool
pub fn replace(&self, next: HashMap<PrTarget, PrResolution>) -> bool
Replaces the cache wholesale, returning whether anything actually changed.
The bool is load-bearing: the caller bumps the registry’s change-notify only
when it is true. Bumping unconditionally would defeat the server’s
diff-and-drop and re-push an identical snapshot to every window on every
poll — the cost this whole design exists to avoid. A first round of
negatives is a change — the one push that delivers them — after which
identical polls stay silent.
Sourcepub fn retain_targets(&self, keep: &HashSet<PrTarget>) -> bool
pub fn retain_targets(&self, keep: &HashSet<PrTarget>) -> bool
Drops every cached resolution whose target is absent from keep, returning
whether anything was removed.
Lets the poller prune the verdicts of worktrees that closed (or repos whose
lease lapsed) without spending a gh call to re-resolve the survivors
(#1389, fix 1) — the wholesale replace only prunes as a
side effect of a fetch, which a pure removal must never trigger. No caller
bumps on the return today (a removed target’s row is already gone from the
tree, so nothing re-renders), but the bool is reported for symmetry with
replace and to keep the prune observable in tests.
Sourcepub fn entries(&self) -> Vec<(PrTarget, PrResolution)>
pub fn entries(&self) -> Vec<(PrTarget, PrResolution)>
Every cached (target, resolution) pair, cloned out for persistence (#1389,
fix 4). Ordering is unspecified (a HashMap); the caller sorts if it needs
a stable on-disk form.
Sourcepub fn seed(&self, entries: impl IntoIterator<Item = (PrTarget, PrResolution)>)
pub fn seed(&self, entries: impl IntoIterator<Item = (PrTarget, PrResolution)>)
Seeds the cache from a persisted set, without bumping any change-notify.
Called once at daemon startup (before any window subscribes) so restored
badges render on the first tree snapshot rather than after the first poll
(#1389, fix 4) — the crate::pr_status analogue of
WorktreesRegistry::seed_polling. Existing entries with the same target are
overwritten; the cache is empty at that point, so in practice this inserts.
Sourcepub fn any_pending(&self) -> bool
pub fn any_pending(&self) -> bool
Whether any cached badge is still pending — the poller’s cadence signal. A negative is terminal and never holds the fast cadence.