//! Tests for selecting pre-release versions with `update --precise`. use cargo_test_support::prelude::*; use cargo_test_support::{project, str}; #[cargo_test] fn requires_nightly_cargo() { cargo_test_support::registry::init(); for version in ["0.1.1", "0.1.2-pre.0"] { cargo_test_support::registry::Package::new("my-dependency", version).publish(); } let p = project() .file( "Cargo.toml", r#" [package] name = "package" [dependencies] my-dependency = "0.1.1" "#, ) .file("src/lib.rs", "") .build(); p.cargo("update my-dependency --precise 0.1.2-pre.0") .with_status(101) // This error is suffering from #12579 but still demonstrates that updating to // a pre-release does not work on stable .with_stderr_data(str![[r#" [UPDATING] `dummy-registry` index [ERROR] failed to select a version for the requirement `my-dependency = "^0.1.1"` candidate versions found which didn't match: 0.1.2-pre.0 location searched: `dummy-registry` index (which is replacing registry `crates-io`) required by package `package v0.0.0 ([ROOT]/foo)` if you are looking for the prerelease package it needs to be specified explicitly my-dependency = { version = "0.1.2-pre.0" } perhaps a crate was updated and forgotten to be re-vendored? "#]]) .run() } #[cargo_test] fn update_pre_release() { cargo_test_support::registry::init(); for version in ["0.1.1", "0.1.2-pre.0"] { cargo_test_support::registry::Package::new("my-dependency", version).publish(); } let p = project() .file( "Cargo.toml", r#" [package] name = "package" [dependencies] my-dependency = "0.1.1" "#, ) .file("src/lib.rs", "") .build(); p.cargo("update my-dependency --precise 0.1.2-pre.0 -Zunstable-options") .masquerade_as_nightly_cargo(&["precise-pre-release"]) .with_stderr_data(str![[r#" [UPDATING] `dummy-registry` index [UPDATING] my-dependency v0.1.1 -> v0.1.2-pre.0 "#]]) .run(); let lockfile = p.read_lockfile(); assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2-pre.0\"")); } #[cargo_test] fn pre_release_should_unmatched() { cargo_test_support::registry::init(); cargo_test_support::registry::Package::new("my-dependency", "0.1.2").publish(); let p = project() .file( "Cargo.toml", r#" [package] name = "package" [dependencies] my-dependency = "0.1.2" "#, ) .file("src/lib.rs", "") .build(); p.cargo("generate-lockfile").run(); let lockfile = p.read_lockfile(); assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2\"")); // 0.1.2-pre.0 < 0.1.2 so it doesn't match cargo_test_support::registry::Package::new("my-dependency", "0.1.2-pre.0").publish(); p.cargo("update -p my-dependency --precise 0.1.2-pre.0 -Zunstable-options") .masquerade_as_nightly_cargo(&["precise-pre-release"]) .with_status(101) .with_stderr_data(str![[r#" [UPDATING] `dummy-registry` index [ERROR] failed to select a version for the requirement `my-dependency = "^0.1.2"` candidate versions found which didn't match: 0.1.2-pre.0 location searched: `dummy-registry` index (which is replacing registry `crates-io`) required by package `package v0.0.0 ([ROOT]/foo)` if you are looking for the prerelease package it needs to be specified explicitly my-dependency = { version = "0.1.2-pre.0" } perhaps a crate was updated and forgotten to be re-vendored? "#]]) .run(); cargo_test_support::registry::Package::new("my-dependency", "0.2.0-0").publish(); // 0.2.0-0 is the upper bound we exclude, so it doesn't match p.cargo("update -p my-dependency --precise 0.2.0-0 -Zunstable-options") .masquerade_as_nightly_cargo(&["precise-pre-release"]) .with_status(101) .with_stderr_data(str![[r#" [UPDATING] `dummy-registry` index [ERROR] failed to select a version for the requirement `my-dependency = "^0.1.2"` candidate versions found which didn't match: 0.2.0-0 location searched: `dummy-registry` index (which is replacing registry `crates-io`) required by package `package v0.0.0 ([ROOT]/foo)` if you are looking for the prerelease package it needs to be specified explicitly my-dependency = { version = "0.2.0-0" } perhaps a crate was updated and forgotten to be re-vendored? "#]]) .run(); let lockfile = p.read_lockfile(); assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2\"")); } #[cargo_test] fn pre_release_should_matched() { cargo_test_support::registry::init(); cargo_test_support::registry::Package::new("my-dependency", "0.1.2").publish(); let p = project() .file( "Cargo.toml", r#" [package] name = "package" [dependencies] my-dependency = "0.1.2" "#, ) .file("src/lib.rs", "") .build(); p.cargo("generate-lockfile").run(); let lockfile = p.read_lockfile(); assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2\"")); // Test upgrade // 0.1.3 is in the range, so it match cargo_test_support::registry::Package::new("my-dependency", "0.1.3").publish(); p.cargo("update -p my-dependency --precise 0.1.3 -Zunstable-options") .masquerade_as_nightly_cargo(&["precise-pre-release"]) .with_stderr_data(str![[r#" [UPDATING] `dummy-registry` index [UPDATING] my-dependency v0.1.2 -> v0.1.3 "#]]) .run(); let lockfile = p.read_lockfile(); assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.3\"")); // Test downgrade // v0.1.3-pre.1 is in the range, so it match cargo_test_support::registry::Package::new("my-dependency", "0.1.3-pre.1").publish(); p.cargo("update -p my-dependency --precise 0.1.3-pre.1 -Zunstable-options") .masquerade_as_nightly_cargo(&["precise-pre-release"]) .with_stderr_data(str![[r#" [UPDATING] `dummy-registry` index [DOWNGRADING] my-dependency v0.1.3 -> v0.1.3-pre.1 "#]]) .run(); let lockfile = p.read_lockfile(); assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.3-pre.1\"")); }