| use std::path::Path; | |
| use tracing::instrument; | |
| use crate::CargoResult; | |
| use crate::GlobalContext; | |
| use crate::diagnostics::ManifestFor; | |
| use crate::diagnostics::ScopedDiagnosticStats; | |
| use crate::diagnostics::workspace_rel_path; | |
| use crate::workspace::MaybePackage; | |
| use crate::workspace::Workspace; | |
| #[instrument(skip_all)] | |
| pub(crate) fn diagnose_manifest( | |
| ws: &Workspace<'_>, | |
| manifest: ManifestFor<'_>, | |
| manifest_path: &Path, | |
| pkg_stats: &mut ScopedDiagnosticStats<'_>, | |
| gctx: &GlobalContext, | |
| ) -> CargoResult<()> { | |
| let warnings = match &manifest { | |
| ManifestFor::Package(pkg) => pkg.manifest().warnings().warnings(), | |
| ManifestFor::Workspace { | |
| maybe_pkg: MaybePackage::Virtual(vm), | |
| .. | |
| } => vm.warnings().warnings(), | |
| ManifestFor::Workspace { | |
| maybe_pkg: MaybePackage::Package(_), | |
| .. | |
| } => { | |
| // For real manifests, lint as a package, rather than a workspace | |
| return Ok(()); | |
| } | |
| }; | |
| let manifest_path = workspace_rel_path(ws, manifest_path); | |
| for warning in warnings { | |
| let msg = format!("{manifest_path}: {}", warning.message); | |
| if warning.is_critical { | |
| pkg_stats.record_error(); | |
| gctx.shell().error(msg)? | |
| } else { | |
| pkg_stats.record_warning(); | |
| gctx.shell().warn(msg)? | |
| } | |
| } | |
| Ok(()) | |
| } |