aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-07-10 21:28:41 +0100
committerAleksey Kladov <[email protected]>2020-07-10 21:30:24 +0100
commit676d2e040dfe619d666d5b3068db47346655f23b (patch)
treed6cd17e713c766f16db7a5d7ca19a604c9e5e455
parentbe679a02aba985ee458dd8441606bff0595a2ce2 (diff)
Sort cargo metadata
See https://github.com/rust-lang/cargo/issues/8477 We need this to prevent spurious workspace reloads
-rw-r--r--crates/ra_project_model/src/cargo_workspace.rs6
1 files changed, 4 insertions, 2 deletions
diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs
index 6d1154056..4182ca156 100644
--- a/crates/ra_project_model/src/cargo_workspace.rs
+++ b/crates/ra_project_model/src/cargo_workspace.rs
@@ -155,7 +155,7 @@ impl CargoWorkspace {
155 if let Some(target) = cargo_features.target.as_ref() { 155 if let Some(target) = cargo_features.target.as_ref() {
156 meta.other_options(vec![String::from("--filter-platform"), target.clone()]); 156 meta.other_options(vec![String::from("--filter-platform"), target.clone()]);
157 } 157 }
158 let meta = meta.exec().with_context(|| { 158 let mut meta = meta.exec().with_context(|| {
159 format!("Failed to run `cargo metadata --manifest-path {}`", cargo_toml.display()) 159 format!("Failed to run `cargo metadata --manifest-path {}`", cargo_toml.display())
160 })?; 160 })?;
161 161
@@ -175,6 +175,7 @@ impl CargoWorkspace {
175 175
176 let ws_members = &meta.workspace_members; 176 let ws_members = &meta.workspace_members;
177 177
178 meta.packages.sort_by(|a, b| a.id.cmp(&b.id));
178 for meta_pkg in meta.packages { 179 for meta_pkg in meta.packages {
179 let cargo_metadata::Package { id, edition, name, manifest_path, version, .. } = 180 let cargo_metadata::Package { id, edition, name, manifest_path, version, .. } =
180 meta_pkg; 181 meta_pkg;
@@ -210,7 +211,7 @@ impl CargoWorkspace {
210 } 211 }
211 } 212 }
212 let resolve = meta.resolve.expect("metadata executed with deps"); 213 let resolve = meta.resolve.expect("metadata executed with deps");
213 for node in resolve.nodes { 214 for mut node in resolve.nodes {
214 let source = match pkg_by_id.get(&node.id) { 215 let source = match pkg_by_id.get(&node.id) {
215 Some(&src) => src, 216 Some(&src) => src,
216 // FIXME: replace this and a similar branch below with `.unwrap`, once 217 // FIXME: replace this and a similar branch below with `.unwrap`, once
@@ -221,6 +222,7 @@ impl CargoWorkspace {
221 continue; 222 continue;
222 } 223 }
223 }; 224 };
225 node.deps.sort_by(|a, b| a.pkg.cmp(&b.pkg));
224 for dep_node in node.deps { 226 for dep_node in node.deps {
225 let pkg = match pkg_by_id.get(&dep_node.pkg) { 227 let pkg = match pkg_by_id.get(&dep_node.pkg) {
226 Some(&pkg) => pkg, 228 Some(&pkg) => pkg,