Skip to content

Commit 9d5df1b

Browse files
committed
Add frozen targets
Use lock Move onto target Validate early
1 parent b36ae6d commit 9d5df1b

18 files changed

Lines changed: 626 additions & 270 deletions

File tree

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/uv-resolver/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ pub use exclude_newer::ExcludeNewer;
44
pub use exclusions::Exclusions;
55
pub use flat_index::{FlatDistributions, FlatIndex};
66
pub use lock::{
7-
Lock, LockError, LockVersion, RequirementsTxtExport, ResolverManifest, SatisfiesResult,
8-
TreeDisplay, VERSION,
7+
InstallTarget, Lock, LockError, LockVersion, RequirementsTxtExport, ResolverManifest,
8+
SatisfiesResult, TreeDisplay, VERSION,
99
};
1010
pub use manifest::Manifest;
1111
pub use options::{Flexibility, Options, OptionsBuilder};

crates/uv-resolver/src/lock/mod.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use toml_edit::{value, Array, ArrayOfTables, InlineTable, Item, Table, Value};
1515
use url::Url;
1616

1717
pub use crate::lock::requirements_txt::RequirementsTxtExport;
18+
pub use crate::lock::target::InstallTarget;
1819
pub use crate::lock::tree::TreeDisplay;
1920
use crate::requires_python::SimplifiedMarkerTree;
2021
use crate::resolution::{AnnotatedDist, ResolutionGraphNode};
@@ -44,9 +45,10 @@ use uv_pypi_types::{
4445
};
4546
use uv_types::{BuildContext, HashStrategy};
4647
use uv_workspace::dependency_groups::DependencyGroupError;
47-
use uv_workspace::{InstallTarget, Workspace};
48+
use uv_workspace::Workspace;
4849

4950
mod requirements_txt;
51+
mod target;
5052
mod tree;
5153

5254
/// The current version of the lockfile format.
@@ -544,6 +546,16 @@ impl Lock {
544546
&self.manifest.members
545547
}
546548

549+
/// Return the workspace root used to generate this lock.
550+
pub fn root(&self) -> Option<&Package> {
551+
self.packages.iter().find(|package| {
552+
let (Source::Editable(path) | Source::Virtual(path)) = &package.id.source else {
553+
return false;
554+
};
555+
path == Path::new("")
556+
})
557+
}
558+
547559
/// Returns the supported environments that were used to generate this
548560
/// lock.
549561
///

crates/uv-resolver/src/lock/requirements_txt.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ use petgraph::{Directed, Graph};
1010
use rustc_hash::{FxBuildHasher, FxHashMap, FxHashSet};
1111
use url::Url;
1212

13-
use crate::graph_ops::marker_reachability;
14-
use crate::lock::{Package, PackageId, Source};
15-
use crate::{Lock, LockError};
1613
use uv_configuration::{DevGroupsManifest, EditableMode, ExtrasSpecification, InstallOptions};
1714
use uv_distribution_filename::{DistExtension, SourceDistExtension};
1815
use uv_fs::Simplified;
1916
use uv_git::GitReference;
2017
use uv_normalize::ExtraName;
2118
use uv_pep508::MarkerTree;
2219
use uv_pypi_types::{ParsedArchiveUrl, ParsedGitUrl};
23-
use uv_workspace::InstallTarget;
20+
21+
use crate::graph_ops::marker_reachability;
22+
use crate::lock::{Package, PackageId, Source};
23+
use crate::{InstallTarget, LockError};
2424

2525
type LockGraph<'lock> = Graph<Node<'lock>, Edge, Directed>;
2626

@@ -34,15 +34,14 @@ pub struct RequirementsTxtExport<'lock> {
3434

3535
impl<'lock> RequirementsTxtExport<'lock> {
3636
pub fn from_lock(
37-
lock: &'lock Lock,
3837
target: InstallTarget<'lock>,
3938
extras: &ExtrasSpecification,
4039
dev: &DevGroupsManifest,
4140
editable: EditableMode,
4241
hashes: bool,
4342
install_options: &'lock InstallOptions,
4443
) -> Result<Self, LockError> {
45-
let size_guess = lock.packages.len();
44+
let size_guess = target.lock().packages.len();
4645
let mut petgraph = LockGraph::with_capacity(size_guess, size_guess);
4746
let mut inverse = FxHashMap::with_capacity_and_hasher(size_guess, FxBuildHasher);
4847

@@ -53,7 +52,8 @@ impl<'lock> RequirementsTxtExport<'lock> {
5352

5453
// Add the workspace package to the queue.
5554
for root_name in target.packages() {
56-
let dist = lock
55+
let dist = target
56+
.lock()
5757
.find_by_name(root_name)
5858
.expect("found too many packages matching root")
5959
.expect("could not find root");
@@ -88,7 +88,7 @@ impl<'lock> RequirementsTxtExport<'lock> {
8888
// Add any development dependencies.
8989
for group in dev.iter() {
9090
for dep in dist.dependency_groups.get(group).into_iter().flatten() {
91-
let dep_dist = lock.find_by_id(&dep.package_id);
91+
let dep_dist = target.lock().find_by_id(&dep.package_id);
9292

9393
// Add the dependency to the graph.
9494
if let Entry::Vacant(entry) = inverse.entry(&dep.package_id) {
@@ -135,7 +135,7 @@ impl<'lock> RequirementsTxtExport<'lock> {
135135
};
136136

137137
for dep in deps {
138-
let dep_dist = lock.find_by_id(&dep.package_id);
138+
let dep_dist = target.lock().find_by_id(&dep.package_id);
139139

140140
// Add the dependency to the graph.
141141
if let Entry::Vacant(entry) = inverse.entry(&dep.package_id) {
@@ -175,7 +175,7 @@ impl<'lock> RequirementsTxtExport<'lock> {
175175
install_options.include_package(
176176
&package.id.name,
177177
target.project_name(),
178-
lock.members(),
178+
target.lock().members(),
179179
)
180180
})
181181
.map(|(index, package)| Requirement {

0 commit comments

Comments
 (0)