From 4cda74a1a3e071bc493aed6cc7548aa75931c2a9 Mon Sep 17 00:00:00 2001 From: Kyle Matsuda Date: Mon, 12 Dec 2022 11:07:43 -0700 Subject: [PATCH 1/4] add test with current behavior --- tests/testsuite/publish_lockfile.rs | 94 +++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/tests/testsuite/publish_lockfile.rs b/tests/testsuite/publish_lockfile.rs index 96d24d40f50..8a7ee224335 100644 --- a/tests/testsuite/publish_lockfile.rs +++ b/tests/testsuite/publish_lockfile.rs @@ -492,3 +492,97 @@ fn ignore_lockfile_inner() { ) .run(); } + +#[cargo_test] +fn respect_workspace_lockfile() { + // Issue #11148 + Package::new("serde", "0.2.0").publish(); + Package::new("serde", "0.2.1").publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + + [dependencies] + serde = "0.2" + + [workspace] + members = ["bar"] + "#, + ) + .file("src/main.rs", "fn main() {}") + .file( + "bar/Cargo.toml", + r#" + [package] + name = "bar" + version = "0.0.1" + authors = [] + license = "MIT" + description = "bar" + workspace = ".." + + [dependencies] + serde = "0.2" + "#, + ) + .file("bar/src/main.rs", "fn main() {}") + .build(); + p.cargo("generate-lockfile").run(); + p.cargo("update -p serde:0.2.1 --precise 0.2.0").run(); + + p.cargo("package --workspace") + .with_stderr( + "\ +[WARNING] manifest has no documentation, [..] +See [..] +[PACKAGING] bar v0.0.1 ([CWD]/bar) +[UPDATING] `dummy-registry` index +[VERIFYING] bar v0.0.1 ([CWD]/bar) +[DOWNLOADING] crates ... +[DOWNLOADED] serde v0.2.1 ([..]) +[COMPILING] serde v0.2.1 +[COMPILING] bar v0.0.1 ([CWD][..]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] +[PACKAGED] 4 files, [..] +[WARNING] manifest has no documentation, [..] +See [..] +[PACKAGING] foo v0.0.1 ([CWD]) +[VERIFYING] foo v0.0.1 ([CWD]) +[DOWNLOADING] crates ... +[DOWNLOADED] serde v0.2.0 ([..]) +[COMPILING] serde v0.2.0 +[COMPILING] foo v0.0.1 ([CWD][..]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] +[PACKAGED] 4 files, [..] +", + ) + .run(); + + let package_path = p.root().join("target/package/foo-0.0.1.crate"); + assert!(package_path.is_file()); + let f = File::open(&package_path).unwrap(); + validate_crate_contents( + f, + "foo-0.0.1.crate", + &["Cargo.lock", "Cargo.toml", "Cargo.toml.orig", "src/main.rs"], + &[], + ); + + let package_path = p.root().join("target/package/bar-0.0.1.crate"); + assert!(package_path.is_file()); + let f = File::open(&package_path).unwrap(); + validate_crate_contents( + f, + "bar-0.0.1.crate", + &["Cargo.lock", "Cargo.toml", "Cargo.toml.orig", "src/main.rs"], + &[], + ); +} From 70dc9c0ea4b3107432458ef3111131d84b1b3268 Mon Sep 17 00:00:00 2001 From: Kyle Matsuda Date: Mon, 12 Dec 2022 11:19:23 -0700 Subject: [PATCH 2/4] replace call to resolve_ws with resolve_with_previous --- src/cargo/ops/cargo_package.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index ae5c7558fc4..35b213361a2 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -9,6 +9,7 @@ use std::task::Poll; use crate::core::compiler::{BuildConfig, CompileMode, DefaultExecutor, Executor}; use crate::core::resolver::CliFeatures; +use crate::core::{registry::PackageRegistry, resolver::HasDevUnits}; use crate::core::{Feature, Shell, Verbosity, Workspace}; use crate::core::{Package, PackageId, PackageSet, Resolve, SourceId}; use crate::sources::PathSource; @@ -388,7 +389,18 @@ fn build_lock(ws: &Workspace<'_>, orig_pkg: &Package) -> CargoResult { // Regenerate Cargo.lock using the old one as a guide. let tmp_ws = Workspace::ephemeral(new_pkg, ws.config(), None, true)?; - let (pkg_set, mut new_resolve) = ops::resolve_ws(&tmp_ws)?; + let mut tmp_reg = PackageRegistry::new(ws.config())?; + let mut new_resolve = ops::resolve_with_previous( + &mut tmp_reg, + &tmp_ws, + &CliFeatures::new_all(true), + HasDevUnits::Yes, + orig_resolve.as_ref(), + None, + &[], + true, + )?; + let pkg_set = ops::get_resolved_packages(&new_resolve, tmp_reg)?; if let Some(orig_resolve) = orig_resolve { compare_resolve(config, tmp_ws.current()?, &orig_resolve, &new_resolve)?; From 4d86b26a68c35554b3df3f031243faf91b2ecf84 Mon Sep 17 00:00:00 2001 From: Kyle Matsuda Date: Mon, 12 Dec 2022 11:21:53 -0700 Subject: [PATCH 3/4] fix test --- tests/testsuite/publish_lockfile.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/testsuite/publish_lockfile.rs b/tests/testsuite/publish_lockfile.rs index 8a7ee224335..a62ef7e7a84 100644 --- a/tests/testsuite/publish_lockfile.rs +++ b/tests/testsuite/publish_lockfile.rs @@ -494,8 +494,10 @@ fn ignore_lockfile_inner() { } #[cargo_test] -fn respect_workspace_lockfile() { +fn use_workspace_root_lockfile() { // Issue #11148 + // Workspace members should use `Cargo.lock` at workspace root + Package::new("serde", "0.2.0").publish(); Package::new("serde", "0.2.1").publish(); @@ -535,9 +537,13 @@ fn respect_workspace_lockfile() { ) .file("bar/src/main.rs", "fn main() {}") .build(); + + // Create `Cargo.lock` in the workspace root, and set it to use + // `serde v0.2.0` p.cargo("generate-lockfile").run(); p.cargo("update -p serde:0.2.1 --precise 0.2.0").run(); + // Expect: package `bar` uses `serde v0.2.0` as required by workspace lock p.cargo("package --workspace") .with_stderr( "\ @@ -547,8 +553,8 @@ See [..] [UPDATING] `dummy-registry` index [VERIFYING] bar v0.0.1 ([CWD]/bar) [DOWNLOADING] crates ... -[DOWNLOADED] serde v0.2.1 ([..]) -[COMPILING] serde v0.2.1 +[DOWNLOADED] serde v0.2.0 ([..]) +[COMPILING] serde v0.2.0 [COMPILING] bar v0.0.1 ([CWD][..]) [FINISHED] dev [unoptimized + debuginfo] target(s) in [..] [PACKAGED] 4 files, [..] @@ -556,8 +562,6 @@ See [..] See [..] [PACKAGING] foo v0.0.1 ([CWD]) [VERIFYING] foo v0.0.1 ([CWD]) -[DOWNLOADING] crates ... -[DOWNLOADED] serde v0.2.0 ([..]) [COMPILING] serde v0.2.0 [COMPILING] foo v0.0.1 ([CWD][..]) [FINISHED] dev [unoptimized + debuginfo] target(s) in [..] From 8c4f27fd5b79b374011a5fd28991c33c0a6b116e Mon Sep 17 00:00:00 2001 From: Kyle Matsuda Date: Mon, 19 Dec 2022 10:50:55 -0700 Subject: [PATCH 4/4] make test clearer --- tests/testsuite/publish_lockfile.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/testsuite/publish_lockfile.rs b/tests/testsuite/publish_lockfile.rs index a62ef7e7a84..35da5131ff8 100644 --- a/tests/testsuite/publish_lockfile.rs +++ b/tests/testsuite/publish_lockfile.rs @@ -499,7 +499,6 @@ fn use_workspace_root_lockfile() { // Workspace members should use `Cargo.lock` at workspace root Package::new("serde", "0.2.0").publish(); - Package::new("serde", "0.2.1").publish(); let p = project() .file( @@ -538,12 +537,13 @@ fn use_workspace_root_lockfile() { .file("bar/src/main.rs", "fn main() {}") .build(); - // Create `Cargo.lock` in the workspace root, and set it to use - // `serde v0.2.0` + // Create `Cargo.lock` in the workspace root. p.cargo("generate-lockfile").run(); - p.cargo("update -p serde:0.2.1 --precise 0.2.0").run(); - // Expect: package `bar` uses `serde v0.2.0` as required by workspace lock + // Now, add a newer version of `serde`. + Package::new("serde", "0.2.1").publish(); + + // Expect: package `bar` uses `serde v0.2.0` as required by workspace `Cargo.lock`. p.cargo("package --workspace") .with_stderr( "\