From bd4f8934e39279604e4a41b6fa3c037602dbe146 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Thu, 6 Aug 2026 08:42:39 -0500 Subject: [PATCH] Stream workspace metadata JSON serialization --- .../uv-resolver/src/lock/export/metadata.rs | 4 ++-- crates/uv/src/commands/workspace/metadata.rs | 11 ++++++--- .../uv/tests/workspace/workspace_metadata.rs | 24 +++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/crates/uv-resolver/src/lock/export/metadata.rs b/crates/uv-resolver/src/lock/export/metadata.rs index 78c5d5e072b..739b31ea800 100644 --- a/crates/uv-resolver/src/lock/export/metadata.rs +++ b/crates/uv-resolver/src/lock/export/metadata.rs @@ -1492,7 +1492,7 @@ impl Metadata { self } - pub fn to_json(&self) -> Result { - Ok(serde_json::to_string_pretty(self)?) + pub fn write_json(&self, writer: impl std::io::Write) -> Result<(), MetadataError> { + Ok(serde_json::to_writer_pretty(writer, self)?) } } diff --git a/crates/uv/src/commands/workspace/metadata.rs b/crates/uv/src/commands/workspace/metadata.rs index 293f0bf395f..96b7d4c983c 100644 --- a/crates/uv/src/commands/workspace/metadata.rs +++ b/crates/uv/src/commands/workspace/metadata.rs @@ -1,4 +1,4 @@ -use std::fmt::Write; +use std::io::{BufWriter, Write}; use std::path::Path; use anyhow::{Context, Result}; @@ -22,7 +22,7 @@ use crate::commands::project::{ ScriptInterpreter, UniversalState, WorkspacePython, }; use crate::commands::{ExitStatus, UvError, diagnostics}; -use crate::printer::Printer; +use crate::printer::{Printer, Stdout}; use crate::settings::{FrozenSource, LockCheck, ResolverSettings}; use super::module_owners::collect_module_owners; @@ -272,7 +272,12 @@ fn metadata_for_target(target: InstallTarget<'_>) -> Result { } fn print_metadata(export: &Metadata, printer: Printer) -> Result { - writeln!(printer.stdout(), "{}", export.to_json()?)?; + if printer.stdout() == Stdout::Enabled { + let mut stdout = BufWriter::new(anstream::stdout().lock()); + export.write_json(&mut stdout)?; + writeln!(stdout)?; + stdout.flush()?; + } Ok(ExitStatus::Success) } diff --git a/crates/uv/tests/workspace/workspace_metadata.rs b/crates/uv/tests/workspace/workspace_metadata.rs index 3b810c13b6f..6bdecddac21 100644 --- a/crates/uv/tests/workspace/workspace_metadata.rs +++ b/crates/uv/tests/workspace/workspace_metadata.rs @@ -129,6 +129,30 @@ fn workspace_metadata_simple() { assert!(!workspace.child(".venv").exists()); } +#[test] +fn workspace_metadata_quiet() { + let context = uv_test::test_context!("3.12"); + context.init().arg("foo").assert().success(); + + let workspace = context.temp_dir.child("foo"); + + uv_snapshot!(context.filters(), context.workspace_metadata().current_dir(&workspace).arg("--quiet"), @r" + exit_code: 0 (success) + "); +} + +#[test] +fn workspace_metadata_extra_quiet() { + let context = uv_test::test_context!("3.12"); + context.init().arg("foo").assert().success(); + + let workspace = context.temp_dir.child("foo"); + + uv_snapshot!(context.filters(), context.workspace_metadata().current_dir(&workspace).arg("--quiet").arg("--quiet"), @r" + exit_code: 0 (success) + "); +} + #[test] fn workspace_metadata_ignores_unusable_environment() -> Result<()> { let context = uv_test::test_context!("3.12");