Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 4 additions & 12 deletions src/cargo/sources/overlay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,24 +63,16 @@ impl<'gctx> Source for DependencyConfusionThreatOverlaySource<'gctx> {
};
ready!(self.local.query(&local_dep, kind, &mut local_callback))?;

let mut package_collision = None;
let mut remote_callback = |index: IndexSummary| {
if local_packages.contains(index.as_summary()) {
package_collision = Some(index.as_summary().clone());
tracing::debug!(?local_source, ?remote_source, ?index, "package collision");
} else {
f(index)
}
f(index)
};
ready!(self.remote.query(dep, kind, &mut remote_callback))?;

if let Some(collision) = package_collision {
std::task::Poll::Ready(Err(anyhow::anyhow!(
"found a package in the remote registry and the local overlay: {}@{}",
collision.name(),
collision.version()
)))
} else {
std::task::Poll::Ready(Ok(()))
}
std::task::Poll::Ready(Ok(()))
}

fn invalidate_cache(&mut self) {
Expand Down
17 changes: 9 additions & 8 deletions tests/testsuite/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6056,20 +6056,21 @@ fn workspace_with_local_dep_already_published_nightly() {
p.cargo("package -Zpackage-workspace")
.masquerade_as_nightly_cargo(&["package-workspace"])
.replace_crates_io(reg.index_url())
.with_status(101)
.with_stderr_data(
str![[r#"
[PACKAGING] dep v0.1.0 ([ROOT]/foo/dep)
[PACKAGING] main v0.0.1 ([ROOT]/foo/main)
[UPDATING] crates.io index
[ERROR] failed to prepare local package for uploading

Caused by:
failed to get `dep` as a dependency of package `main v0.0.1 ([ROOT]/foo/main)`

Caused by:
found a package in the remote registry and the local overlay: [email protected]
[PACKAGED] 4 files, [FILE_SIZE]B ([FILE_SIZE]B compressed)
[PACKAGED] 4 files, [FILE_SIZE]B ([FILE_SIZE]B compressed)
[VERIFYING] dep v0.1.0 ([ROOT]/foo/dep)
[COMPILING] dep v0.1.0 ([ROOT]/foo/target/package/dep-0.1.0)
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
[VERIFYING] main v0.0.1 ([ROOT]/foo/main)
[UNPACKING] dep v0.1.0 (registry `[ROOT]/foo/target/package/tmp-registry`)
[COMPILING] dep v0.1.0
[COMPILING] main v0.0.1 ([ROOT]/foo/target/package/main-0.0.1)
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s

"#]]
.unordered(),
Expand Down
64 changes: 29 additions & 35 deletions tests/testsuite/registry_overlay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
use cargo_test_support::prelude::*;
use cargo_test_support::project;
use cargo_test_support::registry::{Package, RegistryBuilder, TestRegistry};
use cargo_test_support::str;

fn setup() -> (TestRegistry, String) {
let alt = RegistryBuilder::new().alternative().build();
Expand Down Expand Up @@ -77,17 +78,16 @@ fn registry_version_wins() {

p.cargo("check")
.overlay_registry(&reg.index_url(), &alt_path)
.with_stderr_data(
"\
[UPDATING] [..]
.with_stderr_data(str![[r#"
[UPDATING] `sparse+http://127.0.0.1:[..]/index/` index
[LOCKING] 1 package to latest compatible version
[DOWNLOADING] crates ...
[DOWNLOADED] baz v0.1.1 (registry [..])
[DOWNLOADED] baz v0.1.1 (registry `sparse+http://127.0.0.1:[..]/index/`)
[CHECKING] baz v0.1.1
[CHECKING] foo v0.0.1 ([ROOT]/foo)
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
",
)

"#]])
.run();
}

Expand Down Expand Up @@ -120,21 +120,20 @@ fn overlay_version_wins() {

p.cargo("check")
.overlay_registry(&reg.index_url(), &alt_path)
.with_stderr_data(
"\
[UPDATING] [..]
.with_stderr_data(str![[r#"
[UPDATING] `sparse+http://127.0.0.1:[..]/index/` index
[LOCKING] 1 package to latest compatible version
[UNPACKING] baz v0.1.1 (registry [..])
[UNPACKING] baz v0.1.1 (registry `[ROOT]/alternative-registry`)
[CHECKING] baz v0.1.1
[CHECKING] foo v0.0.1 ([ROOT]/foo)
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
",
)

"#]])
.run();
}

#[cargo_test]
fn version_collision() {
fn version_precedence() {
let (reg, alt_path) = setup();
let p = project()
.file(
Expand Down Expand Up @@ -162,19 +161,15 @@ fn version_collision() {

p.cargo("check")
.overlay_registry(&reg.index_url(), &alt_path)
.with_status(101)
.with_stderr_data(
"\
[UPDATING] [..]
[ERROR] failed to get `baz` [..]

Caused by:
failed to query replaced source registry `crates-io`

Caused by:
found a package in the remote registry and the local overlay: [email protected]
",
)
.with_stderr_data(str![[r#"
[UPDATING] `sparse+http://127.0.0.1:[..]/index/` index
[LOCKING] 1 package to latest compatible version
[UNPACKING] baz v0.1.1 (registry `[ROOT]/alternative-registry`)
[CHECKING] baz v0.1.1
[CHECKING] foo v0.0.1 ([ROOT]/foo)
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s

"#]])
.run();
}

Expand Down Expand Up @@ -248,22 +243,21 @@ fn registry_dep_depends_on_new_local_package() {

p.cargo("check")
.overlay_registry(&reg.index_url(), &alt_path)
.with_stderr_data(
"\
[UPDATING] [..]
.with_stderr_data(str![[r#"
[UPDATING] `sparse+http://127.0.0.1:[..]/index/` index
[LOCKING] 3 packages to latest compatible versions
[ADDING] workspace-package v0.0.1 (available: v0.1.1)
[DOWNLOADING] crates ...
[UNPACKING] [..]
[DOWNLOADED] [..]
[DOWNLOADED] [..]
[UNPACKING] workspace-package v0.1.1 (registry `[ROOT]/alternative-registry`)
[DOWNLOADED] registry-package v0.1.0 (registry `sparse+http://127.0.0.1:[..]/index/`)
[DOWNLOADED] workspace-package v0.0.1 (registry `sparse+http://127.0.0.1:[..]/index/`)
[CHECKING] workspace-package v0.1.1
[CHECKING] workspace-package v0.0.1
[CHECKING] registry-package v0.1.0
[CHECKING] foo v0.0.1 [..]
[CHECKING] foo v0.0.1 ([ROOT]/foo)
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
",
)

"#]])
.run();
}

Expand Down