Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #13979 - tweag:issue-12425, r=epage
Add `cargo update --breaking` Related to #12425. There are two kinds of manifest mutations here. In `upgrade_manifests` we have to mutate `cargo::core::manifest::Manifest` so that `resolve_ws` does what it needs to do, and outputs a correct lock file. Then, in `write_manifest_upgrades` we mutate `cargo::util::toml_mut::manifest::Manifest`, because that is how we can preserve the existing formatting in the manifest files on disk. Some of the code here is copied from `cargo-edit`. # Comparison with `cargo upgrade` Running on the Cargo source itself gives the following: ``` ❯ cargo upgrade --dry-run --incompatible allow --compatible ignore Updating 'https://github.com/rust-lang/crates.io-index' index Checking benchsuite's dependencies Checking capture's dependencies Checking cargo's dependencies name old req compatible latest new req note ==== ======= ========== ====== ======= ==== anstream 0.6.13 0.6.14 0.6.14 0.6.13 compatible anstyle 1.0.6 1.0.7 1.0.7 1.0.6 compatible anyhow 1.0.82 1.0.86 1.0.86 1.0.82 compatible itertools 0.12.1 0.12.1 0.13.0 0.13.0 libc 0.2.154 0.2.155 0.2.155 0.2.154 compatible opener 0.7.0 0.7.1 0.7.1 0.7.0 compatible openssl 0.10.57 0.10.64 0.10.64 0.10.57 compatible openssl-sys =0.9.92 0.9.92 0.9.102 =0.9.92 pinned pulldown-cmark 0.10.3 0.10.3 0.11.0 0.11.0 security-framework 2.10.0 2.11.0 2.11.0 2.10.0 compatible semver 1.0.22 1.0.23 1.0.23 1.0.22 compatible serde 1.0.199 1.0.203 1.0.203 1.0.199 compatible serde-untagged 0.1.5 0.1.6 0.1.6 0.1.5 compatible serde_json 1.0.116 1.0.117 1.0.117 1.0.116 compatible tar 0.4.40 0.4.41 0.4.41 0.4.40 compatible thiserror 1.0.59 1.0.61 1.0.61 1.0.59 compatible toml 0.8.12 0.8.14 0.8.14 0.8.12 compatible toml_edit 0.22.12 0.22.14 0.22.14 0.22.12 compatible unicode-width 0.1.12 0.1.13 0.1.13 0.1.12 compatible Checking cargo-credential's dependencies Checking cargo-credential-1password's dependencies Checking cargo-credential-libsecret's dependencies Checking cargo-credential-macos-keychain's dependencies Checking cargo-credential-wincred's dependencies Checking cargo-platform's dependencies Checking cargo-test-macro's dependencies Checking cargo-test-support's dependencies Checking cargo-util's dependencies Checking cargo-util-schemas's dependencies Checking crates-io's dependencies Checking home's dependencies Checking mdman's dependencies Checking resolver-tests's dependencies Checking rustfix's dependencies Checking semver-check's dependencies Checking xtask-build-man's dependencies Checking xtask-bump-check's dependencies Checking xtask-stale-label's dependencies note: Re-run with `--pinned` to upgrade pinned version requirements note: Re-run with `--verbose` to show all dependencies local: cargo unchanged: annotate-snippets, base64, bytesize, cargo-credential, cargo-credential-libsecret, cargo-credential-macos-keychain, cargo-credential-wincred, cargo-platform, cargo-test-macro, cargo-test-support, cargo-util, cargo-util-schemas, cargo_metadata, clap, color-print, core-foundation, crates-io, criterion, curl, curl-sys, filetime, flate2, git2, git2-curl, gix, glob, handlebars, hex, hmac, home, http-auth, humantime, ignore, im-rc, indexmap, jobserver, lazycell, libgit2-sys, libloading, memchr, miow, os_info, pasetors, pathdiff, percent-encoding, pkg-config, proptest, rand, regex, rusqlite, rustfix, same-file, serde-value, serde_ignored, sha1, sha2, shell-escape, similar, snapbox, supports-hyperlinks, supports-unicode, tempfile, time, tracing, tracing-chrome, tracing-subscriber, unicase, unicode-xid, url, varisat, walkdir, windows-sys warning: aborting upgrade due to dry run ❯ target/debug/cargo update --breaking --dry-run -Zunstable-options Updating crates.io index Upgrading itertools ^0.12.1 -> ^0.13.0 Upgrading pulldown-cmark ^0.10.3 -> ^0.11.0 Updating crates.io index Locking 3 packages to latest compatible versions Updating itertools v0.12.1 -> v0.13.0 Updating pulldown-cmark v0.10.3 -> v0.11.0 Updating pulldown-cmark-escape v0.10.0 -> v0.11.0 warning: not updating any files due to dry run ``` In both cases we see an upgrade of `itertools` to `^0.13.0` and `pulldown-cmark` to `^0.11.0`. The diff to the manifest (when it isn't a dry run) is as follows: ``` --- a/Cargo.toml +++ b/Cargo.toml `@@` -57,7 +57,7 `@@` humantime = "2.1.0" ignore = "0.4.22" im-rc = "15.1.0" indexmap = "2.2.6" -itertools = "0.12.1" +itertools = "0.13.0" jobserver = "0.1.31" lazycell = "1.3.0" libc = "0.2.154" `@@` -74,7 +74,7 `@@` pathdiff = "0.2.1" percent-encoding = "2.3.1" pkg-config = "0.3.30" proptest = "1.4.0" -pulldown-cmark = { version = "0.10.3", default-features = false, features = ["html"] } +pulldown-cmark = { version = "0.11.0", default-features = false, features = ["html"] } rand = "0.8.5" regex = "1.10.4" rusqlite = { version = "0.31.0", features = ["bundled"] } ``` # TODO - [x] In the case of `--incompatible`, we also need to let `update_lockfile` use `upgrades` in order to only update the incompatible dependencies. - [x] Testing all the different cases of package sources, version requirements, pinned versions, renamed dependencies, inherited workspace dependencies, multiple versions of the same dependency, selecting a subset `--package`, etc. - [x] Passing tests. - [x] Implement suggestions from reviews. - [x] The preservation of formatting in manifest files should be improved. - [x] Compare with `cargo upgrade`.
- Loading branch information