Skip to content

Commit 116e3d1

Browse files
authored
Show cargo build output when expanding (#358)
Resolves #357 Opted to keep it simple, no progress bar, run expand sequentially. Just prints the current package and it's index. ```bash > cargo shear --expand Expanding basic-otlp [1/21] Compiling proc-macro2 v1.0.103 Compiling quote v1.0.42 Compiling unicode-ident v1.0.22 ... ```
1 parent f28190a commit 116e3d1

File tree

2 files changed

+67
-27
lines changed

2 files changed

+67
-27
lines changed

src/dependency_analyzer.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
//! The analyzer walks through all source files in a package, collects import
1010
//! statements, and builds a set of used import names.
1111
12-
use std::{env, ffi::OsString, path::PathBuf, process::Command};
12+
use std::{
13+
env,
14+
ffi::OsString,
15+
path::PathBuf,
16+
process::{Command, Stdio},
17+
};
1318

1419
use anyhow::{Result, anyhow};
1520
use cargo_metadata::{Package, Target, TargetKind};
@@ -210,20 +215,16 @@ impl DependencyAnalyzer {
210215
.arg(&target_arg)
211216
.arg("--all-features")
212217
.arg("--profile=check")
213-
.arg("--color=never")
214218
.arg("--")
215219
.arg("-Zunpretty=expanded")
216220
.current_dir(package.manifest_path.parent().ok_or_else(|| {
217221
anyhow!("Failed to get parent path: {}", package.manifest_path)
218-
})?);
222+
})?)
223+
.stderr(Stdio::inherit());
219224

220225
let output = cmd.output()?;
221226
if !output.status.success() {
222-
return Err(anyhow!(
223-
"Cargo expand failed for {}:\n{}",
224-
target.name,
225-
String::from_utf8_lossy(&output.stderr)
226-
));
227+
return Err(anyhow!("Cargo expand failed for {}", target.name));
227228
}
228229

229230
let output_str = String::from_utf8(output.stdout)?;

src/lib.rs

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ use std::{
5050

5151
use anyhow::Result;
5252
use bpaf::Bpaf;
53-
use cargo_metadata::{CargoOpt, MetadataCommand};
53+
use cargo_metadata::{CargoOpt, Metadata, MetadataCommand, Package};
54+
use owo_colors::OwoColorize;
5455
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
5556
use toml_edit::DocumentMut;
5657

@@ -339,24 +340,45 @@ impl<W: Write> CargoShear<W> {
339340
})
340341
.collect();
341342

342-
// Process packages in parallel
343-
let results: Vec<_> = packages
344-
.par_iter()
345-
.map(|package| {
346-
let manifest_path = package.manifest_path.as_std_path();
347-
let relative_path = manifest_path.strip_prefix(&root).unwrap_or(manifest_path);
348-
349-
let content = fs::read_to_string(manifest_path)?;
350-
let manifest: Manifest = toml::from_str(&content)?;
351-
let result = processor.process_package(
352-
&metadata,
353-
package,
354-
&manifest,
355-
&workspace_manifest,
356-
)?;
357-
Ok::<_, anyhow::Error>((relative_path.to_path_buf(), content, result))
358-
})
359-
.collect::<Result<Vec<_>>>()?;
343+
let total = packages.len();
344+
let results: Vec<_> = if self.options.expand {
345+
// Process packages sequentially, since expand needs to invoke `cargo build`.
346+
packages
347+
.iter()
348+
.enumerate()
349+
.map(|(index, package)| {
350+
eprintln!(
351+
"{:>12} {} [{}/{}]",
352+
"Expanding".bright_cyan().bold(),
353+
package.name,
354+
index + 1,
355+
total
356+
);
357+
358+
Self::process_package(
359+
&root,
360+
&processor,
361+
&metadata,
362+
&workspace_manifest,
363+
package,
364+
)
365+
})
366+
.collect::<Result<Vec<_>>>()?
367+
} else {
368+
// Process packages in parallel
369+
packages
370+
.par_iter()
371+
.map(|package| {
372+
Self::process_package(
373+
&root,
374+
&processor,
375+
&metadata,
376+
&workspace_manifest,
377+
package,
378+
)
379+
})
380+
.collect::<Result<Vec<_>>>()?
381+
};
360382

361383
for (path, content, result) in results {
362384
let absolute_path = root.join(&path);
@@ -387,6 +409,23 @@ impl<W: Write> CargoShear<W> {
387409
Ok(())
388410
}
389411

412+
fn process_package(
413+
root: &Path,
414+
processor: &PackageProcessor,
415+
metadata: &Metadata,
416+
workspace_manifest: &Manifest,
417+
package: &Package,
418+
) -> Result<(PathBuf, String, PackageAnalysis)> {
419+
let manifest_path = package.manifest_path.as_std_path();
420+
let relative_path = manifest_path.strip_prefix(root).unwrap_or(manifest_path);
421+
422+
let content = fs::read_to_string(manifest_path)?;
423+
let manifest: Manifest = toml::from_str(&content)?;
424+
let result = processor.process_package(metadata, package, &manifest, workspace_manifest)?;
425+
426+
Ok((relative_path.to_path_buf(), content, result))
427+
}
428+
390429
fn fix_package_issues(&self, manifest_path: &Path, result: &PackageAnalysis) -> Result<usize> {
391430
if !self.options.fix {
392431
return Ok(0);

0 commit comments

Comments
 (0)