diff --git a/Cargo.lock b/Cargo.lock index cb9c86e4d8da..670f51b5890e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5396,7 +5396,6 @@ dependencies = [ "uv-normalize", "uv-pep508", "uv-pypi-types", - "uv-warnings", ] [[package]] diff --git a/crates/uv-requirements-txt/Cargo.toml b/crates/uv-requirements-txt/Cargo.toml index 8ab3cb6b3adc..197ba008ca24 100644 --- a/crates/uv-requirements-txt/Cargo.toml +++ b/crates/uv-requirements-txt/Cargo.toml @@ -23,7 +23,6 @@ uv-client = { workspace = true } uv-fs = { workspace = true } uv-normalize = { workspace = true } uv-configuration = { workspace = true } -uv-warnings = { workspace = true } fs-err = { workspace = true } regex = { workspace = true } diff --git a/crates/uv-requirements-txt/src/lib.rs b/crates/uv-requirements-txt/src/lib.rs index 41ecc18553e1..e08c09cf28cd 100644 --- a/crates/uv-requirements-txt/src/lib.rs +++ b/crates/uv-requirements-txt/src/lib.rs @@ -52,7 +52,6 @@ use uv_distribution_types::{UnresolvedRequirement, UnresolvedRequirementSpecific use uv_fs::Simplified; use uv_pep508::{expand_env_vars, Pep508Error, RequirementOrigin, VerbatimUrl}; use uv_pypi_types::{Requirement, VerbatimParsedUrl}; -use uv_warnings::warn_user; use crate::requirement::EditableError; pub use crate::requirement::RequirementsTxtRequirement; @@ -219,16 +218,6 @@ impl RequirementsTxt { file: requirements_txt.to_path_buf(), error: err, })?; - if data == Self::default() { - if requirements_txt == Path::new("-") { - warn_user!("No dependencies found in stdin"); - } else { - warn_user!( - "Requirements file {} does not contain any dependencies", - requirements_txt.user_display() - ); - } - } Ok(data) } diff --git a/crates/uv-requirements/src/specification.rs b/crates/uv-requirements/src/specification.rs index 8b5f0a3af360..659c742be33b 100644 --- a/crates/uv-requirements/src/specification.rs +++ b/crates/uv-requirements/src/specification.rs @@ -45,6 +45,7 @@ use uv_pep508::{MarkerTree, UnnamedRequirement, UnnamedRequirementUrl}; use uv_pypi_types::Requirement; use uv_pypi_types::VerbatimParsedUrl; use uv_requirements_txt::{RequirementsTxt, RequirementsTxtRequirement}; +use uv_warnings::warn_user; use uv_workspace::pyproject::PyProjectToml; use crate::RequirementsSource; @@ -113,6 +114,18 @@ impl RequirementsSpecification { } let requirements_txt = RequirementsTxt::parse(path, &*CWD, client_builder).await?; + + if requirements_txt == RequirementsTxt::default() { + if path == Path::new("-") { + warn_user!("No dependencies found in stdin"); + } else { + warn_user!( + "Requirements file `{}` does not contain any dependencies", + path.user_display() + ); + } + } + Self { requirements: requirements_txt .requirements diff --git a/crates/uv/tests/it/pip_compile.rs b/crates/uv/tests/it/pip_compile.rs index f7ac95a9861a..618eb380f3e5 100644 --- a/crates/uv/tests/it/pip_compile.rs +++ b/crates/uv/tests/it/pip_compile.rs @@ -132,7 +132,7 @@ fn missing_venv() -> Result<()> { # uv pip compile --cache-dir [CACHE_DIR] requirements.in ----- stderr ----- - warning: Requirements file requirements.in does not contain any dependencies + warning: Requirements file `requirements.in` does not contain any dependencies Resolved in [TIME] "### ); @@ -142,6 +142,35 @@ fn missing_venv() -> Result<()> { Ok(()) } +#[test] +fn empty_output() -> Result<()> { + let context = TestContext::new("3.12"); + context + .temp_dir + .child("requirements.in") + .write_str("iniconfig==1.1.1")?; + context.temp_dir.child("requirements.txt").touch()?; + + uv_snapshot!(context.filters(), context.pip_compile() + .arg("requirements.in") + .arg("--output-file") + .arg("requirements.txt"), @r###" + success: true + exit_code: 0 + ----- stdout ----- + # This file was autogenerated by uv via the following command: + # uv pip compile --cache-dir [CACHE_DIR] requirements.in --output-file requirements.txt + iniconfig==1.1.1 + # via -r requirements.in + + ----- stderr ----- + Resolved 1 package in [TIME] + "### + ); + + Ok(()) +} + /// Resolve a specific version of `anyio` from a `pyproject.toml` file. #[test] fn compile_pyproject_toml() -> Result<()> { diff --git a/crates/uv/tests/it/pip_install.rs b/crates/uv/tests/it/pip_install.rs index d1f8b8d1065a..8bb7e7403851 100644 --- a/crates/uv/tests/it/pip_install.rs +++ b/crates/uv/tests/it/pip_install.rs @@ -50,7 +50,7 @@ fn empty_requirements_txt() -> Result<()> { ----- stdout ----- ----- stderr ----- - warning: Requirements file requirements.txt does not contain any dependencies + warning: Requirements file `requirements.txt` does not contain any dependencies Audited in [TIME] "### ); diff --git a/crates/uv/tests/it/pip_sync.rs b/crates/uv/tests/it/pip_sync.rs index f821d63a1dc9..de1004c55ac4 100644 --- a/crates/uv/tests/it/pip_sync.rs +++ b/crates/uv/tests/it/pip_sync.rs @@ -360,7 +360,7 @@ fn pip_sync_empty() -> Result<()> { ----- stdout ----- ----- stderr ----- - warning: Requirements file requirements.txt does not contain any dependencies + warning: Requirements file `requirements.txt` does not contain any dependencies No requirements found (hint: use `--allow-empty-requirements` to clear the environment) "### ); @@ -373,7 +373,7 @@ fn pip_sync_empty() -> Result<()> { ----- stdout ----- ----- stderr ----- - warning: Requirements file requirements.txt does not contain any dependencies + warning: Requirements file `requirements.txt` does not contain any dependencies Resolved in [TIME] Audited in [TIME] "### @@ -397,7 +397,7 @@ fn pip_sync_empty() -> Result<()> { ----- stdout ----- ----- stderr ----- - warning: Requirements file requirements.txt does not contain any dependencies + warning: Requirements file `requirements.txt` does not contain any dependencies Resolved in [TIME] Uninstalled 1 package in [TIME] - iniconfig==2.0.0 diff --git a/crates/uv/tests/it/run.rs b/crates/uv/tests/it/run.rs index 03168b79650d..4daef48aceec 100644 --- a/crates/uv/tests/it/run.rs +++ b/crates/uv/tests/it/run.rs @@ -1751,7 +1751,7 @@ fn run_empty_requirements_txt() -> Result<()> { + foo==1.0.0 (from file://[TEMP_DIR]/) + idna==3.6 + sniffio==1.3.1 - warning: Requirements file requirements.txt does not contain any dependencies + warning: Requirements file `requirements.txt` does not contain any dependencies "###); // Then reused in subsequent invocations @@ -1763,7 +1763,7 @@ fn run_empty_requirements_txt() -> Result<()> { ----- stderr ----- Resolved 6 packages in [TIME] Audited 4 packages in [TIME] - warning: Requirements file requirements.txt does not contain any dependencies + warning: Requirements file `requirements.txt` does not contain any dependencies "###); Ok(())