From 12ab7d1ab75a57d13b237825e156e5cbbf33f423 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 25 Sep 2024 08:23:43 -0500 Subject: [PATCH] Respect `--quiet` flag in `uv build` (#7674) I noticed this was not respected, seems like an oversight. --- crates/uv-build/src/error.rs | 4 +- crates/uv-build/src/lib.rs | 4 + crates/uv-configuration/src/build_options.rs | 2 + crates/uv/src/commands/build.rs | 87 ++++++++++++++------ crates/uv/tests/build.rs | 35 ++++++++ 5 files changed, 105 insertions(+), 27 deletions(-) diff --git a/crates/uv-build/src/error.rs b/crates/uv-build/src/error.rs index b13a4246f..3b37a2b5d 100644 --- a/crates/uv-build/src/error.rs +++ b/crates/uv-build/src/error.rs @@ -239,7 +239,7 @@ impl Error { if let Some(missing_library) = missing_library { return match level { - BuildOutput::Stderr => Self::MissingHeader { + BuildOutput::Stderr | BuildOutput::Quiet => Self::MissingHeader { message, exit_code: output.status, missing_header_cause: MissingHeaderCause { @@ -265,7 +265,7 @@ impl Error { } match level { - BuildOutput::Stderr => Self::BuildBackend { + BuildOutput::Stderr | BuildOutput::Quiet => Self::BuildBackend { message, exit_code: output.status, }, diff --git a/crates/uv-build/src/lib.rs b/crates/uv-build/src/lib.rs index 38c1134f0..2abf74fe8 100644 --- a/crates/uv-build/src/lib.rs +++ b/crates/uv-build/src/lib.rs @@ -988,6 +988,8 @@ pub enum Printer { Stderr, /// Send the build backend output to `tracing`. Debug, + /// Hide the build backend output. + Quiet, } impl From for Printer { @@ -995,6 +997,7 @@ impl From for Printer { match output { BuildOutput::Stderr => Self::Stderr, BuildOutput::Debug => Self::Debug, + BuildOutput::Quiet => Self::Quiet, } } } @@ -1008,6 +1011,7 @@ impl Write for Printer { Self::Debug => { debug!("{s}"); } + Self::Quiet => {} } Ok(()) } diff --git a/crates/uv-configuration/src/build_options.rs b/crates/uv-configuration/src/build_options.rs index 850eb2543..9c58b6427 100644 --- a/crates/uv-configuration/src/build_options.rs +++ b/crates/uv-configuration/src/build_options.rs @@ -31,6 +31,8 @@ pub enum BuildOutput { Stderr, /// Send the build backend output to `tracing`. Debug, + /// Do not display the build backend output. + Quiet, } #[derive(Debug, Default, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] diff --git a/crates/uv/src/commands/build.rs b/crates/uv/src/commands/build.rs index 630233068..1f0ff9e5e 100644 --- a/crates/uv/src/commands/build.rs +++ b/crates/uv/src/commands/build.rs @@ -1,15 +1,11 @@ -use crate::commands::project::find_requires_python; -use crate::commands::reporters::PythonDownloadReporter; -use crate::commands::{ExitStatus, SharedState}; -use crate::printer::Printer; -use crate::settings::{ResolverSettings, ResolverSettingsRef}; use std::borrow::Cow; +use std::fmt::Write; +use std::path::{Path, PathBuf}; -use crate::commands::pip::operations; use anyhow::Result; use distribution_filename::SourceDistExtension; use owo_colors::OwoColorize; -use std::path::{Path, PathBuf}; + use uv_auth::store_credentials_from_url; use uv_cache::Cache; use uv_client::{BaseClientBuilder, Connectivity, FlatIndexClient, RegistryClientBuilder}; @@ -26,6 +22,13 @@ use uv_resolver::{FlatIndex, RequiresPython}; use uv_types::{BuildContext, BuildIsolation, HashStrategy}; use uv_workspace::{DiscoveryOptions, Workspace}; +use crate::commands::pip::operations; +use crate::commands::project::find_requires_python; +use crate::commands::reporters::PythonDownloadReporter; +use crate::commands::{ExitStatus, SharedState}; +use crate::printer::Printer; +use crate::settings::{ResolverSettings, ResolverSettingsRef}; + /// Build source distributions and wheels. #[allow(clippy::fn_params_excessive_bools)] pub(crate) async fn build( @@ -72,17 +75,26 @@ pub(crate) async fn build( match assets { BuiltDistributions::Wheel(wheel) => { - anstream::eprintln!("Successfully built {}", wheel.user_display().bold().cyan()); + writeln!( + printer.stderr(), + "Successfully built {}", + wheel.user_display().bold().cyan() + )?; } BuiltDistributions::Sdist(sdist) => { - anstream::eprintln!("Successfully built {}", sdist.user_display().bold().cyan()); + writeln!( + printer.stderr(), + "Successfully built {}", + sdist.user_display().bold().cyan() + )?; } BuiltDistributions::Both(sdist, wheel) => { - anstream::eprintln!( + writeln!( + printer.stderr(), "Successfully built {} and {}", sdist.user_display().bold().cyan(), wheel.user_display().bold().cyan() - ); + )?; } } @@ -356,9 +368,18 @@ async fn build_impl( let version_id = src.path().file_name().and_then(|name| name.to_str()); let dist = None; + let build_output = match printer { + Printer::Default | Printer::NoProgress | Printer::Verbose => BuildOutput::Stderr, + Printer::Quiet => BuildOutput::Quiet, + }; + let assets = match plan { BuildPlan::SdistToWheel => { - anstream::eprintln!("{}", "Building source distribution...".bold()); + writeln!( + printer.stderr(), + "{}", + "Building source distribution...".bold() + )?; // Build the sdist. let builder = build_dispatch @@ -368,7 +389,7 @@ async fn build_impl( version_id.map(ToString::to_string), dist, BuildKind::Sdist, - BuildOutput::Stderr, + build_output, ) .await?; let sdist = builder.build(&output_dir).await?; @@ -389,7 +410,11 @@ async fn build_impl( Err(err) => return Err(err.into()), }; - anstream::eprintln!("{}", "Building wheel from source distribution...".bold()); + writeln!( + printer.stderr(), + "{}", + "Building wheel from source distribution...".bold() + )?; // Build a wheel from the source distribution. let builder = build_dispatch @@ -399,7 +424,7 @@ async fn build_impl( version_id.map(ToString::to_string), dist, BuildKind::Wheel, - BuildOutput::Stderr, + build_output, ) .await?; let wheel = builder.build(&output_dir).await?; @@ -407,7 +432,11 @@ async fn build_impl( BuiltDistributions::Both(output_dir.join(sdist), output_dir.join(wheel)) } BuildPlan::Sdist => { - anstream::eprintln!("{}", "Building source distribution...".bold()); + writeln!( + printer.stderr(), + "{}", + "Building source distribution...".bold() + )?; let builder = build_dispatch .setup_build( @@ -416,7 +445,7 @@ async fn build_impl( version_id.map(ToString::to_string), dist, BuildKind::Sdist, - BuildOutput::Stderr, + build_output, ) .await?; let sdist = builder.build(&output_dir).await?; @@ -424,7 +453,7 @@ async fn build_impl( BuiltDistributions::Sdist(output_dir.join(sdist)) } BuildPlan::Wheel => { - anstream::eprintln!("{}", "Building wheel...".bold()); + writeln!(printer.stderr(), "{}", "Building wheel...".bold())?; let builder = build_dispatch .setup_build( @@ -433,7 +462,7 @@ async fn build_impl( version_id.map(ToString::to_string), dist, BuildKind::Wheel, - BuildOutput::Stderr, + build_output, ) .await?; let wheel = builder.build(&output_dir).await?; @@ -441,7 +470,11 @@ async fn build_impl( BuiltDistributions::Wheel(output_dir.join(wheel)) } BuildPlan::SdistAndWheel => { - anstream::eprintln!("{}", "Building source distribution...".bold()); + writeln!( + printer.stderr(), + "{}", + "Building source distribution...".bold() + )?; let builder = build_dispatch .setup_build( src.path(), @@ -449,12 +482,12 @@ async fn build_impl( version_id.map(ToString::to_string), dist, BuildKind::Sdist, - BuildOutput::Stderr, + build_output, ) .await?; let sdist = builder.build(&output_dir).await?; - anstream::eprintln!("{}", "Building wheel...".bold()); + writeln!(printer.stderr(), "{}", "Building wheel...".bold())?; let builder = build_dispatch .setup_build( src.path(), @@ -462,7 +495,7 @@ async fn build_impl( version_id.map(ToString::to_string), dist, BuildKind::Wheel, - BuildOutput::Stderr, + build_output, ) .await?; let wheel = builder.build(&output_dir).await?; @@ -470,7 +503,11 @@ async fn build_impl( BuiltDistributions::Both(output_dir.join(&sdist), output_dir.join(&wheel)) } BuildPlan::WheelFromSdist => { - anstream::eprintln!("{}", "Building wheel from source distribution...".bold()); + writeln!( + printer.stderr(), + "{}", + "Building wheel from source distribution...".bold() + )?; // Extract the source distribution into a temporary directory. let reader = fs_err::tokio::File::open(src.path()).await?; @@ -495,7 +532,7 @@ async fn build_impl( version_id.map(ToString::to_string), dist, BuildKind::Wheel, - BuildOutput::Stderr, + build_output, ) .await?; let wheel = builder.build(&output_dir).await?; diff --git a/crates/uv/tests/build.rs b/crates/uv/tests/build.rs index 51236675f..31110be6c 100644 --- a/crates/uv/tests/build.rs +++ b/crates/uv/tests/build.rs @@ -1486,3 +1486,38 @@ fn sha() -> Result<()> { Ok(()) } + +#[test] +fn build_quiet() -> Result<()> { + let context = TestContext::new("3.12"); + + let project = context.temp_dir.child("project"); + + let pyproject_toml = project.child("pyproject.toml"); + pyproject_toml.write_str( + r#" + [project] + name = "project" + version = "0.1.0" + requires-python = ">=3.12" + dependencies = ["anyio==3.7.0"] + + [build-system] + requires = ["setuptools>=42"] + build-backend = "setuptools.build_meta" + "#, + )?; + + project.child("src").child("__init__.py").touch()?; + project.child("README").touch()?; + + uv_snapshot!(&context.filters(), context.build().arg("project").arg("-q"), @r###" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + "###); + + Ok(()) +}