Struct GithubActionsRegistry
pub struct GithubActionsRegistry { /* private fields */ }Expand description
Client for fetching GitHub Actions version information from the GitHub tags API.
Implementations§
§impl GithubActionsRegistry
impl GithubActionsRegistry
pub fn new(cache: Arc<HttpCache>) -> GithubActionsRegistry
pub fn new(cache: Arc<HttpCache>) -> GithubActionsRegistry
Creates a new GitHub Actions registry client with the given HTTP cache.
Reads GITHUB_TOKEN from the environment for authenticated requests (5000 req/h
vs 60 req/h unauthenticated) — identical to deps_swift::registry::SwiftRegistry,
and note the 60 req/h unauthenticated budget is per-IP and shared with any
deps-swift traffic in the same process.
pub fn tag_index(&self) -> Arc<DashMap<PackageName, Arc<TagIndex>>>
pub fn tag_index(&self) -> Arc<DashMap<PackageName, Arc<TagIndex>>>
Shares this registry’s [TagIndex] map with a crate::formatter::GithubActionsFormatter,
so a formatted SHA-pin edit can resolve the new SHA for a given tag.
pub, not pub(crate): an integration test that exercises the shared
deps_core code-action/code-lens/hover machinery against this ecosystem —
which never itself drives a live registry fetch — needs a way to seed a
repository’s [TagIndex] entry directly, without going through a mocked HTTP
fetch that path never calls.
pub async fn get_versions(
&self,
name: &str,
) -> Result<Vec<GithubActionsVersion>, DepsError>
pub async fn get_versions( &self, name: &str, ) -> Result<Vec<GithubActionsVersion>, DepsError>
Fetches all semver-tagged versions for name (owner/repo).
Returns versions sorted newest-first. Non-semver tags are skipped. Follows GitHub
tags pagination up to MAX_TAG_PAGES pages, coalesced per-repository so that N
concurrent callers for the same repository on a cold cache issue one request, not
N (S2) — and short-circuits locally, without touching the network, once the
rate-limit gate has been tripped by an earlier 403 (critic C1).
pub async fn get_versions_with_release_dates(
&self,
name: &str,
) -> Result<Vec<GithubActionsVersion>, DepsError>
pub async fn get_versions_with_release_dates( &self, name: &str, ) -> Result<Vec<GithubActionsVersion>, DepsError>
Like GithubActionsRegistry::get_versions, but also attaches GitHub Release
publish times, joined by normalized tag name (#486, mirroring
deps_swift::registry::SwiftRegistry::get_versions_with_release_dates).
Runs the tags fetch and the release-dates fetch concurrently (tokio::join!) —
the release-dates fetch is infallible (empty map on any failure), so it can
never perturb get_versions’s error propagation, rate-limit gate, or in-flight
coalescing.
Known limitation (#486 critic M2): the release-dates fetch does not consult the
rate-limit gate. This is harmless in the untokened case (ReleaseDatesCache:: fetch already short-circuits on a missing GITHUB_TOKEN before issuing any
request), but a tokened client exhausting its 5000/h quota keeps retrying
/releases every error TTL (90s) per repository rather than backing off —
gating this call on RateLimitGate::is_tripped would not help: map_tags_error
deliberately never trips the gate for a tokened 403 (that case is scoped to one
repository, not treated as a workspace-wide outage), so the gate never becomes
tripped while a token is present. Left unfixed rather than adding a check that
would never fire in the tokened case it targets.
pub async fn get_latest_matching(
&self,
name: &str,
req_str: &str,
) -> Result<Option<GithubActionsVersion>, DepsError>
pub async fn get_latest_matching( &self, name: &str, req_str: &str, ) -> Result<Option<GithubActionsVersion>, DepsError>
Finds the latest version satisfying the given semver requirement.
Trait Implementations§
§impl Clone for GithubActionsRegistry
impl Clone for GithubActionsRegistry
§fn clone(&self) -> GithubActionsRegistry
fn clone(&self) -> GithubActionsRegistry
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Registry for GithubActionsRegistry
impl Registry for GithubActionsRegistry
§fn search<'a>(
&'a self,
_query: &'a str,
_limit: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Metadata>>, DepsError>> + Send + 'a>>
fn search<'a>( &'a self, _query: &'a str, _limit: usize, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Metadata>>, DepsError>> + Send + 'a>>
Always empty for the MVP (S2/registry docs): a name-completion search would burn the 60 req/h unauthenticated budget per keystroke, since GitHub has no action-specific search endpoint cheaper than repository search.
§fn reports_yanked(&self) -> bool
fn reports_yanked(&self) -> bool
GitHub’s tags API exposes no yank/deprecation signal for actions.
§fn get_versions<'a>(
&'a self,
name: &'a PackageName,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_versions<'a>( &'a self, name: &'a PackageName, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
§fn get_versions_with<'a>(
&'a self,
name: &'a PackageName,
freshness: FreshnessSettings,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_versions_with<'a>( &'a self, name: &'a PackageName, freshness: FreshnessSettings, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_versions, but lets a registry that can obtain
Version::published_at only through an extra request gate that request behind
freshness.enabled instead of always paying for it. Read more§fn get_latest_matching<'a>(
&'a self,
name: &'a PackageName,
req: &'a VersionReq,
) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_latest_matching<'a>( &'a self, name: &'a PackageName, req: &'a VersionReq, ) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
§fn select_latest_matching(
&self,
versions: &[Box<dyn Version>],
req: &VersionReq,
) -> Option<usize>
fn select_latest_matching( &self, versions: &[Box<dyn Version>], req: &VersionReq, ) -> Option<usize>
§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Source§fn get_versions_from<'a>(
&'a self,
name: &'a PackageName,
source: &'a DependencySource,
freshness: FreshnessSettings,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_versions_from<'a>( &'a self, name: &'a PackageName, source: &'a DependencySource, freshness: FreshnessSettings, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_versions_with, but additionally carries the
dependency’s resolved DependencySource, for a registry that routes a single
fetch across more than one underlying index (e.g. deps-cargo’s CargoRegistry,
which dispatches a DependencySource::AlternateRegistry to a private sparse index
instead of crates.io). Read moreSource§fn get_latest_matching_with_context<'a>(
&'a self,
name: &'a PackageName,
req: &'a VersionReq,
minimum_stability: Option<&'a str>,
) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_latest_matching_with_context<'a>( &'a self, name: &'a PackageName, req: &'a VersionReq, minimum_stability: Option<&'a str>, ) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_latest_matching, but lets a registry whose
“latest matching” selection can be refined by ecosystem-specific manifest state (e.g.
Composer’s minimum-stability field, #424) read it, alongside req. Read moreSource§fn get_latest_matching_from<'a>(
&'a self,
name: &'a PackageName,
source: &'a DependencySource,
req: &'a VersionReq,
minimum_stability: Option<&'a str>,
) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_latest_matching_from<'a>( &'a self, name: &'a PackageName, source: &'a DependencySource, req: &'a VersionReq, minimum_stability: Option<&'a str>, ) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_latest_matching_with_context,
but additionally carries the dependency’s resolved DependencySource — the
get_latest_matching-shaped counterpart to
get_versions_from, covering the fallback path a caller
takes when the list-based pick fails on a non-empty get_versions_from
result (see deps_core::lsp_helpers::hover’s list_fallback_latest and
deps-lsp’s background-fetch fallback for the two call sites this exists for). Read moreSource§fn select_latest_matching_with_context(
&self,
versions: &[Box<dyn Version>],
req: &VersionReq,
minimum_stability: Option<&str>,
) -> Option<usize>
fn select_latest_matching_with_context( &self, versions: &[Box<dyn Version>], req: &VersionReq, minimum_stability: Option<&str>, ) -> Option<usize>
select_latest_matching, but lets a registry
whose selection can be refined by ecosystem-specific manifest state (e.g. Composer’s
minimum-stability field, #424) read it, alongside versions and req. See
get_latest_matching_with_context for why
minimum_stability is an opaque per-ecosystem string rather than a shared type. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for GithubActionsRegistry
impl !UnwindSafe for GithubActionsRegistry
impl Freeze for GithubActionsRegistry
impl Send for GithubActionsRegistry
impl Sync for GithubActionsRegistry
impl Unpin for GithubActionsRegistry
impl UnsafeUnpin for GithubActionsRegistry
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more