mirror of https://github.com/astral-sh/uv
Merge bb70d00109 into b58f543e5e
This commit is contained in:
commit
cc00a1d1b1
|
|
@ -18,7 +18,7 @@ use crate::preferences::{Entry, PreferenceSource, Preferences};
|
||||||
use crate::prerelease::{AllowPrerelease, PrereleaseStrategy};
|
use crate::prerelease::{AllowPrerelease, PrereleaseStrategy};
|
||||||
use crate::resolution_mode::ResolutionStrategy;
|
use crate::resolution_mode::ResolutionStrategy;
|
||||||
use crate::version_map::{VersionMap, VersionMapDistHandle};
|
use crate::version_map::{VersionMap, VersionMapDistHandle};
|
||||||
use crate::{Exclusions, Manifest, Options, ResolverEnvironment};
|
use crate::{ExcludeNewerTimestamp, Exclusions, Manifest, Options, ResolverEnvironment};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(clippy::struct_field_names)]
|
#[allow(clippy::struct_field_names)]
|
||||||
|
|
@ -86,6 +86,7 @@ impl CandidateSelector {
|
||||||
index: Option<&'a IndexUrl>,
|
index: Option<&'a IndexUrl>,
|
||||||
env: &ResolverEnvironment,
|
env: &ResolverEnvironment,
|
||||||
tags: Option<&'a Tags>,
|
tags: Option<&'a Tags>,
|
||||||
|
exclude_newer: Option<ExcludeNewerTimestamp>,
|
||||||
) -> Option<Candidate<'a>> {
|
) -> Option<Candidate<'a>> {
|
||||||
let reinstall = exclusions.reinstall(package_name);
|
let reinstall = exclusions.reinstall(package_name);
|
||||||
let upgrade = exclusions.upgrade(package_name);
|
let upgrade = exclusions.upgrade(package_name);
|
||||||
|
|
@ -134,7 +135,7 @@ impl CandidateSelector {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, find the best candidate from the version maps.
|
// Otherwise, find the best candidate from the version maps.
|
||||||
let compatible = self.select_no_preference(package_name, range, version_maps, env);
|
let compatible = self.select_no_preference(package_name, range, version_maps, env, exclude_newer);
|
||||||
|
|
||||||
// Cross-reference against the already-installed distribution.
|
// Cross-reference against the already-installed distribution.
|
||||||
//
|
//
|
||||||
|
|
@ -418,6 +419,7 @@ impl CandidateSelector {
|
||||||
range: &Range<Version>,
|
range: &Range<Version>,
|
||||||
version_maps: &'a [VersionMap],
|
version_maps: &'a [VersionMap],
|
||||||
env: &ResolverEnvironment,
|
env: &ResolverEnvironment,
|
||||||
|
exclude_newer: Option<ExcludeNewerTimestamp>,
|
||||||
) -> Option<Candidate<'a>> {
|
) -> Option<Candidate<'a>> {
|
||||||
trace!(
|
trace!(
|
||||||
"Selecting candidate for {package_name} with range {range} with {} remote versions",
|
"Selecting candidate for {package_name} with range {range} with {} remote versions",
|
||||||
|
|
@ -457,6 +459,7 @@ impl CandidateSelector {
|
||||||
package_name,
|
package_name,
|
||||||
range,
|
range,
|
||||||
allow_prerelease,
|
allow_prerelease,
|
||||||
|
exclude_newer,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
Self::select_candidate(
|
Self::select_candidate(
|
||||||
|
|
@ -479,6 +482,7 @@ impl CandidateSelector {
|
||||||
package_name,
|
package_name,
|
||||||
range,
|
range,
|
||||||
allow_prerelease,
|
allow_prerelease,
|
||||||
|
exclude_newer,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -489,6 +493,7 @@ impl CandidateSelector {
|
||||||
package_name,
|
package_name,
|
||||||
range,
|
range,
|
||||||
allow_prerelease,
|
allow_prerelease,
|
||||||
|
exclude_newer,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -498,6 +503,7 @@ impl CandidateSelector {
|
||||||
package_name,
|
package_name,
|
||||||
range,
|
range,
|
||||||
allow_prerelease,
|
allow_prerelease,
|
||||||
|
exclude_newer,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -526,11 +532,13 @@ impl CandidateSelector {
|
||||||
/// The returned [`Candidate`] _may not_ be compatible with the current platform; in such
|
/// The returned [`Candidate`] _may not_ be compatible with the current platform; in such
|
||||||
/// cases, the resolver is responsible for tracking the incompatibility and re-running the
|
/// cases, the resolver is responsible for tracking the incompatibility and re-running the
|
||||||
/// selection process with additional constraints.
|
/// selection process with additional constraints.
|
||||||
|
#[allow(unused_variables)] // exclude_newer is unused here, logging handled at higher level
|
||||||
fn select_candidate<'a>(
|
fn select_candidate<'a>(
|
||||||
versions: impl Iterator<Item = (&'a Version, VersionMapDistHandle<'a>)>,
|
versions: impl Iterator<Item = (&'a Version, VersionMapDistHandle<'a>)>,
|
||||||
package_name: &'a PackageName,
|
package_name: &'a PackageName,
|
||||||
range: &Range<Version>,
|
range: &Range<Version>,
|
||||||
allow_prerelease: bool,
|
allow_prerelease: bool,
|
||||||
|
exclude_newer: Option<ExcludeNewerTimestamp>,
|
||||||
) -> Option<Candidate<'a>> {
|
) -> Option<Candidate<'a>> {
|
||||||
let mut steps = 0usize;
|
let mut steps = 0usize;
|
||||||
let mut incompatible: Option<Candidate> = None;
|
let mut incompatible: Option<Candidate> = None;
|
||||||
|
|
|
||||||
|
|
@ -732,7 +732,7 @@ impl PubGrubReportFormatter<'_> {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
let candidate = selector.select_no_preference(name, set, version_maps, env)?;
|
let candidate = selector.select_no_preference(name, set, version_maps, env, None)?;
|
||||||
|
|
||||||
let prioritized = candidate.prioritized()?;
|
let prioritized = candidate.prioritized()?;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -231,7 +231,7 @@ impl BatchPrefetcherRunner {
|
||||||
previous,
|
previous,
|
||||||
} => {
|
} => {
|
||||||
if let Some(candidate) =
|
if let Some(candidate) =
|
||||||
selector.select_no_preference(name, &compatible, version_map, env)
|
selector.select_no_preference(name, &compatible, version_map, env, None)
|
||||||
{
|
{
|
||||||
let compatible = compatible.intersection(
|
let compatible = compatible.intersection(
|
||||||
&Range::singleton(candidate.version().clone()).complement(),
|
&Range::singleton(candidate.version().clone()).complement(),
|
||||||
|
|
@ -266,7 +266,7 @@ impl BatchPrefetcherRunner {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if let Some(candidate) =
|
if let Some(candidate) =
|
||||||
selector.select_no_preference(name, &range, version_map, env)
|
selector.select_no_preference(name, &range, version_map, env, None)
|
||||||
{
|
{
|
||||||
phase = BatchPrefetchStrategy::InOrder {
|
phase = BatchPrefetchStrategy::InOrder {
|
||||||
previous: candidate.version().clone(),
|
previous: candidate.version().clone(),
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ use std::sync::Arc;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
use std::{iter, slice, thread};
|
use std::{iter, slice, thread};
|
||||||
|
|
||||||
use dashmap::DashMap;
|
use dashmap::{DashMap, DashSet};
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use futures::{FutureExt, StreamExt};
|
use futures::{FutureExt, StreamExt};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
@ -135,6 +135,8 @@ struct ResolverState<InstalledPackages: InstalledPackagesProvider> {
|
||||||
unavailable_packages: DashMap<PackageName, UnavailablePackage>,
|
unavailable_packages: DashMap<PackageName, UnavailablePackage>,
|
||||||
/// Incompatibilities for packages that are unavailable at specific versions.
|
/// Incompatibilities for packages that are unavailable at specific versions.
|
||||||
incomplete_packages: DashMap<PackageName, DashMap<Version, MetadataUnavailable>>,
|
incomplete_packages: DashMap<PackageName, DashMap<Version, MetadataUnavailable>>,
|
||||||
|
/// Packages for which we've already logged `exclude_newer` messages.
|
||||||
|
logged_exclude_newer: DashSet<PackageName>,
|
||||||
/// The options that were used to configure this resolver.
|
/// The options that were used to configure this resolver.
|
||||||
options: Options,
|
options: Options,
|
||||||
/// The reporter to use for this resolver.
|
/// The reporter to use for this resolver.
|
||||||
|
|
@ -254,6 +256,7 @@ impl<Provider: ResolverProvider, InstalledPackages: InstalledPackagesProvider>
|
||||||
installed_packages,
|
installed_packages,
|
||||||
unavailable_packages: DashMap::default(),
|
unavailable_packages: DashMap::default(),
|
||||||
incomplete_packages: DashMap::default(),
|
incomplete_packages: DashMap::default(),
|
||||||
|
logged_exclude_newer: DashSet::default(),
|
||||||
options,
|
options,
|
||||||
reporter: None,
|
reporter: None,
|
||||||
};
|
};
|
||||||
|
|
@ -1312,6 +1315,9 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
|
|
||||||
debug!("Searching for a compatible version of {package} ({range})");
|
debug!("Searching for a compatible version of {package} ({range})");
|
||||||
|
|
||||||
|
// Get the exclude_newer timestamp for this package
|
||||||
|
let exclude_newer = self.options.exclude_newer.exclude_newer_package(name);
|
||||||
|
|
||||||
// Find a version.
|
// Find a version.
|
||||||
let Some(candidate) = self.selector.select(
|
let Some(candidate) = self.selector.select(
|
||||||
name,
|
name,
|
||||||
|
|
@ -1323,8 +1329,17 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
index,
|
index,
|
||||||
env,
|
env,
|
||||||
self.tags.as_ref(),
|
self.tags.as_ref(),
|
||||||
|
exclude_newer,
|
||||||
) else {
|
) else {
|
||||||
// Short circuit: we couldn't find _any_ versions for a package.
|
// Short circuit: we couldn't find _any_ versions for a package.
|
||||||
|
// Log exclude_newer message once per package across all forks.
|
||||||
|
if let Some(exclude_newer_ts) = exclude_newer {
|
||||||
|
if self.logged_exclude_newer.insert(name.clone()) {
|
||||||
|
debug!(
|
||||||
|
"Excluding candidates for {name} published after {exclude_newer_ts}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1530,6 +1545,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
candidate.version().clone().without_local(),
|
candidate.version().clone().without_local(),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
let exclude_newer = self.options.exclude_newer.exclude_newer_package(name);
|
||||||
let Some(base_candidate) = self.selector.select(
|
let Some(base_candidate) = self.selector.select(
|
||||||
name,
|
name,
|
||||||
&range,
|
&range,
|
||||||
|
|
@ -1540,6 +1556,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
index,
|
index,
|
||||||
env,
|
env,
|
||||||
self.tags.as_ref(),
|
self.tags.as_ref(),
|
||||||
|
exclude_newer,
|
||||||
) else {
|
) else {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
|
|
@ -2545,6 +2562,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
|
|
||||||
// Try to find a compatible version. If there aren't any compatible versions,
|
// Try to find a compatible version. If there aren't any compatible versions,
|
||||||
// short-circuit.
|
// short-circuit.
|
||||||
|
let exclude_newer = self.options.exclude_newer.exclude_newer_package(&package_name);
|
||||||
let Some(candidate) = self.selector.select(
|
let Some(candidate) = self.selector.select(
|
||||||
&package_name,
|
&package_name,
|
||||||
&range,
|
&range,
|
||||||
|
|
@ -2555,6 +2573,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
None,
|
None,
|
||||||
&env,
|
&env,
|
||||||
self.tags.as_ref(),
|
self.tags.as_ref(),
|
||||||
|
exclude_newer,
|
||||||
) else {
|
) else {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -17995,6 +17995,7 @@ fn lock_explicit_default_index() -> Result<()> {
|
||||||
DEBUG Searching for a compatible version of project @ file://[TEMP_DIR]/ (*)
|
DEBUG Searching for a compatible version of project @ file://[TEMP_DIR]/ (*)
|
||||||
DEBUG Adding direct dependency: anyio*
|
DEBUG Adding direct dependency: anyio*
|
||||||
DEBUG Searching for a compatible version of anyio (*)
|
DEBUG Searching for a compatible version of anyio (*)
|
||||||
|
DEBUG Excluding candidates for anyio published after 2024-03-25T00:00:00Z
|
||||||
DEBUG No compatible version found for: anyio
|
DEBUG No compatible version found for: anyio
|
||||||
DEBUG Recording unit propagation conflict of anyio from incompatibility of (project)
|
DEBUG Recording unit propagation conflict of anyio from incompatibility of (project)
|
||||||
DEBUG Searching for a compatible version of project @ file://[TEMP_DIR]/ (<0.1.0 | >0.1.0)
|
DEBUG Searching for a compatible version of project @ file://[TEMP_DIR]/ (<0.1.0 | >0.1.0)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue