pub struct PackageRegistry<'gctx> {
gctx: &'gctx GlobalContext,
sources: SourceMap<'gctx>,
overrides: Vec<SourceId>,
source_ids: HashMap<SourceId, (SourceId, Kind)>,
locked: HashMap<(SourceId, InternedString), Vec<(PackageId, Vec<PackageId>)>>,
yanked_whitelist: HashSet<PackageId>,
source_config: SourceConfigMap<'gctx>,
patches: HashMap<CanonicalUrl, Vec<Summary>>,
patches_locked: bool,
patches_available: HashMap<CanonicalUrl, Vec<PackageId>>,
}
Expand description
This structure represents a registry of known packages. It internally
contains a number of Source
instances which are used to load a
Package
from.
The resolution phase of Cargo uses this to drive knowledge about new packages as well as querying for lists of new packages. It is here that sources are updated (e.g., network operations) and overrides/patches are handled.
The general idea behind this registry is that it is centered around the
SourceMap
structure, contained within which is a mapping of a SourceId
to a Source
. Each Source
in the map has been updated (using network
operations if necessary) and is ready to be queried for packages.
Fields§
§gctx: &'gctx GlobalContext
§sources: SourceMap<'gctx>
§overrides: Vec<SourceId>
A list of sources which are considered “path-overrides” which take precedent when querying for packages.
source_ids: HashMap<SourceId, (SourceId, Kind)>
Use for tracking sources that are already loaded into the registry.
locked: HashMap<(SourceId, InternedString), Vec<(PackageId, Vec<PackageId>)>>
This is constructed via PackageRegistry::register_lock
.
See also LockedMap
.
yanked_whitelist: HashSet<PackageId>
A group of packages tha allows to use even when yanked.
source_config: SourceConfigMap<'gctx>
§patches: HashMap<CanonicalUrl, Vec<Summary>>
Patches registered during calls to PackageRegistry::patch
.
These are available for query
after calling PackageRegistry::lock_patches
,
which lock
s them all to specific versions.
patches_locked: bool
Whether patches are locked. That is, they are available to resolution.
See PackageRegistry::lock_patches
and PackageRegistry::patch
for more.
patches_available: HashMap<CanonicalUrl, Vec<PackageId>>
Patches available for each source.
This is for determining whether a dependency entry from a lockfile
happened through [patch]
, during calls to lock
to rewrite
summaries to point directly at these patched entries.
This is constructed during calls to PackageRegistry::patch
,
along with the patches
field, thoough these entries never get locked.
Implementations§
source§impl<'gctx> PackageRegistry<'gctx>
impl<'gctx> PackageRegistry<'gctx>
pub fn new_with_source_config( gctx: &'gctx GlobalContext, source_config: SourceConfigMap<'gctx>, ) -> CargoResult<PackageRegistry<'gctx>>
pub fn get(self, package_ids: &[PackageId]) -> CargoResult<PackageSet<'gctx>>
sourcefn ensure_loaded(&mut self, namespace: SourceId, kind: Kind) -> CargoResult<()>
fn ensure_loaded(&mut self, namespace: SourceId, kind: Kind) -> CargoResult<()>
pub fn add_sources( &mut self, ids: impl IntoIterator<Item = SourceId>, ) -> CargoResult<()>
sourcepub fn add_preloaded(&mut self, source: Box<dyn Source + 'gctx>)
pub fn add_preloaded(&mut self, source: Box<dyn Source + 'gctx>)
Adds a source which will be locked. Useful for path sources such as the source of a workspace member.
sourcefn add_source(&mut self, source: Box<dyn Source + 'gctx>, kind: Kind)
fn add_source(&mut self, source: Box<dyn Source + 'gctx>, kind: Kind)
Adds a source to the registry.
sourcepub fn add_override(&mut self, source: Box<dyn Source + 'gctx>)
pub fn add_override(&mut self, source: Box<dyn Source + 'gctx>)
Adds a source from a path override.
sourcepub fn add_to_yanked_whitelist(&mut self, iter: impl Iterator<Item = PackageId>)
pub fn add_to_yanked_whitelist(&mut self, iter: impl Iterator<Item = PackageId>)
Allows a group of package to be available to query even if they are yanked.
sourcepub fn clear_lock(&mut self)
pub fn clear_lock(&mut self)
remove all residual state from previous lock files.
sourcepub fn register_lock(&mut self, id: PackageId, deps: Vec<PackageId>)
pub fn register_lock(&mut self, id: PackageId, deps: Vec<PackageId>)
Registers one “locked package” to the registry, for guiding the
dependency resolution. See LockedMap
for more.
sourcepub fn patch(
&mut self,
url: &Url,
patch_deps: &[PatchDependency<'_>],
) -> CargoResult<Vec<(Dependency, PackageId)>>
pub fn patch( &mut self, url: &Url, patch_deps: &[PatchDependency<'_>], ) -> CargoResult<Vec<(Dependency, PackageId)>>
Insert a [patch]
section into this registry.
This method will insert a [patch]
section for the url
specified,
with the given list of dependencies. The url
specified is the URL of
the source to patch (for example this is crates-io
in the manifest).
The deps
is an array of all the entries in the [patch]
section of
the manifest.
Here the patch_deps
will be resolved to a precise version and stored
internally for future calls to query
below.
Note that the patch list specified here will not be available to
Registry::query
until PackageRegistry::lock_patches
is called
below, which should be called once all patches have been added.
The return value is a Vec
of patches that should not be locked.
This happens when the patch is locked, but the patch has been updated
so the locked value is no longer correct.
sourcepub fn lock_patches(&mut self)
pub fn lock_patches(&mut self)
Lock all patch summaries added via patch
,
making them available to resolution via Registry::query
.
sourcepub fn patches(&self) -> &HashMap<CanonicalUrl, Vec<Summary>>
pub fn patches(&self) -> &HashMap<CanonicalUrl, Vec<Summary>>
Gets all patches grouped by the source URLs they are going to patch.
These patches are mainly collected from patch
.
They might not be the same as patches actually used during dependency resolving.
sourcefn query_overrides(
&mut self,
dep: &Dependency,
) -> Poll<CargoResult<Option<IndexSummary>>>
fn query_overrides( &mut self, dep: &Dependency, ) -> Poll<CargoResult<Option<IndexSummary>>>
Queries path overrides from this registry.
sourcepub fn lock(&self, summary: Summary) -> Summary
pub fn lock(&self, summary: Summary) -> Summary
This function is used to transform a summary to another locked summary if possible. This is where the concept of a lock file comes into play.
If a summary points at a package ID which was previously locked, then we override the summary’s ID itself, as well as all dependencies, to be rewritten to the locked versions. This will transform the summary’s source to a precise source (listed in the locked version) as well as transforming all of the dependencies from range requirements on imprecise sources to exact requirements on precise sources.
If a summary does not point at a package ID which was previously locked, or if any dependencies were added and don’t have a previously listed version, we still want to avoid updating as many dependencies as possible to keep the graph stable. In this case we map all of the summary’s dependencies to be rewritten to a locked version wherever possible. If we’re unable to map a dependency though, we just pass it on through.
fn warn_bad_override( &self, override_summary: &Summary, real_summary: &Summary, ) -> CargoResult<()>
Trait Implementations§
source§impl<'gctx> Registry for PackageRegistry<'gctx>
impl<'gctx> Registry for PackageRegistry<'gctx>
source§fn query(
&mut self,
dep: &Dependency,
kind: QueryKind,
f: &mut dyn FnMut(IndexSummary),
) -> Poll<CargoResult<()>>
fn query( &mut self, dep: &Dependency, kind: QueryKind, f: &mut dyn FnMut(IndexSummary), ) -> Poll<CargoResult<()>>
source§fn describe_source(&self, id: SourceId) -> String
fn describe_source(&self, id: SourceId) -> String
source§fn is_replaced(&self, id: SourceId) -> bool
fn is_replaced(&self, id: SourceId) -> bool
source§fn block_until_ready(&mut self) -> CargoResult<()>
fn block_until_ready(&mut self) -> CargoResult<()>
Poll::Pending
requests are Poll::Ready
.source§fn query_vec(
&mut self,
dep: &Dependency,
kind: QueryKind,
) -> Poll<CargoResult<Vec<IndexSummary>>>
fn query_vec( &mut self, dep: &Dependency, kind: QueryKind, ) -> Poll<CargoResult<Vec<IndexSummary>>>
Registry::query
as a list of IndexSummary
items
when they become available.Auto Trait Implementations§
impl<'gctx> Freeze for PackageRegistry<'gctx>
impl<'gctx> !RefUnwindSafe for PackageRegistry<'gctx>
impl<'gctx> !Send for PackageRegistry<'gctx>
impl<'gctx> !Sync for PackageRegistry<'gctx>
impl<'gctx> Unpin for PackageRegistry<'gctx>
impl<'gctx> !UnwindSafe for PackageRegistry<'gctx>
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
§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>
§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 480 bytes