Make manifest serialization deterministic
authorSimon Sapin <simon.sapin@exyr.org>
Mon, 2 Oct 2017 10:04:02 +0000 (12:04 +0200)
committerSimon Sapin <simon.sapin@exyr.org>
Mon, 2 Oct 2017 10:09:54 +0000 (12:09 +0200)
commitf38c53f5c3d0a98d11ac286f4889fa29034be4e8
tree05fa0629239edb4e18f38d86ecd7b462c542aff8
parenta888e111e4938b8c305190fd0eaebef5f4c1718f
Make manifest serialization deterministic

Fixes #4326

`cargo package` (and so `cargo publish`) parses a crate’s `Cargo.toml`,
makes some modifications, and re-serializes it.
Because the `TomlManifest` struct uses `HashMap`
with its default `RandomState` hasher,
the maps’ iteration order changed on every run.

As a result, when using `cargo vendor`,
updating a dependency would generate a diff larger than necessary,
with non-significant order-changes obscuring significant changes.

This replaces some uses of `HashMap` with `BTreeMap`,
whose iteration order is deterministic (based on `Ord`).
Cargo.lock
src/cargo/core/manifest.rs
src/cargo/core/package.rs
src/cargo/core/summary.rs
src/cargo/sources/registry/mod.rs
src/cargo/util/toml/mod.rs
src/crates-io/lib.rs
tests/package.rs
tests/resolve.rs