Skip to content

Commit d390743

Browse files
committed
Add State::add_incompatibility_from_dependencies (#27)
This wrapper avoids accessing the `incompatibility_store` directly in uv code. Before: ```rust let dep_incompats = self.pubgrub.add_version( package.clone(), version.clone(), dependencies, ); self.pubgrub.partial_solution.add_version( package.clone(), version.clone(), dep_incompats, &self.pubgrub.incompatibility_store, ); ``` After: ```rust self.pubgrub.add_incompatibility_from_dependencies(package.clone(), version.clone(), dependencies); ``` `add_incompatibility_from_dependencies` is one of the main methods for the custom interface to pubgrub.
1 parent 57bbf19 commit d390743

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

src/internal/core.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use std::collections::HashSet as Set;
77
use std::sync::Arc;
88

99
use crate::internal::{
10-
Arena, DecisionLevel, HashArena, Id, IncompDpId, Incompatibility, PartialSolution, Relation,
11-
SatisfierSearch, SmallVec,
10+
Arena, DecisionLevel, HashArena, Id, IncompDpId, IncompId, Incompatibility, PartialSolution,
11+
Relation, SatisfierSearch, SmallVec,
1212
};
1313
use crate::{DependencyProvider, DerivationTree, Map, NoSolutionError, VersionSet};
1414

@@ -74,6 +74,23 @@ impl<DP: DependencyProvider> State<DP> {
7474
}
7575
}
7676

77+
/// Add the dependencies for the current version of the current package as incompatibilities.
78+
pub fn add_package_version_dependencies(
79+
&mut self,
80+
package: Id<DP::P>,
81+
version: DP::V,
82+
dependencies: impl IntoIterator<Item = (DP::P, DP::VS)>,
83+
) -> Option<IncompId<DP::P, DP::VS, DP::M>> {
84+
let dep_incompats =
85+
self.add_incompatibility_from_dependencies(package, version.clone(), dependencies);
86+
self.partial_solution.add_package_version_incompatibilities(
87+
package,
88+
version.clone(),
89+
dep_incompats,
90+
&self.incompatibility_store,
91+
)
92+
}
93+
7794
/// Add an incompatibility to the state.
7895
pub fn add_incompatibility(&mut self, incompat: Incompatibility<DP::P, DP::VS, DP::M>) {
7996
let id = self.incompatibility_store.alloc(incompat);

src/internal/partial_solution.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ impl<DP: DependencyProvider> PartialSolution<DP> {
441441
/// In practice I think it can only produce a conflict if one of the dependencies
442442
/// (which are used to make the new incompatibilities)
443443
/// is already in the partial solution with an incompatible version.
444-
pub(crate) fn add_version(
444+
pub(crate) fn add_package_version_incompatibilities(
445445
&mut self,
446446
package: Id<DP::P>,
447447
version: DP::V,

src/solver.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -228,15 +228,9 @@ pub fn resolve<DP: DependencyProvider>(
228228
};
229229

230230
// Add that package and version if the dependencies are not problematic.
231-
let dep_incompats =
232-
state.add_incompatibility_from_dependencies(p, v.clone(), dependencies);
233-
234-
if let Some(conflict) = state.partial_solution.add_version(
235-
p,
236-
v,
237-
dep_incompats,
238-
&state.incompatibility_store,
239-
) {
231+
if let Some(conflict) =
232+
state.add_package_version_dependencies(p, v.clone(), dependencies)
233+
{
240234
conflict_tracker.entry(p).or_default().dependencies_affected += 1;
241235
for (incompat_package, _) in state.incompatibility_store[conflict].iter() {
242236
if incompat_package == p {

0 commit comments

Comments
 (0)