diff --git a/Cargo.lock b/Cargo.lock index 7ee49ebf1e5..f4ab074d6c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -233,6 +233,7 @@ version = "0.0.0" dependencies = [ "cargo", "cargo-util", + "cargo-util-terminal", "criterion", "flate2", "rand 0.10.0", @@ -371,7 +372,6 @@ dependencies = [ "annotate-snippets", "anstream 1.0.0", "anstyle", - "anstyle-hyperlink", "anstyle-progress", "anyhow", "base64", @@ -384,6 +384,7 @@ dependencies = [ "cargo-test-support", "cargo-util", "cargo-util-schemas", + "cargo-util-terminal", "clap", "clap_complete", "color-print", @@ -433,8 +434,6 @@ dependencies = [ "sha1", "shell-escape", "snapbox", - "supports-hyperlinks", - "supports-unicode", "tar", "tempfile", "thiserror 2.0.18", @@ -590,6 +589,24 @@ dependencies = [ "url", ] +[[package]] +name = "cargo-util-terminal" +version = "0.1.0" +dependencies = [ + "annotate-snippets", + "anstream 1.0.0", + "anstyle", + "anstyle-hyperlink", + "anstyle-progress", + "anyhow", + "libc", + "serde", + "serde_json", + "supports-hyperlinks", + "supports-unicode", + "windows-sys 0.61.2", +] + [[package]] name = "cargo_metadata" version = "0.23.1" @@ -5629,6 +5646,7 @@ dependencies = [ "anyhow", "cargo", "cargo-util", + "cargo-util-terminal", "clap", "git2", "semver", diff --git a/Cargo.toml b/Cargo.toml index 361c2064391..c652faf4baf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ cargo-test-macro = { version = "0.4.10", path = "crates/cargo-test-macro" } cargo-test-support = { version = "0.11.0", path = "crates/cargo-test-support" } cargo-util = { version = "0.2.28", path = "crates/cargo-util" } cargo-util-schemas = { version = "0.13.0", path = "crates/cargo-util-schemas" } +cargo-util-terminal = { version = "0.1.0", path = "crates/cargo-util-terminal" } cargo_metadata = "0.23.1" clap = "4.5.60" clap_complete = { version = "4.5.66", features = ["unstable-dynamic"] } @@ -159,7 +160,6 @@ path = "src/cargo/lib.rs" annotate-snippets.workspace = true anstream.workspace = true anstyle.workspace = true -anstyle-hyperlink = { workspace = true, features = ["file"] } anstyle-progress.workspace = true anyhow.workspace = true base64.workspace = true @@ -167,6 +167,7 @@ blake3.workspace = true cargo-credential.workspace = true cargo-platform.workspace = true cargo-util-schemas.workspace = true +cargo-util-terminal.workspace = true cargo-util.workspace = true clap = { workspace = true, features = ["wrap_help"] } clap_complete.workspace = true @@ -211,8 +212,6 @@ serde_ignored.workspace = true serde_json = { workspace = true, features = ["raw_value"] } sha1.workspace = true shell-escape.workspace = true -supports-hyperlinks.workspace = true -supports-unicode.workspace = true tar.workspace = true tempfile.workspace = true thiserror.workspace = true diff --git a/benches/benchsuite/Cargo.toml b/benches/benchsuite/Cargo.toml index 53a66ee8d44..867b6722325 100644 --- a/benches/benchsuite/Cargo.toml +++ b/benches/benchsuite/Cargo.toml @@ -10,6 +10,7 @@ publish = false [dependencies] cargo.workspace = true cargo-util.workspace = true +cargo-util-terminal.workspace = true criterion.workspace = true flate2.workspace = true rand.workspace = true diff --git a/benches/benchsuite/benches/global_cache_tracker.rs b/benches/benchsuite/benches/global_cache_tracker.rs index 2342546202e..cd8ba945a54 100644 --- a/benches/benchsuite/benches/global_cache_tracker.rs +++ b/benches/benchsuite/benches/global_cache_tracker.rs @@ -27,7 +27,7 @@ fn cargo_home() -> PathBuf { fn initialize_context() -> GlobalContext { // Set up config. - let shell = cargo::core::Shell::new(); + let shell = cargo_util_terminal::Shell::new(); let homedir = cargo_home(); if !homedir.exists() { fs::create_dir_all(&homedir).unwrap(); diff --git a/benches/benchsuite/src/bin/capture-last-use.rs b/benches/benchsuite/src/bin/capture-last-use.rs index bb72c97ffa1..e2c1c06d418 100644 --- a/benches/benchsuite/src/bin/capture-last-use.rs +++ b/benches/benchsuite/src/bin/capture-last-use.rs @@ -24,7 +24,7 @@ use std::path::Path; fn main() { // Set up config. - let shell = cargo::core::Shell::new(); + let shell = cargo_util_terminal::Shell::new(); let homedir = Path::new(env!("CARGO_MANIFEST_DIR")).join("global-cache-tracker"); let cwd = homedir.clone(); let mut gctx = GlobalContext::new(shell, cwd, homedir.clone()); diff --git a/benches/benchsuite/src/lib.rs b/benches/benchsuite/src/lib.rs index 8968ab7bdeb..65c775c2f87 100644 --- a/benches/benchsuite/src/lib.rs +++ b/benches/benchsuite/src/lib.rs @@ -185,7 +185,7 @@ impl Fixtures { /// Creates a new Context. pub fn make_context(&self, ws_root: &Path) -> GlobalContext { - let shell = cargo::core::Shell::new(); + let shell = cargo_util_terminal::Shell::new(); let mut gctx = GlobalContext::new(shell, ws_root.to_path_buf(), self.cargo_home()); // Configure is needed to set the target_dir which is needed to write // the .rustc_info.json file which is very expensive. diff --git a/crates/cargo-util-terminal/Cargo.toml b/crates/cargo-util-terminal/Cargo.toml new file mode 100644 index 00000000000..0ed533427de --- /dev/null +++ b/crates/cargo-util-terminal/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "cargo-util-terminal" +version = "0.1.0" +rust-version = "1.94" # MSRV:1 +edition.workspace = true +license.workspace = true +repository.workspace = true +description = "Cargo's terminal rendering" + +[dependencies] +annotate-snippets.workspace = true +anstream.workspace = true +anstyle.workspace = true +anstyle-hyperlink = { workspace = true, features = ["file"] } +anstyle-progress.workspace = true +anyhow.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true, features = ["raw_value"] } +supports-hyperlinks.workspace = true +supports-unicode.workspace = true + +[target.'cfg(unix)'.dependencies] +libc.workspace = true + +[target.'cfg(windows)'.dependencies.windows-sys] +workspace = true +features = [ + "Win32_Foundation", + "Win32_Security", + "Win32_Storage_FileSystem", + "Win32_System_IO", + "Win32_System_Console", + "Win32_System_JobObjects", + "Win32_System_Threading", +] + +[lints] +workspace = true diff --git a/crates/cargo-util-terminal/LICENSE-APACHE b/crates/cargo-util-terminal/LICENSE-APACHE new file mode 120000 index 00000000000..1cd601d0a3a --- /dev/null +++ b/crates/cargo-util-terminal/LICENSE-APACHE @@ -0,0 +1 @@ +../../LICENSE-APACHE \ No newline at end of file diff --git a/crates/cargo-util-terminal/LICENSE-MIT b/crates/cargo-util-terminal/LICENSE-MIT new file mode 120000 index 00000000000..b2cfbdc7b0b --- /dev/null +++ b/crates/cargo-util-terminal/LICENSE-MIT @@ -0,0 +1 @@ +../../LICENSE-MIT \ No newline at end of file diff --git a/crates/cargo-util-terminal/README.md b/crates/cargo-util-terminal/README.md new file mode 100644 index 00000000000..579d1a85c1e --- /dev/null +++ b/crates/cargo-util-terminal/README.md @@ -0,0 +1,3 @@ +> This crate is maintained by the Cargo team, primarily for use by Cargo +> and not intended for external use (except as a transitive dependency). This +> crate may make major changes to its APIs or be deprecated without warning. diff --git a/crates/cargo-util-terminal/src/lib.rs b/crates/cargo-util-terminal/src/lib.rs new file mode 100644 index 00000000000..27b74f2b7d7 --- /dev/null +++ b/crates/cargo-util-terminal/src/lib.rs @@ -0,0 +1,19 @@ +//! Miscellaneous support code used by Cargo. +//! +//! > This crate is maintained by the Cargo team, primarily for use by Cargo +//! > and not intended for external use (except as a transitive dependency). This +//! > crate may make major changes to its APIs or be deprecated without warning. + +#![allow(clippy::disallowed_methods)] + +mod shell; + +pub mod style; + +pub use shell::ColorChoice; +pub use shell::Hyperlink; +pub use shell::Shell; +pub use shell::TtyWidth; +pub use shell::Verbosity; + +pub type CargoResult = anyhow::Result; diff --git a/src/cargo/core/shell.rs b/crates/cargo-util-terminal/src/shell.rs similarity index 99% rename from src/cargo/core/shell.rs rename to crates/cargo-util-terminal/src/shell.rs index a99245835a6..e39d231e7dd 100644 --- a/src/cargo/core/shell.rs +++ b/crates/cargo-util-terminal/src/shell.rs @@ -7,8 +7,8 @@ use annotate_snippets::{Renderer, Report}; use anstream::AutoStream; use anstyle::Style; -use crate::util::errors::CargoResult; -use crate::util::style::*; +use crate::CargoResult; +use crate::style::*; pub use anstyle_hyperlink::Hyperlink; @@ -373,7 +373,7 @@ impl Shell { } } - pub(crate) fn set_unstable_flags_rustc_unicode(&mut self, yes: bool) -> CargoResult<()> { + pub fn set_unstable_flags_rustc_unicode(&mut self, yes: bool) -> CargoResult<()> { if let ShellOut::Stream { unstable_flags_rustc_unicode, .. diff --git a/src/cargo/util/style.rs b/crates/cargo-util-terminal/src/style.rs similarity index 100% rename from src/cargo/util/style.rs rename to crates/cargo-util-terminal/src/style.rs diff --git a/crates/xtask-bump-check/Cargo.toml b/crates/xtask-bump-check/Cargo.toml index 44ce34141bf..9aa8e4847d1 100644 --- a/crates/xtask-bump-check/Cargo.toml +++ b/crates/xtask-bump-check/Cargo.toml @@ -8,6 +8,7 @@ publish = false anyhow.workspace = true cargo.workspace = true cargo-util.workspace = true +cargo-util-terminal.workspace = true clap.workspace = true git2.workspace = true semver.workspace = true diff --git a/crates/xtask-bump-check/src/main.rs b/crates/xtask-bump-check/src/main.rs index 57bceff53af..c37f293744d 100644 --- a/crates/xtask-bump-check/src/main.rs +++ b/crates/xtask-bump-check/src/main.rs @@ -7,7 +7,7 @@ fn main() { let matches = cli.get_matches(); let mut gctx = cargo::util::context::GlobalContext::default().unwrap_or_else(|e| { - let mut eval = cargo::core::shell::Shell::new(); + let mut eval = cargo_util_terminal::Shell::new(); cargo::exit_with_error(e.into(), &mut eval) }); if let Err(e) = xtask::exec(&matches, &mut gctx) { diff --git a/crates/xtask-bump-check/src/xtask.rs b/crates/xtask-bump-check/src/xtask.rs index dd600cf18a2..f74d7c72668 100644 --- a/crates/xtask-bump-check/src/xtask.rs +++ b/crates/xtask-bump-check/src/xtask.rs @@ -133,6 +133,7 @@ fn bump_check(args: &clap::ArgMatches, gctx: &cargo::util::GlobalContext) -> Car // See `TO_PUBLISH` in publish.py. "home", ]; + let crates_not_checked = ["cargo-util-terminal"]; status(&format!("base commit `{}`", base_commit.id()))?; status(&format!("head commit `{}`", head_commit.id()))?; @@ -152,6 +153,10 @@ fn bump_check(args: &clap::ArgMatches, gctx: &cargo::util::GlobalContext) -> Car continue; } + if crates_not_checked.contains(&pkg_name) { + continue; + } + let Some(changed_member) = changed_members.get(pkg_name) else { tracing::trace!("skipping {pkg_name}, may be removed or not published"); continue; @@ -186,6 +191,9 @@ fn bump_check(args: &clap::ArgMatches, gctx: &cargo::util::GlobalContext) -> Car .arg("--workspace") .arg("--baseline-rev") .arg(referenced_commit.id().to_string()); + for krate in crates_not_checked { + cmd.args(&["--exclude", krate]); + } for krate in crates_not_check_against_channels { cmd.args(&["--exclude", krate]); } @@ -208,6 +216,9 @@ fn bump_check(args: &clap::ArgMatches, gctx: &cargo::util::GlobalContext) -> Car .arg("check-release") .arg("--workspace") .args(&["--exclude", "cargo"]); + for krate in crates_not_checked { + cmd.args(&["--exclude", krate]); + } gctx.shell().status("Running", &cmd)?; cmd.exec()?; diff --git a/publish.py b/publish.py index 6dcf5bd9e36..9a6d2815c01 100755 --- a/publish.py +++ b/publish.py @@ -29,6 +29,7 @@ 'crates/cargo-util', 'crates/crates-io', 'crates/cargo-util-schemas', + 'crates/cargo-util-terminal', 'crates/cargo-test-macro', 'crates/cargo-test-support', 'crates/build-rs', diff --git a/src/bin/cargo/cli.rs b/src/bin/cargo/cli.rs index 0cae9da366f..249ed98b70e 100644 --- a/src/bin/cargo/cli.rs +++ b/src/bin/cargo/cli.rs @@ -16,8 +16,8 @@ use super::third_party_subcommands; use super::user_defined_aliases; use crate::command_prelude::*; use crate::util::is_rustup; -use cargo::core::shell::ColorChoice; use cargo::util::style; +use cargo_util_terminal::ColorChoice; #[tracing::instrument(skip_all)] pub fn main(gctx: &mut GlobalContext) -> CliResult { diff --git a/src/bin/cargo/commands/remove.rs b/src/bin/cargo/commands/remove.rs index 4761ef61eb3..7b6bbcf0f3a 100644 --- a/src/bin/cargo/commands/remove.rs +++ b/src/bin/cargo/commands/remove.rs @@ -124,7 +124,7 @@ help: specify a package with `-p ` let verbosity = ws.gctx().shell().verbosity(); ws.gctx() .shell() - .set_verbosity(cargo::core::Verbosity::Quiet); + .set_verbosity(cargo_util_terminal::Verbosity::Quiet); let resolve = resolve_ws(&ws, dry_run); ws.gctx().shell().set_verbosity(verbosity); resolve?.1 diff --git a/src/bin/cargo/commands/run.rs b/src/bin/cargo/commands/run.rs index 1a0ba652663..634a756a867 100644 --- a/src/bin/cargo/commands/run.rs +++ b/src/bin/cargo/commands/run.rs @@ -4,11 +4,11 @@ use std::path::Path; use crate::command_prelude::*; use crate::util::restricted_names::is_glob_pattern; -use cargo::core::Verbosity; use cargo::core::Workspace; use cargo::ops::{self, CompileFilter, Packages}; use cargo::util::closest; use cargo_util::ProcessError; +use cargo_util_terminal::Verbosity; use itertools::Itertools as _; pub fn cli() -> Command { diff --git a/src/bin/cargo/main.rs b/src/bin/cargo/main.rs index e94d2986faa..fb3b3ab4e80 100644 --- a/src/bin/cargo/main.rs +++ b/src/bin/cargo/main.rs @@ -1,10 +1,10 @@ use cargo::core::features; -use cargo::core::shell::Shell; use cargo::util::network::http::http_handle; use cargo::util::network::http::needs_custom_http_transport; use cargo::util::{self, CargoResult, closest_msg, command_prelude}; use cargo_util::{ProcessBuilder, ProcessError}; use cargo_util_schemas::manifest::StringOrVec; +use cargo_util_terminal::Shell; use std::collections::BTreeMap; use std::env; use std::ffi::OsStr; diff --git a/src/cargo/core/compiler/fingerprint/dirty_reason.rs b/src/cargo/core/compiler/fingerprint/dirty_reason.rs index 46af17569ce..2a96645d7ef 100644 --- a/src/cargo/core/compiler/fingerprint/dirty_reason.rs +++ b/src/cargo/core/compiler/fingerprint/dirty_reason.rs @@ -5,8 +5,8 @@ use std::fmt::Debug; use serde::Serialize; use super::*; -use crate::core::Shell; use crate::core::compiler::UnitIndex; +use cargo_util_terminal::Shell; /// Tells a better story of why a build is considered "dirty" that leads /// to a recompile. Usually constructed via [`Fingerprint::compare`]. diff --git a/src/cargo/core/compiler/job_queue/job_state.rs b/src/cargo/core/compiler/job_queue/job_state.rs index 06a672b611d..06be9193820 100644 --- a/src/cargo/core/compiler/job_queue/job_state.rs +++ b/src/cargo/core/compiler/job_queue/job_state.rs @@ -35,7 +35,7 @@ pub struct JobState<'a, 'gctx> { /// interleaving is still prevented as the lock would be held for the whole printing of an /// output message. /// - /// [`Shell`]: crate::core::Shell + /// [`Shell`]: cargo_util_terminal::Shell /// [`GlobalContext`]: crate::GlobalContext output: Option<&'a DiagDedupe<'gctx>>, diff --git a/src/cargo/core/compiler/job_queue/mod.rs b/src/cargo/core/compiler/job_queue/mod.rs index 1149cd72bcf..7cdab7e2bd6 100644 --- a/src/cargo/core/compiler/job_queue/mod.rs +++ b/src/cargo/core/compiler/job_queue/mod.rs @@ -143,7 +143,7 @@ use crate::core::compiler::future_incompat::{ self, FutureBreakageItem, FutureIncompatReportPackage, }; use crate::core::resolver::ResolveBehavior; -use crate::core::{PackageId, Shell, TargetKind}; +use crate::core::{PackageId, TargetKind}; use crate::util::CargoResult; use crate::util::context::WarningHandling; use crate::util::diagnostic_server::{self, DiagnosticPrinter}; @@ -151,6 +151,7 @@ use crate::util::errors::AlreadyPrintedError; use crate::util::machine_message::{self, Message as _}; use crate::util::{self, internal}; use crate::util::{DependencyQueue, GlobalContext, Progress, ProgressStyle, Queue}; +use cargo_util_terminal::Shell; /// This structure is backed by the `DependencyQueue` type and manages the /// queueing of compilation steps for each package. Packages enqueue units of diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index ea3cc7f9c63..e38f2cd0471 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -102,7 +102,7 @@ pub use crate::core::compiler::unit::UnitIndex; pub use crate::core::compiler::unit::UnitInterner; use crate::core::manifest::TargetSourcePath; use crate::core::profiles::{PanicStrategy, Profile, StripInner}; -use crate::core::{Feature, PackageId, Target, Verbosity}; +use crate::core::{Feature, PackageId, Target}; use crate::lints::get_key_value; use crate::util::OnceExt; use crate::util::context::WarningHandling; @@ -115,6 +115,7 @@ use cargo_util::{ProcessBuilder, ProcessError, paths}; use cargo_util_schemas::manifest::TomlDebugInfo; use cargo_util_schemas::manifest::TomlTrimPaths; use cargo_util_schemas::manifest::TomlTrimPathsValue; +use cargo_util_terminal::Verbosity; use rustfix::diagnostics::Applicability; const RUSTDOC_CRATE_VERSION_FLAG: &str = "--crate-version"; diff --git a/src/cargo/core/global_cache_tracker.rs b/src/cargo/core/global_cache_tracker.rs index 6318d9bd075..8465f18b1bd 100644 --- a/src/cargo/core/global_cache_tracker.rs +++ b/src/cargo/core/global_cache_tracker.rs @@ -114,7 +114,6 @@ //! //! There are checks for read-only filesystems, which is generally ignored. -use crate::core::Verbosity; use crate::core::gc::GcOpts; use crate::ops::CleanContext; use crate::util::cache_lock::CacheLockMode; @@ -124,6 +123,7 @@ use crate::util::{Filesystem, Progress, ProgressStyle}; use crate::{CargoResult, GlobalContext}; use anyhow::{Context as _, bail}; use cargo_util::paths; +use cargo_util_terminal::Verbosity; use rusqlite::{Connection, ErrorCode, params}; use std::collections::{HashMap, hash_map}; use std::path::{Path, PathBuf}; diff --git a/src/cargo/core/mod.rs b/src/cargo/core/mod.rs index f671c03dcb4..f7ee6a7b758 100644 --- a/src/cargo/core/mod.rs +++ b/src/cargo/core/mod.rs @@ -7,7 +7,6 @@ pub use self::package_id::PackageId; pub use self::package_id_spec::PackageIdSpecQuery; pub use self::registry::Registry; pub use self::resolver::{Resolve, ResolveVersion}; -pub use self::shell::{Shell, Verbosity}; pub use self::source_id::SourceId; pub use self::summary::{FeatureMap, FeatureValue, Summary}; pub use self::workspace::{ @@ -28,7 +27,6 @@ mod package_id_spec; pub mod profiles; pub mod registry; pub mod resolver; -pub mod shell; mod source_id; pub mod summary; mod workspace; diff --git a/src/cargo/core/profiles.rs b/src/cargo/core/profiles.rs index c98188d33d4..5319656836d 100644 --- a/src/cargo/core/profiles.rs +++ b/src/cargo/core/profiles.rs @@ -25,9 +25,7 @@ use crate::core::Feature; use crate::core::compiler::{CompileKind, CompileTarget, Unit}; use crate::core::dependency::Artifact; use crate::core::resolver::features::FeaturesFor; -use crate::core::{ - PackageId, PackageIdSpec, PackageIdSpecQuery, Resolve, Shell, Target, Workspace, -}; +use crate::core::{PackageId, PackageIdSpec, PackageIdSpecQuery, Resolve, Target, Workspace}; use crate::util::interning::InternedString; use crate::util::toml::validate_profile; use crate::util::{CargoResult, GlobalContext, closest_msg, context}; @@ -37,6 +35,7 @@ use cargo_util_schemas::manifest::TomlTrimPathsValue; use cargo_util_schemas::manifest::{ ProfilePackageSpec, StringOrBool, TomlDebugInfo, TomlProfile, TomlProfiles, }; +use cargo_util_terminal::Shell; use std::collections::{BTreeMap, HashMap, HashSet}; use std::hash::Hash; use std::{cmp, fmt, hash}; diff --git a/src/cargo/lib.rs b/src/cargo/lib.rs index 194613e2191..bbaf62355ed 100644 --- a/src/cargo/lib.rs +++ b/src/cargo/lib.rs @@ -139,10 +139,10 @@ //! [The Cargo Book]: https://doc.rust-lang.org/cargo/ //! [Cargo Contributor Guide]: https://doc.crates.io/contrib/ -use crate::core::Shell; -use crate::core::shell::Verbosity; -use crate::core::shell::Verbosity::Verbose; use anyhow::Error; +use cargo_util_terminal::Shell; +use cargo_util_terminal::Verbosity; +use cargo_util_terminal::Verbosity::Verbose; use tracing::debug; pub use crate::util::errors::{AlreadyPrintedError, InternalError, VerboseError}; diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index aa1abdffd65..929d704c677 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -13,6 +13,7 @@ use cargo_util::paths; use cargo_util_schemas::core::PartialVersion; use cargo_util_schemas::manifest::PathBaseName; use cargo_util_schemas::manifest::RustVersion; +use cargo_util_terminal::Shell; use indexmap::IndexSet; use itertools::Itertools; use toml_edit::Item as TomlItem; @@ -25,7 +26,6 @@ use crate::core::Features; use crate::core::Package; use crate::core::PackageId; use crate::core::Registry; -use crate::core::Shell; use crate::core::Summary; use crate::core::Workspace; use crate::core::dependency::DepKind; @@ -1224,7 +1224,7 @@ fn populate_available_features( } fn print_action_msg(shell: &mut Shell, dep: &DependencyUI, section: &[String]) -> CargoResult<()> { - if matches!(shell.verbosity(), crate::core::shell::Verbosity::Quiet) { + if matches!(shell.verbosity(), cargo_util_terminal::Verbosity::Quiet) { return Ok(()); } @@ -1266,7 +1266,7 @@ fn print_action_msg(shell: &mut Shell, dep: &DependencyUI, section: &[String]) - } fn print_dep_table_msg(shell: &mut Shell, dep: &DependencyUI) -> CargoResult<()> { - if matches!(shell.verbosity(), crate::core::shell::Verbosity::Quiet) { + if matches!(shell.verbosity(), cargo_util_terminal::Verbosity::Quiet) { return Ok(()); } diff --git a/src/cargo/ops/cargo_doc.rs b/src/cargo/ops/cargo_doc.rs index b8975a3a9a4..cf849d1b3d5 100644 --- a/src/cargo/ops/cargo_doc.rs +++ b/src/cargo/ops/cargo_doc.rs @@ -1,12 +1,12 @@ use crate::core::Workspace; use crate::core::compiler::{Compilation, CompileKind}; -use crate::core::shell::Verbosity; use crate::ops; use crate::util; use crate::util::CargoResult; use anyhow::{Error, bail}; use cargo_util::ProcessBuilder; +use cargo_util_terminal::Verbosity; use std::ffi::OsString; use std::path::PathBuf; diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index 6d45fedada7..d2442a5b64b 100644 --- a/src/cargo/ops/cargo_new.rs +++ b/src/cargo/ops/cargo_new.rs @@ -1,4 +1,4 @@ -use crate::core::{Edition, Shell, Workspace}; +use crate::core::{Edition, Workspace}; use crate::util::errors::CargoResult; use crate::util::important_paths::find_root_manifest_for_wd; use crate::util::{FossilRepo, GitRepo, HgRepo, PijulRepo, existing_vcs_repo}; @@ -6,6 +6,7 @@ use crate::util::{GlobalContext, restricted_names}; use anyhow::{Context as _, anyhow}; use cargo_util::paths::{self, write_atomic}; use cargo_util_schemas::manifest::PackageName; +use cargo_util_terminal::Shell; use home::home_dir; use serde::Deserialize; use serde::de; diff --git a/src/cargo/ops/cargo_package/mod.rs b/src/cargo/ops/cargo_package/mod.rs index 63c0b139520..67e9cbc7a14 100644 --- a/src/cargo/ops/cargo_package/mod.rs +++ b/src/cargo/ops/cargo_package/mod.rs @@ -8,8 +8,6 @@ use std::path::{Path, PathBuf}; use std::task::Poll; use crate::core::PackageIdSpecQuery; -use crate::core::Shell; -use crate::core::Verbosity; use crate::core::Workspace; use crate::core::dependency::DepKind; use crate::core::manifest::Target; @@ -37,6 +35,7 @@ use anyhow::{Context as _, bail}; use cargo_util::paths; use cargo_util_schemas::index::{IndexPackage, RegistryDependency}; use cargo_util_schemas::messages; +use cargo_util_terminal::{Shell, Verbosity}; use flate2::{Compression, GzBuilder}; use tar::{Builder, EntryType, Header, HeaderMode}; use tracing::debug; diff --git a/src/cargo/ops/cargo_report/rebuilds.rs b/src/cargo/ops/cargo_report/rebuilds.rs index 8d0495d1d2c..fb30dcb85dc 100644 --- a/src/cargo/ops/cargo_report/rebuilds.rs +++ b/src/cargo/ops/cargo_report/rebuilds.rs @@ -241,7 +241,7 @@ fn display_report( run_id: &RunId, ws_root: &Path, ) -> CargoResult<()> { - let verbose = gctx.shell().verbosity() == crate::core::shell::Verbosity::Verbose; + let verbose = gctx.shell().verbosity() == cargo_util_terminal::Verbosity::Verbose; let extra_verbose = gctx.extra_verbose(); let Context { diff --git a/src/cargo/ops/cargo_test.rs b/src/cargo/ops/cargo_test.rs index 532ca50a5ad..42cb5b0aaa5 100644 --- a/src/cargo/ops/cargo_test.rs +++ b/src/cargo/ops/cargo_test.rs @@ -1,13 +1,12 @@ use crate::core::compiler::{Compilation, Doctest, Unit, UnitHash, UnitOutput}; use crate::core::profiles::PanicStrategy; -use crate::core::shell::ColorChoice; -use crate::core::shell::Verbosity; use crate::core::{TargetKind, Workspace}; use crate::ops; use crate::util::errors::CargoResult; use crate::util::{CliError, CliResult, GlobalContext, add_path_args}; use anyhow::format_err; use cargo_util::{ProcessBuilder, ProcessError}; +use cargo_util_terminal::{ColorChoice, Verbosity}; use std::collections::HashMap; use std::ffi::OsString; use std::fmt::Write; diff --git a/src/cargo/ops/cargo_update.rs b/src/cargo/ops/cargo_update.rs index 080401cbe07..704a7ea78be 100644 --- a/src/cargo/ops/cargo_update.rs +++ b/src/cargo/ops/cargo_update.rs @@ -2,7 +2,6 @@ use crate::core::Registry as _; use crate::core::dependency::Dependency; use crate::core::registry::PackageRegistry; use crate::core::resolver::features::{CliFeatures, HasDevUnits}; -use crate::core::shell::Verbosity; use crate::core::{PackageId, PackageIdSpec, PackageIdSpecQuery}; use crate::core::{Resolve, SourceId, Workspace}; use crate::ops; @@ -17,6 +16,7 @@ use crate::util::{CargoResult, VersionExt}; use crate::util::{OptVersionReq, style}; use anyhow::Context as _; use cargo_util_schemas::core::PartialVersion; +use cargo_util_terminal::Verbosity; use indexmap::{IndexMap, IndexSet}; use itertools::Itertools; use semver::{Op, Version, VersionReq}; diff --git a/src/cargo/ops/registry/info/view.rs b/src/cargo/ops/registry/info/view.rs index 7be0a50a771..e4237107d58 100644 --- a/src/cargo/ops/registry/info/view.rs +++ b/src/cargo/ops/registry/info/view.rs @@ -1,16 +1,14 @@ use std::collections::HashMap; use std::io::Write; -use crate::core::Shell; use crate::util::style::{CONTEXT, ERROR, HEADER, LITERAL, NOP, WARN}; use crate::{ CargoResult, GlobalContext, - core::{ - Dependency, FeatureMap, Package, PackageId, SourceId, dependency::DepKind, shell::Verbosity, - }, + core::{Dependency, FeatureMap, Package, PackageId, SourceId, dependency::DepKind}, sources::IndexSummary, util::interning::InternedString, }; +use cargo_util_terminal::{Shell, Verbosity}; // Pretty print the package information. pub(super) fn pretty_view( diff --git a/src/cargo/ops/vendor.rs b/src/cargo/ops/vendor.rs index 68af05ba49d..76ff4178a96 100644 --- a/src/cargo/ops/vendor.rs +++ b/src/cargo/ops/vendor.rs @@ -1,5 +1,4 @@ use crate::core::SourceId; -use crate::core::shell::Verbosity; use crate::core::{GitReference, Package, Workspace}; use crate::ops; use crate::sources::CRATES_IO_REGISTRY; @@ -13,6 +12,7 @@ use anyhow::{Context as _, bail}; use cargo_util::{Sha256, paths}; use cargo_util_schemas::core::SourceKind; use cargo_util_schemas::manifest::TomlPackageBuild; +use cargo_util_terminal::Verbosity; use serde::Serialize; use walkdir::WalkDir; diff --git a/src/cargo/sources/git/utils.rs b/src/cargo/sources/git/utils.rs index 99cf75cdf33..366736ee5ef 100644 --- a/src/cargo/sources/git/utils.rs +++ b/src/cargo/sources/git/utils.rs @@ -1,7 +1,7 @@ //! Utilities for handling git repositories, mainly around //! authentication/cloning. -use crate::core::{GitReference, SourceId, Verbosity}; +use crate::core::{GitReference, SourceId}; use crate::sources::git::fetch::RemoteKind; use crate::sources::git::oxide; use crate::sources::git::oxide::cargo_config_to_gitoxide_overrides; @@ -13,6 +13,7 @@ use crate::util::{GlobalContext, IntoUrl, MetricsCounter, Progress, network}; use anyhow::{Context as _, anyhow}; use cargo_util::{ProcessBuilder, paths}; +use cargo_util_terminal::Verbosity; use curl::easy::List; use git2::{ErrorClass, ObjectType, Oid}; use tracing::{debug, info}; diff --git a/src/cargo/util/command_prelude.rs b/src/cargo/util/command_prelude.rs index c32fb25fabb..2e22d14993e 100644 --- a/src/cargo/util/command_prelude.rs +++ b/src/cargo/util/command_prelude.rs @@ -2,7 +2,7 @@ use crate::CargoResult; use crate::core::Dependency; use crate::core::compiler::{BuildConfig, CompileKind, MessageFormat, RustcTargetData}; use crate::core::resolver::{CliFeatures, ForceAllTargets, HasDevUnits}; -use crate::core::{Edition, Package, TargetKind, Workspace, profiles::Profiles, shell}; +use crate::core::{Edition, Package, TargetKind, Workspace, profiles::Profiles}; use crate::ops::registry::RegistryOrIndex; use crate::ops::{self, CompileFilter, CompileOptions, NewOptions, Packages, VersionControl}; use crate::util::important_paths::find_root_manifest_for_wd; @@ -19,6 +19,7 @@ use cargo_util::paths; use cargo_util_schemas::manifest::ProfileName; use cargo_util_schemas::manifest::RegistryName; use cargo_util_schemas::manifest::StringOrVec; +use cargo_util_terminal as shell; use clap::builder::UnknownArgumentValueParser; use clap_complete::ArgValueCandidates; use home::cargo_home_with_cwd; diff --git a/src/cargo/util/context/mod.rs b/src/cargo/util/context/mod.rs index e3d30390eb5..fc6e6c33546 100644 --- a/src/cargo/util/context/mod.rs +++ b/src/cargo/util/context/mod.rs @@ -78,8 +78,7 @@ use std::time::Instant; use self::ConfigValue as CV; use crate::core::compiler::rustdoc::RustdocExternMap; use crate::core::global_cache_tracker::{DeferredGlobalLastUse, GlobalCacheTracker}; -use crate::core::shell::Verbosity; -use crate::core::{CliUnstable, Shell, SourceId, Workspace, WorkspaceRootConfig, features}; +use crate::core::{CliUnstable, SourceId, Workspace, WorkspaceRootConfig, features}; use crate::ops::RegistryCredentialConfig; use crate::sources::CRATES_IO_INDEX; use crate::sources::CRATES_IO_REGISTRY; @@ -97,6 +96,7 @@ use anyhow::{Context as _, anyhow, bail, format_err}; use cargo_credential::Secret; use cargo_util::paths; use cargo_util_schemas::manifest::RegistryName; +use cargo_util_terminal::{Shell, Verbosity}; use curl::easy::Easy; use itertools::Itertools; use serde::Deserialize; diff --git a/src/cargo/util/mod.rs b/src/cargo/util/mod.rs index 926a36c9923..d6d47eed04a 100644 --- a/src/cargo/util/mod.rs +++ b/src/cargo/util/mod.rs @@ -66,12 +66,13 @@ pub mod rustc; mod semver_eval_ext; mod semver_ext; pub mod sqlite; -pub mod style; pub mod toml; pub mod toml_mut; mod vcs; mod workspace; +pub use cargo_util_terminal::style; + pub fn is_rustup() -> bool { #[expect(clippy::disallowed_methods, reason = "consistency with rustup")] std::env::var_os("RUSTUP_HOME").is_some() diff --git a/src/cargo/util/network/retry.rs b/src/cargo/util/network/retry.rs index 31e6bca4b97..196592b8c4b 100644 --- a/src/cargo/util/network/retry.rs +++ b/src/cargo/util/network/retry.rs @@ -264,7 +264,7 @@ where #[test] fn with_retry_repeats_the_call_then_works() { - use crate::core::Shell; + use cargo_util_terminal::Shell; //Error HTTP codes (5xx) are considered maybe_spurious and will prompt retry let error1 = HttpNotSuccessful { @@ -292,7 +292,7 @@ fn with_retry_repeats_the_call_then_works() { #[test] fn with_retry_finds_nested_spurious_errors() { - use crate::core::Shell; + use cargo_util_terminal::Shell; //Error HTTP codes (5xx) are considered maybe_spurious and will prompt retry //String error messages are not considered spurious @@ -321,7 +321,7 @@ fn with_retry_finds_nested_spurious_errors() { #[test] fn default_retry_schedule() { - use crate::core::Shell; + use cargo_util_terminal::Shell; let spurious = || -> CargoResult<()> { Err(anyhow::Error::from(HttpNotSuccessful { @@ -367,7 +367,7 @@ fn curle_http2_stream_is_spurious() { #[test] fn retry_after_parsing() { - use crate::core::Shell; + use cargo_util_terminal::Shell; fn spurious(code: u32, header: &str) -> HttpNotSuccessful { HttpNotSuccessful { code, diff --git a/src/cargo/util/progress.rs b/src/cargo/util/progress.rs index 4a796a95f57..ff861d13f06 100644 --- a/src/cargo/util/progress.rs +++ b/src/cargo/util/progress.rs @@ -3,11 +3,11 @@ use std::cmp; use std::time::{Duration, Instant}; -use crate::core::shell::Verbosity; use crate::util::context::ProgressWhen; use crate::util::{CargoResult, GlobalContext}; use anstyle_progress::TermProgress; use cargo_util::is_ci; +use cargo_util_terminal::Verbosity; use unicode_width::UnicodeWidthChar; /// CLI progress bar. diff --git a/tests/testsuite/build.rs b/tests/testsuite/build.rs index d45791b5cef..27c1936e1d4 100644 --- a/tests/testsuite/build.rs +++ b/tests/testsuite/build.rs @@ -10,7 +10,6 @@ use crate::utils::cargo_exe; use crate::utils::cargo_process; use crate::utils::tools; use cargo::GlobalContext; -use cargo::core::Shell; use cargo::core::Workspace; use cargo::core::compiler::UserIntent; use cargo::ops::CompileOptions; @@ -23,6 +22,7 @@ use cargo_test_support::{ main_file, paths, process, project, rustc_host, sleep_ms, symlink_supported, t, }; use cargo_util::paths::dylib_path_envvar; +use cargo_util_terminal::Shell; #[cargo_test] fn cargo_compile_simple() { diff --git a/tests/testsuite/config.rs b/tests/testsuite/config.rs index 648958f3326..0f0b08d5c3e 100644 --- a/tests/testsuite/config.rs +++ b/tests/testsuite/config.rs @@ -9,8 +9,8 @@ use std::path::{Path, PathBuf}; use crate::prelude::*; use cargo::CargoResult; +use cargo::core::PackageIdSpec; use cargo::core::features::{GitFeatures, GitoxideFeatures}; -use cargo::core::{PackageIdSpec, Shell}; use cargo::util::auth::RegistryConfig; use cargo::util::context::Value; use cargo::util::context::{ @@ -22,6 +22,7 @@ use cargo_test_support::{paths, project, project_in_home, symlink_supported, t}; use cargo_util_schemas::manifest::TomlTrimPaths; use cargo_util_schemas::manifest::TomlTrimPathsValue; use cargo_util_schemas::manifest::{self as cargo_toml, TomlDebugInfo, VecStringOrBool as VSOB}; +use cargo_util_terminal::Shell; use serde::Deserialize; /// Helper for constructing a `GlobalContext` object. diff --git a/tests/testsuite/member_discovery.rs b/tests/testsuite/member_discovery.rs index 5a123140dd1..abf6c8f91f3 100644 --- a/tests/testsuite/member_discovery.rs +++ b/tests/testsuite/member_discovery.rs @@ -1,11 +1,12 @@ //! Tests for workspace member discovery. use crate::prelude::*; -use cargo::core::{Shell, Workspace}; +use cargo::core::Workspace; use cargo::util::context::GlobalContext; use cargo_test_support::paths; use cargo_test_support::project; use cargo_test_support::registry; +use cargo_util_terminal::Shell; /// Tests exclusion of non-directory files from workspace member discovery using glob `*`. #[cargo_test] diff --git a/tests/testsuite/member_errors.rs b/tests/testsuite/member_errors.rs index e0ba6906056..2c8b30574d4 100644 --- a/tests/testsuite/member_errors.rs +++ b/tests/testsuite/member_errors.rs @@ -1,7 +1,6 @@ //! Tests for workspace member errors. use crate::prelude::*; -use cargo::core::Shell; use cargo::core::Workspace; use cargo::core::compiler::UserIntent; use cargo::core::resolver::ResolveError; @@ -11,6 +10,7 @@ use cargo_test_support::paths; use cargo_test_support::project; use cargo_test_support::registry; use cargo_test_support::str; +use cargo_util_terminal::Shell; /// Tests inclusion of a `ManifestError` pointing to a member manifest /// when that manifest fails to deserialize. diff --git a/triagebot.toml b/triagebot.toml index efb0ef7a223..8d406ac3178 100644 --- a/triagebot.toml +++ b/triagebot.toml @@ -115,7 +115,7 @@ trigger_files = ["src/cargo/util/context/mod.rs"] [autolabel."A-console-output"] trigger_files = [ - "src/cargo/core/shell.rs", + "crates/cargo-util-terminal/", "src/cargo/util/progress.rs", ]