Skip to content

Commit a67e2ba

Browse files
authored
Merge pull request #20014 from Veykril/push-lsqvxunvnrqw
feat: Show what cargo metadata is doing in status
2 parents e2c3647 + 9dfbd56 commit a67e2ba

File tree

6 files changed

+57
-26
lines changed

6 files changed

+57
-26
lines changed

crates/load-cargo/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub fn load_workspace_at(
4242
root: &Path,
4343
cargo_config: &CargoConfig,
4444
load_config: &LoadCargoConfig,
45-
progress: &dyn Fn(String),
45+
progress: &(dyn Fn(String) + Sync),
4646
) -> anyhow::Result<(RootDatabase, vfs::Vfs, Option<ProcMacroClient>)> {
4747
let root = AbsPathBuf::assert_utf8(std::env::current_dir()?.join(root));
4848
let root = ProjectManifest::discover_single(&root)?;

crates/project-model/src/cargo_workspace.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use rustc_hash::{FxHashMap, FxHashSet};
1212
use serde_derive::Deserialize;
1313
use serde_json::from_value;
1414
use span::Edition;
15+
use stdx::process::spawn_with_streaming_output;
1516
use toolchain::Tool;
1617

1718
use crate::{CfgOverrides, InvocationStrategy};
@@ -399,11 +400,21 @@ impl CargoWorkspace {
399400
// FIXME: Fetching metadata is a slow process, as it might require
400401
// calling crates.io. We should be reporting progress here, but it's
401402
// unclear whether cargo itself supports it.
402-
progress("metadata".to_owned());
403-
404-
(|| -> anyhow::Result<(_, _)> {
405-
let output = meta.cargo_command().output()?;
403+
progress("cargo metadata: started".to_owned());
404+
405+
let res = (|| -> anyhow::Result<(_, _)> {
406+
let mut errored = false;
407+
let output =
408+
spawn_with_streaming_output(meta.cargo_command(), &mut |_| (), &mut |line| {
409+
errored = errored || line.starts_with("error") || line.starts_with("warning");
410+
if errored {
411+
progress("cargo metadata: ?".to_owned());
412+
return;
413+
}
414+
progress(format!("cargo metadata: {line}"));
415+
})?;
406416
if !output.status.success() {
417+
progress(format!("cargo metadata: failed {}", output.status));
407418
let error = cargo_metadata::Error::CargoMetadata {
408419
stderr: String::from_utf8(output.stderr)?,
409420
}
@@ -431,7 +442,9 @@ impl CargoWorkspace {
431442
.ok_or(cargo_metadata::Error::NoJson)?;
432443
Ok((cargo_metadata::MetadataCommand::parse(stdout)?, None))
433444
})()
434-
.with_context(|| format!("Failed to run `{:?}`", meta.cargo_command()))
445+
.with_context(|| format!("Failed to run `{:?}`", meta.cargo_command()));
446+
progress("cargo metadata: finished".to_owned());
447+
res
435448
}
436449

437450
pub fn new(

crates/project-model/src/sysroot.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ impl Sysroot {
195195
pub fn load_workspace(
196196
&self,
197197
sysroot_source_config: &RustSourceWorkspaceConfig,
198+
progress: &dyn Fn(String),
198199
) -> Option<RustLibSrcWorkspace> {
199200
assert!(matches!(self.workspace, RustLibSrcWorkspace::Empty), "workspace already loaded");
200201
let Self { root: _, rust_lib_src_root: Some(src_root), workspace: _, error: _ } = self
@@ -205,7 +206,7 @@ impl Sysroot {
205206
let library_manifest = ManifestPath::try_from(src_root.join("Cargo.toml")).unwrap();
206207
if fs::metadata(&library_manifest).is_ok() {
207208
if let Some(loaded) =
208-
self.load_library_via_cargo(library_manifest, src_root, cargo_config)
209+
self.load_library_via_cargo(library_manifest, src_root, cargo_config, progress)
209210
{
210211
return Some(loaded);
211212
}
@@ -296,6 +297,7 @@ impl Sysroot {
296297
library_manifest: ManifestPath,
297298
rust_lib_src_dir: &AbsPathBuf,
298299
cargo_config: &CargoMetadataConfig,
300+
progress: &dyn Fn(String),
299301
) -> Option<RustLibSrcWorkspace> {
300302
tracing::debug!("Loading library metadata: {library_manifest}");
301303
let mut cargo_config = cargo_config.clone();
@@ -313,7 +315,7 @@ impl Sysroot {
313315
false,
314316
// Make sure we never attempt to write to the sysroot
315317
true,
316-
&|_| (),
318+
progress,
317319
) {
318320
Ok(it) => it,
319321
Err(e) => {

crates/project-model/src/tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ fn smoke_test_real_sysroot_cargo() {
235235
AbsPath::assert(Utf8Path::new(env!("CARGO_MANIFEST_DIR"))),
236236
&Default::default(),
237237
);
238-
let loaded_sysroot = sysroot.load_workspace(&RustSourceWorkspaceConfig::default_cargo());
238+
let loaded_sysroot =
239+
sysroot.load_workspace(&RustSourceWorkspaceConfig::default_cargo(), &|_| ());
239240
if let Some(loaded_sysroot) = loaded_sysroot {
240241
sysroot.set_workspace(loaded_sysroot);
241242
}

crates/project-model/src/workspace.rs

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ impl ProjectWorkspace {
170170
pub fn load(
171171
manifest: ProjectManifest,
172172
config: &CargoConfig,
173-
progress: &dyn Fn(String),
173+
progress: &(dyn Fn(String) + Sync),
174174
) -> anyhow::Result<ProjectWorkspace> {
175175
ProjectWorkspace::load_inner(&manifest, config, progress)
176176
.with_context(|| format!("Failed to load the project at {manifest}"))
@@ -179,7 +179,7 @@ impl ProjectWorkspace {
179179
fn load_inner(
180180
manifest: &ProjectManifest,
181181
config: &CargoConfig,
182-
progress: &dyn Fn(String),
182+
progress: &(dyn Fn(String) + Sync),
183183
) -> anyhow::Result<ProjectWorkspace> {
184184
let res = match manifest {
185185
ProjectManifest::ProjectJson(project_json) => {
@@ -206,7 +206,7 @@ impl ProjectWorkspace {
206206
fn load_cargo(
207207
cargo_toml: &ManifestPath,
208208
config: &CargoConfig,
209-
progress: &dyn Fn(String),
209+
progress: &(dyn Fn(String) + Sync),
210210
) -> Result<ProjectWorkspace, anyhow::Error> {
211211
progress("Discovering sysroot".to_owned());
212212
let CargoConfig {
@@ -304,7 +304,7 @@ impl ProjectWorkspace {
304304
&sysroot,
305305
*no_deps,
306306
false,
307-
&|_| (),
307+
progress,
308308
) {
309309
Ok((meta, _error)) => {
310310
let workspace = CargoWorkspace::new(
@@ -347,13 +347,16 @@ impl ProjectWorkspace {
347347
&sysroot,
348348
*no_deps,
349349
false,
350-
&|_| (),
350+
progress,
351351
)
352352
});
353353
let loaded_sysroot = s.spawn(|| {
354-
sysroot.load_workspace(&RustSourceWorkspaceConfig::CargoMetadata(
355-
sysroot_metadata_config(extra_env, &targets),
356-
))
354+
sysroot.load_workspace(
355+
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
356+
extra_env, &targets,
357+
)),
358+
progress,
359+
)
357360
});
358361
let cargo_config_extra_env =
359362
s.spawn(|| cargo_config_env(cargo_toml, extra_env, &sysroot));
@@ -411,7 +414,7 @@ impl ProjectWorkspace {
411414
pub fn load_inline(
412415
mut project_json: ProjectJson,
413416
config: &CargoConfig,
414-
progress: &dyn Fn(String),
417+
progress: &(dyn Fn(String) + Sync),
415418
) -> ProjectWorkspace {
416419
progress("Discovering sysroot".to_owned());
417420
let mut sysroot =
@@ -443,11 +446,18 @@ impl ProjectWorkspace {
443446
});
444447
let loaded_sysroot = s.spawn(|| {
445448
if let Some(sysroot_project) = sysroot_project {
446-
sysroot.load_workspace(&RustSourceWorkspaceConfig::Json(*sysroot_project))
449+
sysroot.load_workspace(
450+
&RustSourceWorkspaceConfig::Json(*sysroot_project),
451+
progress,
452+
)
447453
} else {
448-
sysroot.load_workspace(&RustSourceWorkspaceConfig::CargoMetadata(
449-
sysroot_metadata_config(&config.extra_env, &targets),
450-
))
454+
sysroot.load_workspace(
455+
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
456+
&config.extra_env,
457+
&targets,
458+
)),
459+
progress,
460+
)
451461
}
452462
});
453463

@@ -497,9 +507,13 @@ impl ProjectWorkspace {
497507
.unwrap_or_default();
498508
let rustc_cfg = rustc_cfg::get(query_config, None, &config.extra_env);
499509
let data_layout = target_data_layout::get(query_config, None, &config.extra_env);
500-
let loaded_sysroot = sysroot.load_workspace(&RustSourceWorkspaceConfig::CargoMetadata(
501-
sysroot_metadata_config(&config.extra_env, &targets),
502-
));
510+
let loaded_sysroot = sysroot.load_workspace(
511+
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
512+
&config.extra_env,
513+
&targets,
514+
)),
515+
&|_| (),
516+
);
503517
if let Some(loaded_sysroot) = loaded_sysroot {
504518
sysroot.set_workspace(loaded_sysroot);
505519
}

crates/rust-analyzer/src/cli/rustc_tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ impl Tester {
7676
};
7777

7878
let mut sysroot = Sysroot::discover(tmp_file.parent().unwrap(), &cargo_config.extra_env);
79-
let loaded_sysroot = sysroot.load_workspace(&RustSourceWorkspaceConfig::default_cargo());
79+
let loaded_sysroot =
80+
sysroot.load_workspace(&RustSourceWorkspaceConfig::default_cargo(), &|_| ());
8081
if let Some(loaded_sysroot) = loaded_sysroot {
8182
sysroot.set_workspace(loaded_sysroot);
8283
}

0 commit comments

Comments
 (0)