Move preference behavior out of resolve (#3919)

## Summary

Decoupling this behavior to give more control to clients. No change in
behavior.
This commit is contained in:
Charlie Marsh 2024-05-29 21:16:53 -04:00 committed by GitHub
parent 4859a27948
commit a1a5155d34
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 31 additions and 13 deletions

View file

@ -26,7 +26,7 @@ use uv_normalize::PackageName;
use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_requirements::{RequirementsSource, RequirementsSpecification};
use uv_resolver::{ use uv_resolver::{
DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, Lock, OptionsBuilder, PreReleaseMode, DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, Lock, OptionsBuilder, PreReleaseMode,
ResolutionMode, Preference, ResolutionMode,
}; };
use uv_types::{BuildIsolation, HashStrategy, InFlight}; use uv_types::{BuildIsolation, HashStrategy, InFlight};
@ -255,6 +255,12 @@ pub(crate) async fn pip_install(
HashStrategy::None HashStrategy::None
}; };
// When resolving, prefer current site packages.
let preferences = site_packages
.iter()
.map(Preference::from_installed)
.collect::<Vec<_>>();
// Incorporate any index locations from the provided sources. // Incorporate any index locations from the provided sources.
let index_locations = let index_locations =
index_locations.combine(index_url, extra_index_urls, find_links, no_index); index_locations.combine(index_url, extra_index_urls, find_links, no_index);
@ -340,6 +346,7 @@ pub(crate) async fn pip_install(
source_trees, source_trees,
project, project,
extras, extras,
preferences,
site_packages.clone(), site_packages.clone(),
&hasher, &hasher,
&reinstall, &reinstall,

View file

@ -110,6 +110,7 @@ pub(crate) async fn resolve<InstalledPackages: InstalledPackagesProvider>(
source_trees: Vec<PathBuf>, source_trees: Vec<PathBuf>,
project: Option<PackageName>, project: Option<PackageName>,
extras: &ExtrasSpecification, extras: &ExtrasSpecification,
preferences: Vec<Preference>,
installed_packages: InstalledPackages, installed_packages: InstalledPackages,
hasher: &HashStrategy, hasher: &HashStrategy,
reinstall: &Reinstall, reinstall: &Reinstall,
@ -196,11 +197,10 @@ pub(crate) async fn resolve<InstalledPackages: InstalledPackagesProvider>(
// TODO(zanieb): Consider consuming these instead of cloning // TODO(zanieb): Consider consuming these instead of cloning
let exclusions = Exclusions::new(reinstall.clone(), upgrade.clone()); let exclusions = Exclusions::new(reinstall.clone(), upgrade.clone());
// Prefer current site packages; filter out packages that are marked for reinstall or upgrade. // Filter out any excluded distributions from the preferences.
let preferences = installed_packages let preferences = preferences
.iter() .into_iter()
.filter(|dist| !exclusions.contains(dist.name())) .filter(|dist| !exclusions.contains(dist.name()))
.map(Preference::from_installed)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
// Create a manifest of the requirements. // Create a manifest of the requirements.

View file

@ -24,7 +24,7 @@ use uv_interpreter::{PythonEnvironment, PythonVersion, SystemPython, Target};
use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_requirements::{RequirementsSource, RequirementsSpecification};
use uv_resolver::{ use uv_resolver::{
DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode, DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode,
ResolutionMode, Preference, ResolutionMode,
}; };
use uv_types::{BuildIsolation, HashStrategy, InFlight}; use uv_types::{BuildIsolation, HashStrategy, InFlight};
@ -275,6 +275,12 @@ pub(crate) async fn pip_sync(
// Determine the set of installed packages. // Determine the set of installed packages.
let site_packages = SitePackages::from_executable(&venv)?; let site_packages = SitePackages::from_executable(&venv)?;
// When resolving, prefer current site packages.
let preferences = site_packages
.iter()
.map(Preference::from_installed)
.collect::<Vec<_>>();
let options = OptionsBuilder::new() let options = OptionsBuilder::new()
.resolution_mode(resolution_mode) .resolution_mode(resolution_mode)
.prerelease_mode(prerelease_mode) .prerelease_mode(prerelease_mode)
@ -290,6 +296,7 @@ pub(crate) async fn pip_sync(
source_trees, source_trees,
project, project,
&extras, &extras,
preferences,
site_packages.clone(), site_packages.clone(),
&hasher, &hasher,
reinstall, reinstall,

View file

@ -96,6 +96,7 @@ pub(super) async fn do_lock(
let link_mode = LinkMode::default(); let link_mode = LinkMode::default();
let no_binary = NoBinary::default(); let no_binary = NoBinary::default();
let no_build = NoBuild::default(); let no_build = NoBuild::default();
let preferences = Vec::default();
let reinstall = Reinstall::default(); let reinstall = Reinstall::default();
let setup_py = SetupPyStrategy::default(); let setup_py = SetupPyStrategy::default();
let upgrade = Upgrade::default(); let upgrade = Upgrade::default();
@ -129,6 +130,7 @@ pub(super) async fn do_lock(
source_trees, source_trees,
Some(project_name), Some(project_name),
&extras, &extras,
preferences,
EmptyInstalledPackages, EmptyInstalledPackages,
&hasher, &hasher,
&reinstall, &reinstall,

View file

@ -169,7 +169,11 @@ pub(crate) async fn update_environment(
// TODO(charlie): Respect project configuration. // TODO(charlie): Respect project configuration.
let build_isolation = BuildIsolation::default(); let build_isolation = BuildIsolation::default();
let compile = false;
let concurrency = Concurrency::default();
let config_settings = ConfigSettings::default(); let config_settings = ConfigSettings::default();
let dry_run = false;
let extras = ExtrasSpecification::default();
let flat_index = FlatIndex::default(); let flat_index = FlatIndex::default();
let hasher = HashStrategy::default(); let hasher = HashStrategy::default();
let in_flight = InFlight::default(); let in_flight = InFlight::default();
@ -178,14 +182,11 @@ pub(crate) async fn update_environment(
let link_mode = LinkMode::default(); let link_mode = LinkMode::default();
let no_binary = NoBinary::default(); let no_binary = NoBinary::default();
let no_build = NoBuild::default(); let no_build = NoBuild::default();
let setup_py = SetupPyStrategy::default();
let concurrency = Concurrency::default();
let reinstall = Reinstall::default();
let compile = false;
let dry_run = false;
let extras = ExtrasSpecification::default();
let upgrade = Upgrade::default();
let options = Options::default(); let options = Options::default();
let preferences = Vec::default();
let reinstall = Reinstall::default();
let setup_py = SetupPyStrategy::default();
let upgrade = Upgrade::default();
// Create a build dispatch. // Create a build dispatch.
let resolve_dispatch = BuildDispatch::new( let resolve_dispatch = BuildDispatch::new(
@ -213,6 +214,7 @@ pub(crate) async fn update_environment(
spec.source_trees, spec.source_trees,
spec.project, spec.project,
&extras, &extras,
preferences,
site_packages.clone(), site_packages.clone(),
&hasher, &hasher,
&reinstall, &reinstall,