Skip to content

Commit 18ff915

Browse files
committed
Make cargo metadata output deterministic
Uses BTreeMap instead of HashMap for the `cargo metadata` command. The change did not cause a measurable performance impact for running `cargo metadata` on `cargo` itself. Fixes #8477
1 parent 2f4097a commit 18ff915

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/cargo/ops/cargo_output_metadata.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::ops::{self, Packages};
66
use crate::util::CargoResult;
77
use cargo_platform::Platform;
88
use serde::Serialize;
9-
use std::collections::HashMap;
9+
use std::collections::BTreeMap;
1010
use std::path::PathBuf;
1111

1212
const VERSION: u32 = 1;
@@ -130,7 +130,7 @@ fn build_resolve_graph(
130130
// Download all Packages. This is needed to serialize the information
131131
// for every package. In theory this could honor target filtering,
132132
// but that would be somewhat complex.
133-
let mut package_map: HashMap<PackageId, Package> = ws_resolve
133+
let package_map: BTreeMap<PackageId, Package> = ws_resolve
134134
.pkg_set
135135
.get_many(ws_resolve.pkg_set.package_ids())?
136136
.into_iter()
@@ -140,7 +140,7 @@ fn build_resolve_graph(
140140

141141
// Start from the workspace roots, and recurse through filling out the
142142
// map, filtering targets as necessary.
143-
let mut node_map = HashMap::new();
143+
let mut node_map = BTreeMap::new();
144144
for member_pkg in ws.members() {
145145
build_resolve_graph_r(
146146
&mut node_map,
@@ -153,21 +153,22 @@ fn build_resolve_graph(
153153
}
154154
// Get a Vec of Packages.
155155
let actual_packages = package_map
156-
.drain()
156+
.into_iter()
157157
.filter_map(|(pkg_id, pkg)| node_map.get(&pkg_id).map(|_| pkg))
158158
.collect();
159+
159160
let mr = MetadataResolve {
160-
nodes: node_map.drain().map(|(_pkg_id, node)| node).collect(),
161+
nodes: node_map.into_iter().map(|(_pkg_id, node)| node).collect(),
161162
root: ws.current_opt().map(|pkg| pkg.package_id()),
162163
};
163164
Ok((actual_packages, mr))
164165
}
165166

166167
fn build_resolve_graph_r(
167-
node_map: &mut HashMap<PackageId, MetadataResolveNode>,
168+
node_map: &mut BTreeMap<PackageId, MetadataResolveNode>,
168169
pkg_id: PackageId,
169170
resolve: &Resolve,
170-
package_map: &HashMap<PackageId, Package>,
171+
package_map: &BTreeMap<PackageId, Package>,
171172
target_data: &RustcTargetData,
172173
requested_kinds: &[CompileKind],
173174
) {

0 commit comments

Comments
 (0)