Skip to content

Commit 4a2f810

Browse files
committed
Update existing sources when whitelist modified
When sources already exist in a `PackageRegistry` and the whitelist is updated in the package registry, be sure to update all the existing sources to ensure that everyone gets the same view of the intended whitelist.
1 parent 086a454 commit 4a2f810

File tree

8 files changed

+39
-2
lines changed

8 files changed

+39
-2
lines changed

src/cargo/core/registry.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,11 @@ impl<'cfg> PackageRegistry<'cfg> {
169169
}
170170

171171
pub fn add_to_yanked_whitelist(&mut self, iter: impl Iterator<Item = PackageId>) {
172-
self.yanked_whitelist.extend(iter)
172+
let pkgs = iter.collect::<Vec<_>>();
173+
for (_, source) in self.sources.sources_mut() {
174+
source.add_to_yanked_whitelist(&pkgs);
175+
}
176+
self.yanked_whitelist.extend(pkgs);
173177
}
174178

175179
pub fn register_lock(&mut self, id: PackageId, deps: Vec<PackageId>) {

src/cargo/core/source/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ pub trait Source {
8383
fn is_replaced(&self) -> bool {
8484
false
8585
}
86+
87+
/// Add a number of crates that should be whitelisted for showing up during
88+
/// queries, even if they are yanked. Currently only applies to registry
89+
/// sources.
90+
fn add_to_yanked_whitelist(&mut self, pkgs: &[PackageId]);
8691
}
8792

8893
pub enum MaybePackage {
@@ -152,6 +157,10 @@ impl<'a, T: Source + ?Sized + 'a> Source for Box<T> {
152157
fn is_replaced(&self) -> bool {
153158
(**self).is_replaced()
154159
}
160+
161+
fn add_to_yanked_whitelist(&mut self, pkgs: &[PackageId]) {
162+
(**self).add_to_yanked_whitelist(pkgs);
163+
}
155164
}
156165

157166
impl<'a, T: Source + ?Sized + 'a> Source for &'a mut T {
@@ -206,6 +215,10 @@ impl<'a, T: Source + ?Sized + 'a> Source for &'a mut T {
206215
fn is_replaced(&self) -> bool {
207216
(**self).is_replaced()
208217
}
218+
219+
fn add_to_yanked_whitelist(&mut self, pkgs: &[PackageId]) {
220+
(**self).add_to_yanked_whitelist(pkgs);
221+
}
209222
}
210223

211224
/// A `HashMap` of `SourceId` -> `Box<Source>`

src/cargo/sources/directory.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,6 @@ impl<'cfg> Source for DirectorySource<'cfg> {
214214
fn describe(&self) -> String {
215215
format!("directory source `{}`", self.root.display())
216216
}
217+
218+
fn add_to_yanked_whitelist(&mut self, _pkgs: &[PackageId]) {}
217219
}

src/cargo/sources/git/source.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ impl<'cfg> Source for GitSource<'cfg> {
238238
fn describe(&self) -> String {
239239
format!("git repository {}", self.source_id)
240240
}
241+
242+
fn add_to_yanked_whitelist(&mut self, _pkgs: &[PackageId]) {}
241243
}
242244

243245
#[cfg(test)]

src/cargo/sources/path.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,4 +569,6 @@ impl<'cfg> Source for PathSource<'cfg> {
569569
Err(_) => self.source_id.to_string(),
570570
}
571571
}
572+
573+
fn add_to_yanked_whitelist(&mut self, _pkgs: &[PackageId]) {}
572574
}

src/cargo/sources/registry/index.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,11 @@ impl<'cfg> RegistryIndex<'cfg> {
282282
let summaries = summaries
283283
.iter()
284284
.filter(|&(summary, yanked)| {
285-
!yanked || yanked_whitelist.contains(&summary.package_id())
285+
!yanked || {
286+
log::debug!("{:?}", yanked_whitelist);
287+
log::debug!("{:?}", summary.package_id());
288+
yanked_whitelist.contains(&summary.package_id())
289+
}
286290
})
287291
.map(|s| s.0.clone());
288292

src/cargo/sources/registry/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,4 +625,8 @@ impl<'cfg> Source for RegistrySource<'cfg> {
625625
fn describe(&self) -> String {
626626
self.source_id.display_registry()
627627
}
628+
629+
fn add_to_yanked_whitelist(&mut self, pkgs: &[PackageId]) {
630+
self.yanked_whitelist.extend(pkgs);
631+
}
628632
}

src/cargo/sources/replaced.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,10 @@ impl<'cfg> Source for ReplacedSource<'cfg> {
113113
fn is_replaced(&self) -> bool {
114114
true
115115
}
116+
117+
fn add_to_yanked_whitelist(&mut self, pkgs: &[PackageId]) {
118+
let pkgs = pkgs.iter().map(|id| id.with_source_id(self.replace_with))
119+
.collect::<Vec<_>>();
120+
self.inner.add_to_yanked_whitelist(&pkgs);
121+
}
116122
}

0 commit comments

Comments
 (0)