From aaf06f766f27c8f01b6f76ef6b4b7111480619da Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Wed, 18 Oct 2023 18:27:12 -0400 Subject: [PATCH] feat: stabilize lockfile v4 --- src/cargo/core/resolver/encode.rs | 9 +--- src/cargo/core/resolver/resolve.rs | 8 ++-- src/cargo/core/source_id.rs | 5 +-- src/cargo/ops/lockfile.rs | 8 ---- src/cargo/sources/git/source.rs | 6 +-- src/cargo/util/toml_mut/dependency.rs | 6 +-- tests/testsuite/lockfile_compat.rs | 60 +++------------------------ 7 files changed, 13 insertions(+), 89 deletions(-) diff --git a/src/cargo/core/resolver/encode.rs b/src/cargo/core/resolver/encode.rs index 7835c22197cb..9ec373bba16f 100644 --- a/src/cargo/core/resolver/encode.rs +++ b/src/cargo/core/resolver/encode.rs @@ -154,18 +154,11 @@ 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 - } else { - anyhow::bail!("lock file version 4 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 \ diff --git a/src/cargo/core/resolver/resolve.rs b/src/cargo/core/resolver/resolve.rs index 18a389773da9..1e1bdbcc0c80 100644 --- a/src/cargo/core/resolver/resolve.rs +++ b/src/cargo/core/resolver/resolve.rs @@ -80,11 +80,9 @@ pub enum ResolveVersion { /// V3 by default staring in 1.53. #[default] V3, - /// Unstable. Will collect a certain amount of changes and then go. - /// - /// Changes made: - /// - /// * SourceId URL serialization is aware of URL encoding. + /// 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 2023 in version 1.75. V4, } diff --git a/src/cargo/core/source_id.rs b/src/cargo/core/source_id.rs index d688b873914f..82521d6fbbcc 100644 --- a/src/cargo/core/source_id.rs +++ b/src/cargo/core/source_id.rs @@ -618,10 +618,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 - // lockfile v4, because we want Source ID serialization to be - // consistent with lockfile. - if let Some(pretty) = reference.pretty_ref(false) { + if let Some(pretty) = reference.pretty_ref(true) { write!(f, "?{}", pretty)?; } diff --git a/src/cargo/ops/lockfile.rs b/src/cargo/ops/lockfile.rs index aa05efd3559f..8971879e24ff 100644 --- a/src/cargo/ops/lockfile.rs +++ b/src/cargo/ops/lockfile.rs @@ -67,14 +67,6 @@ pub fn write_pkg_lockfile(ws: &Workspace<'_>, resolve: &mut Resolve) -> CargoRes if resolve.version() < ResolveVersion::default() { resolve.set_version(ResolveVersion::default()); out = serialize_resolve(resolve, orig.as_deref()); - } else if resolve.version() > ResolveVersion::default() - && !ws.config().cli_unstable().next_lockfile_bump - { - // The next version hasn't yet stabilized. - anyhow::bail!( - "lock file version `{:?}` requires `-Znext-lockfile-bump`", - resolve.version() - ) } // Ok, if that didn't work just write it out diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index f006a591cce4..92d2d0e1cd5f 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -167,11 +167,7 @@ fn ident_shallow(id: &SourceId, is_shallow: bool) -> String { 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 - // lockfile v4, because we want Source ID serialization to be - // consistent with lockfile. - match self.manifest_reference.pretty_ref(false) { + match self.manifest_reference.pretty_ref(true) { Some(s) => write!(f, " ({})", s), None => Ok(()), } diff --git a/src/cargo/util/toml_mut/dependency.rs b/src/cargo/util/toml_mut/dependency.rs index 2f39b7ab4e4a..8b582d658ced 100644 --- a/src/cargo/util/toml_mut/dependency.rs +++ b/src/cargo/util/toml_mut/dependency.rs @@ -881,11 +881,7 @@ impl GitSource { 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 - // lockfile v4, because we want Source ID serialization to be - // consistent with lockfile. - if let Some(pretty_ref) = git_ref.pretty_ref(false) { + if let Some(pretty_ref) = git_ref.pretty_ref(true) { write!(f, "{}?{}", self.git, pretty_ref) } else { write!(f, "{}", self.git) diff --git a/tests/testsuite/lockfile_compat.rs b/tests/testsuite/lockfile_compat.rs index 97dcff1231a7..839567582079 100644 --- a/tests/testsuite/lockfile_compat.rs +++ b/tests/testsuite/lockfile_compat.rs @@ -889,51 +889,6 @@ perhaps a crate was updated and forgotten to be re-vendored? .run(); } -#[cargo_test] -fn v4_is_unstable() { - let p = project() - .file( - "Cargo.toml", - &format!( - r#" - [package] - name = "foo" - version = "0.0.1" - "#, - ), - ) - .file("src/lib.rs", "") - .file("Cargo.lock", "version = 4") - .build(); - - p.cargo("fetch") - .with_status(101) - .with_stderr( - "\ -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 \ - understand this lock file, perhaps Cargo needs to be updated? -", - ) - .run(); - - // On nightly, let the user know about the `-Z` flag. - p.cargo("fetch") - .masquerade_as_nightly_cargo(&["-Znext-lockfile-bump"]) - .with_status(101) - .with_stderr( - "\ -error: failed to parse lock file at: [CWD]/Cargo.lock - -Caused by: - lock file version 4 requires `-Znext-lockfile-bump` -", - ) - .run(); -} - #[cargo_test] fn v4_cannot_be_created_from_scratch() { let p = project() @@ -950,9 +905,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. @@ -993,6 +946,7 @@ fn v3_and_git_url_encoded(ref_kind: &str, f: impl FnOnce(&git2::Repository, &str let head_id = repo.head().unwrap().target().unwrap(); // Ref name with special characters let git_ref = "a-_+#$)"; + let encoded_ref = "a-_%2B%23%24%29"; f(&repo, git_ref, head_id); let lockfile = format!( @@ -1036,7 +990,7 @@ dependencies = [ .with_stderr(format!( "\ [UPDATING] git repository `{url}` -[CHECKING] dep1 v0.5.0 ({url}?{ref_kind}={git_ref}#[..]) +[CHECKING] dep1 v0.5.0 ({url}?{ref_kind}={encoded_ref}#[..]) [CHECKING] foo v0.0.1 ([CWD]) [FINISHED] dev [..] " @@ -1124,12 +1078,11 @@ 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}` -[CHECKING] dep1 v0.5.0 ({url}?{ref_kind}={git_ref}#[..]) +[CHECKING] dep1 v0.5.0 ({url}?{ref_kind}={encoded_ref}#[..]) [CHECKING] foo v0.0.1 ([CWD]) [FINISHED] dev [..] " @@ -1141,8 +1094,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"]) + p.cargo("check") .with_stderr("[FINISHED] dev [..]") .run(); }