Skip to content

Commit 942246b

Browse files
committed
Move adding dependencies for versions into dedicated method
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 f219f88 commit 942246b

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)