diff --git a/src/cargo/core/resolver/encode.rs b/src/cargo/core/resolver/encode.rs index 34bfbe82053..cac39d823f9 100644 --- a/src/cargo/core/resolver/encode.rs +++ b/src/cargo/core/resolver/encode.rs @@ -154,18 +154,18 @@ impl EncodableResolve { /// primary uses is to be used with `resolve_with_previous` to guide the /// resolver to create a complete Resolve. pub fn into_resolve(self, original: &str, ws: &Workspace<'_>) -> CargoResult { - let unstable_lockfile_version_allowed = ws.config().cli_unstable().next_lockfile_bump; let path_deps = build_path_deps(ws)?; let mut checksums = HashMap::new(); let mut version = match self.version { - Some(4) if ws.config().nightly_features_allowed => { - if unstable_lockfile_version_allowed { - ResolveVersion::V4 + Some(n @ 5) if ws.config().nightly_features_allowed => { + if ws.config().cli_unstable().next_lockfile_bump { + ResolveVersion::V5 } else { - anyhow::bail!("lock file version 4 requires `-Znext-lockfile-bump`"); + anyhow::bail!("lock file version `{n}` requires `-Znext-lockfile-bump`"); } } + Some(4) => ResolveVersion::V4, Some(3) => ResolveVersion::V3, Some(n) => bail!( "lock file version `{}` was found, but this version of Cargo \ @@ -694,6 +694,7 @@ impl ser::Serialize for Resolve { metadata, patch, version: match self.version() { + ResolveVersion::V5 => Some(5), ResolveVersion::V4 => Some(4), ResolveVersion::V3 => Some(3), ResolveVersion::V2 | ResolveVersion::V1 => None, @@ -797,9 +798,10 @@ fn encodable_source_id(id: SourceId, version: ResolveVersion) -> Option EncodableSourceId::new(id), - _ => EncodableSourceId::without_url_encoded(id), + Some(if version >= ResolveVersion::V4 { + EncodableSourceId::new(id) + } else { + EncodableSourceId::without_url_encoded(id) }) } } diff --git a/src/cargo/core/resolver/resolve.rs b/src/cargo/core/resolver/resolve.rs index 02f112166dc..f7027dcaceb 100644 --- a/src/cargo/core/resolver/resolve.rs +++ b/src/cargo/core/resolver/resolve.rs @@ -80,12 +80,14 @@ pub enum ResolveVersion { /// V3 by default staring in 1.53. #[default] V3, + /// SourceId URL serialization is aware of URL encoding. For example, + /// `?branch=foo bar` is now encoded as `?branch=foo+bar` and can be decoded + /// back and forth correctly. Introduced in 2024 in version 1.77. + V4, /// Unstable. Will collect a certain amount of changes and then go. /// /// Changes made: - /// - /// * SourceId URL serialization is aware of URL encoding. - V4, + V5, } impl ResolveVersion { @@ -95,7 +97,7 @@ impl ResolveVersion { /// /// Update this when you're going to stabilize a new lockfile format. pub fn max_stable() -> ResolveVersion { - ResolveVersion::V3 + ResolveVersion::V4 } } diff --git a/src/cargo/core/source_id.rs b/src/cargo/core/source_id.rs index 3b1cad94211..35acee8fdd2 100644 --- a/src/cargo/core/source_id.rs +++ b/src/cargo/core/source_id.rs @@ -656,7 +656,7 @@ impl fmt::Display for SourceId { // Don't replace the URL display for git references, // because those are kind of expected to be URLs. write!(f, "{}", self.inner.url)?; - // TODO(-Znext-lockfile-bump): set it to true when stabilizing + // TODO(-Znext-lockfile-bump): set it to true when the default is // lockfile v4, because we want Source ID serialization to be // consistent with lockfile. if let Some(pretty) = reference.pretty_ref(false) { diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index 7d303f0c25f..dade425e5c9 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -188,7 +188,7 @@ impl<'cfg> Debug for GitSource<'cfg> { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { write!(f, "git repo at {}", self.remote.url())?; - // TODO(-Znext-lockfile-bump): set it to true when stabilizing + // TODO(-Znext-lockfile-bump): set it to true when the default is // lockfile v4, because we want Source ID serialization to be // consistent with lockfile. match self.manifest_reference.pretty_ref(false) { diff --git a/src/cargo/util/toml_mut/dependency.rs b/src/cargo/util/toml_mut/dependency.rs index 6ffd214b473..867d43d4780 100644 --- a/src/cargo/util/toml_mut/dependency.rs +++ b/src/cargo/util/toml_mut/dependency.rs @@ -918,7 +918,7 @@ impl std::fmt::Display for GitSource { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let git_ref = self.git_ref(); - // TODO(-Znext-lockfile-bump): set it to true when stabilizing + // TODO(-Znext-lockfile-bump): set it to true when the default is // lockfile v4, because we want Source ID serialization to be // consistent with lockfile. if let Some(pretty_ref) = git_ref.pretty_ref(false) { diff --git a/tests/testsuite/lockfile_compat.rs b/tests/testsuite/lockfile_compat.rs index 97dcff1231a..1c949624f47 100644 --- a/tests/testsuite/lockfile_compat.rs +++ b/tests/testsuite/lockfile_compat.rs @@ -890,7 +890,7 @@ perhaps a crate was updated and forgotten to be re-vendored? } #[cargo_test] -fn v4_is_unstable() { +fn next_version_is_always_unstable() { let p = project() .file( "Cargo.toml", @@ -903,7 +903,7 @@ fn v4_is_unstable() { ), ) .file("src/lib.rs", "") - .file("Cargo.lock", "version = 4") + .file("Cargo.lock", "version = 5") .build(); p.cargo("fetch") @@ -913,7 +913,7 @@ fn v4_is_unstable() { error: failed to parse lock file at: [CWD]/Cargo.lock Caused by: - lock file version `4` was found, but this version of Cargo does not \ + lock file version `5` was found, but this version of Cargo does not \ understand this lock file, perhaps Cargo needs to be updated? ", ) @@ -928,7 +928,7 @@ Caused by: error: failed to parse lock file at: [CWD]/Cargo.lock Caused by: - lock file version 4 requires `-Znext-lockfile-bump` + lock file version `5` requires `-Znext-lockfile-bump` ", ) .run(); @@ -950,9 +950,7 @@ fn v4_cannot_be_created_from_scratch() { .file("src/lib.rs", "") .build(); - p.cargo("fetch -Znext-lockfile-bump") - .masquerade_as_nightly_cargo(&["-Znext-lockfile-bump"]) - .run(); + p.cargo("fetch").run(); let lockfile = r#"# This file is automatically @generated by Cargo. # It is not intended for manual editing. @@ -1124,8 +1122,7 @@ dependencies = [ .file("Cargo.lock", "version = 4") .build(); - p.cargo("check -Znext-lockfile-bump") - .masquerade_as_nightly_cargo(&["-Znext-lockfile-bump"]) + p.cargo("check") .with_stderr(format!( "\ [UPDATING] git repository `{url}` @@ -1141,10 +1138,7 @@ dependencies = [ // Unlike v3_and_git_url_encoded, v4 encodes URL parameters so no git // repository re-clone happen. - p.cargo("check -Znext-lockfile-bump") - .masquerade_as_nightly_cargo(&["-Znext-lockfile-bump"]) - .with_stderr("[FINISHED] dev [..]") - .run(); + p.cargo("check").with_stderr("[FINISHED] dev [..]").run(); } #[cargo_test]