Skip to main content

PrStatusCache

Struct PrStatusCache 

Source
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

Source

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).

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Trait Implementations§

Source§

impl Debug for PrStatusCache

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for PrStatusCache

Source§

fn default() -> PrStatusCache

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more