Skip to content

Commit 3c5b136

Browse files
authored
Move adding dependencies for versions into dedicated method (#4410)
To support diverging urls, we have to check urls when adding dependencies (after forking). To prepare for this, i've moved adding dependencies for the current version to `SolveState::add_package_version_dependencies` and removed the duplication when checking for self-dependencies. This changed is joined with a change in pubgrub (astral-sh/pubgrub#27) that simplifies the same code path.
1 parent a68146d commit 3c5b136

File tree

3 files changed

+43
-61
lines changed

3 files changed

+43
-61
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ path-slash = { version = "0.2.1" }
101101
pathdiff = { version = "0.2.1" }
102102
petgraph = { version = "0.6.4" }
103103
platform-info = { version = "2.0.2" }
104-
pubgrub = { git = "https://github.com/astral-sh/pubgrub", rev = "a68cbd1a26e43986a31563e1d127e83bafca3a0c" }
104+
pubgrub = { git = "https://github.com/astral-sh/pubgrub", rev = "b4435e2f3af10dab2336a0345b35dcd622699d06" }
105105
pyo3 = { version = "0.21.0" }
106106
pyo3-log = { version = "0.10.0" }
107107
quote = { version = "1.0.36" }

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

+41-59
Original file line numberDiff line numberDiff line change
@@ -495,9 +495,8 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
495495
.insert(version.clone())
496496
{
497497
// Retrieve that package dependencies.
498-
let package = state.next.clone();
499498
let forked_deps = self.get_dependencies_forking(
500-
&package,
499+
&state.next,
501500
&version,
502501
&state.markers,
503502
&mut state.priorities,
@@ -508,40 +507,18 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
508507
state
509508
.pubgrub
510509
.add_incompatibility(Incompatibility::custom_version(
511-
package.clone(),
510+
state.next.clone(),
512511
version.clone(),
513512
UnavailableReason::Version(reason),
514513
));
515514
forked_states.push(state);
516515
}
517-
ForkedDependencies::Unforked(constraints) => {
518-
if constraints
519-
.iter()
520-
.any(|(dependency, _)| dependency == &package)
521-
{
522-
if enabled!(Level::DEBUG) {
523-
prefetcher.log_tried_versions();
524-
}
525-
return Err(PubGrubError::SelfDependency {
526-
package: package.clone(),
527-
version: version.clone(),
528-
}
529-
.into());
530-
}
531-
532-
// Add that package and version if the dependencies are not problematic.
533-
let dep_incompats =
534-
state.pubgrub.add_incompatibility_from_dependencies(
535-
package.clone(),
536-
version.clone(),
537-
constraints,
538-
);
539-
state.pubgrub.partial_solution.add_version(
540-
package.clone(),
541-
version.clone(),
542-
dep_incompats,
543-
&state.pubgrub.incompatibility_store,
544-
);
516+
ForkedDependencies::Unforked(dependencies) => {
517+
state.add_package_version_dependencies(
518+
&version,
519+
dependencies,
520+
&prefetcher,
521+
)?;
545522
forked_states.push(state);
546523
}
547524
ForkedDependencies::Forked {
@@ -565,41 +542,18 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
565542
let mut cur_state = Some(state);
566543
let forks_len = forks.len();
567544
for (i, fork) in forks.into_iter().enumerate() {
568-
if fork
569-
.dependencies
570-
.iter()
571-
.any(|(dependency, _)| dependency == &package)
572-
{
573-
if enabled!(Level::DEBUG) {
574-
prefetcher.log_tried_versions();
575-
}
576-
return Err(PubGrubError::SelfDependency {
577-
package: package.clone(),
578-
version: version.clone(),
579-
}
580-
.into());
581-
}
582-
583545
let is_last = i == forks_len - 1;
584546
let mut forked_state = cur_state.take().unwrap();
585547
if !is_last {
586548
cur_state = Some(forked_state.clone());
587549
}
588550
forked_state.markers.and(fork.markers);
589551

590-
// Add that package and version if the dependencies are not problematic.
591-
let dep_incompats =
592-
forked_state.pubgrub.add_incompatibility_from_dependencies(
593-
package.clone(),
594-
version.clone(),
595-
fork.dependencies,
596-
);
597-
forked_state.pubgrub.partial_solution.add_version(
598-
package.clone(),
599-
version.clone(),
600-
dep_incompats,
601-
&forked_state.pubgrub.incompatibility_store,
602-
);
552+
forked_state.add_package_version_dependencies(
553+
&version,
554+
fork.dependencies,
555+
&prefetcher,
556+
)?;
603557
forked_states.push(forked_state);
604558
}
605559
}
@@ -1573,6 +1527,34 @@ struct SolveState {
15731527
}
15741528

15751529
impl SolveState {
1530+
/// Add the dependencies for the selected version of the current package.
1531+
fn add_package_version_dependencies(
1532+
&mut self,
1533+
version: &Version,
1534+
dependencies: Vec<(PubGrubPackage, Range<Version>)>,
1535+
prefetcher: &BatchPrefetcher,
1536+
) -> Result<(), ResolveError> {
1537+
if dependencies
1538+
.iter()
1539+
.any(|(dependency, _)| dependency == &self.next)
1540+
{
1541+
if enabled!(Level::DEBUG) {
1542+
prefetcher.log_tried_versions();
1543+
}
1544+
return Err(PubGrubError::SelfDependency {
1545+
package: self.next.clone(),
1546+
version: version.clone(),
1547+
}
1548+
.into());
1549+
}
1550+
self.pubgrub.add_package_version_dependencies(
1551+
self.next.clone(),
1552+
version.clone(),
1553+
dependencies,
1554+
);
1555+
Ok(())
1556+
}
1557+
15761558
fn into_resolution(self) -> Resolution {
15771559
let solution = self.pubgrub.partial_solution.extract_solution();
15781560
let mut dependencies: FxHashMap<

0 commit comments

Comments
 (0)