Respect HTTP client options when reading remote requirements files (#2434)

Uses the base client introduced in #2431 to restore use of our fully
configured client when reading remote requirements files.

Closes https://github.com/astral-sh/uv/issues/2357

## Test plan

```
npx http-server --username user --password password
cargo run -- pip install -r http://user:password@127.0.0.1:8080/requirements.txt
```

Fails on main succeeds on branch.
This commit is contained in:
Zanie Blue 2024-03-21 13:48:57 -05:00 committed by GitHub
parent 9654da418e
commit c6e181d233
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 191 additions and 102 deletions

View file

@ -9,7 +9,7 @@ use crate::{ExtrasSpecification, RequirementsSource};
use distribution_types::{FlatIndexLocation, IndexUrl};
use pep508_rs::{Requirement, RequirementsTxtRequirement};
use requirements_txt::{EditableRequirement, FindLink, RequirementsTxt};
use uv_client::Connectivity;
use uv_client::BaseClientBuilder;
use uv_fs::Simplified;
use uv_normalize::{ExtraName, PackageName};
use uv_warnings::warn_user;
@ -44,7 +44,7 @@ impl RequirementsSpecification {
pub async fn from_source(
source: &RequirementsSource,
extras: &ExtrasSpecification<'_>,
connectivity: Connectivity,
client_builder: &BaseClientBuilder<'_>,
) -> Result<Self> {
Ok(match source {
RequirementsSource::Package(name) => {
@ -81,7 +81,7 @@ impl RequirementsSpecification {
}
RequirementsSource::RequirementsTxt(path) => {
let requirements_txt =
RequirementsTxt::parse(path, std::env::current_dir()?, connectivity).await?;
RequirementsTxt::parse(path, std::env::current_dir()?, client_builder).await?;
Self {
project: None,
requirements: requirements_txt
@ -185,7 +185,7 @@ impl RequirementsSpecification {
constraints: &[RequirementsSource],
overrides: &[RequirementsSource],
extras: &ExtrasSpecification<'_>,
connectivity: Connectivity,
client_builder: &BaseClientBuilder<'_>,
) -> Result<Self> {
let mut spec = Self::default();
@ -193,7 +193,7 @@ impl RequirementsSpecification {
// A `requirements.txt` can contain a `-c constraints.txt` directive within it, so reading
// a requirements file can also add constraints.
for source in requirements {
let source = Self::from_source(source, extras, connectivity).await?;
let source = Self::from_source(source, extras, client_builder).await?;
spec.requirements.extend(source.requirements);
spec.constraints.extend(source.constraints);
spec.overrides.extend(source.overrides);
@ -220,7 +220,7 @@ impl RequirementsSpecification {
// Read all constraints, treating _everything_ as a constraint.
for source in constraints {
let source = Self::from_source(source, extras, connectivity).await?;
let source = Self::from_source(source, extras, client_builder).await?;
for requirement in source.requirements {
match requirement {
RequirementsTxtRequirement::Pep508(requirement) => {
@ -251,7 +251,7 @@ impl RequirementsSpecification {
// Read all overrides, treating both requirements _and_ constraints as overrides.
for source in overrides {
let source = Self::from_source(source, extras, connectivity).await?;
let source = Self::from_source(source, extras, client_builder).await?;
for requirement in source.requirements {
match requirement {
RequirementsTxtRequirement::Pep508(requirement) => {
@ -286,14 +286,14 @@ impl RequirementsSpecification {
/// Read the requirements from a set of sources.
pub async fn from_simple_sources(
requirements: &[RequirementsSource],
connectivity: Connectivity,
client_builder: &BaseClientBuilder<'_>,
) -> Result<Self> {
Self::from_sources(
requirements,
&[],
&[],
&ExtrasSpecification::None,
connectivity,
client_builder,
)
.await
}

View file

@ -4,7 +4,7 @@ use anyhow::Result;
use rustc_hash::FxHashSet;
use requirements_txt::RequirementsTxt;
use uv_client::Connectivity;
use uv_client::{BaseClientBuilder, Connectivity};
use uv_normalize::PackageName;
use uv_resolver::{Preference, PreferenceError};
@ -58,9 +58,12 @@ pub async fn read_lockfile(
};
// Parse the requirements from the lockfile.
let requirements_txt =
RequirementsTxt::parse(output_file, std::env::current_dir()?, Connectivity::Offline)
.await?;
let requirements_txt = RequirementsTxt::parse(
output_file,
std::env::current_dir()?,
&BaseClientBuilder::new().connectivity(Connectivity::Offline),
)
.await?;
let preferences = requirements_txt
.requirements
.into_iter()