@@ -69,6 +69,7 @@ impl<V: Debug + Display + Clone + Ord> VersionRanges for Ranges<V> {
6969pub struct OfflineDependencyProvider < P : Debug + Display + Clone + Eq + Hash , R : VersionRanges > {
7070 #[ allow( clippy:: type_complexity) ]
7171 dependencies : Map < P , Vec < ( R :: V , Map < P , R > ) > > ,
72+ conflicts : Map < P , u64 > ,
7273}
7374
7475#[ cfg( feature = "serde" ) ]
@@ -112,6 +113,7 @@ where
112113 . into_iter ( )
113114 . map ( |( p, versions) | ( p, versions. into_iter ( ) . collect ( ) ) )
114115 . collect ( ) ,
116+ conflicts : Map :: default ( ) ,
115117 } )
116118 }
117119}
@@ -121,6 +123,7 @@ impl<P: Debug + Display + Clone + Eq + Hash, R: VersionRanges> OfflineDependency
121123 pub fn new ( ) -> Self {
122124 Self {
123125 dependencies : Map :: default ( ) ,
126+ conflicts : Map :: default ( ) ,
124127 }
125128 }
126129
@@ -255,9 +258,20 @@ impl<P: Debug + Display + Clone + Eq + Hash, R: VersionRanges> DependencyProvide
255258 & mut self ,
256259 package_id : PackageId ,
257260 set : VersionSet ,
258- _ : & PackageArena < Self :: P > ,
261+ package_store : & PackageArena < Self :: P > ,
259262 ) -> Self :: Priority {
260- Reverse ( ( ( set. count ( ) as u64 ) << 32 ) + package_id. get ( ) as u64 )
263+ let version_count = set. count ( ) ;
264+ if version_count == 0 {
265+ return Reverse ( 0 ) ;
266+ }
267+ let pkg = match package_store. pkg ( package_id) . unwrap ( ) {
268+ PackageVersionWrapper :: Pkg ( p) => p. pkg ( ) ,
269+ PackageVersionWrapper :: VirtualPkg ( p) => p. pkg ( ) ,
270+ PackageVersionWrapper :: VirtualDep ( p) => p. pkg ( ) ,
271+ } ;
272+ let conflict_count = self . conflicts . get ( pkg) . copied ( ) . unwrap_or_default ( ) ;
273+
274+ Reverse ( ( ( u32:: MAX as u64 ) . saturating_sub ( conflict_count) << 6 ) + version_count as u64 )
261275 }
262276
263277 fn get_dependencies (
@@ -398,4 +412,19 @@ impl<P: Debug + Display + Clone + Eq + Hash, R: VersionRanges> DependencyProvide
398412 }
399413 }
400414 }
415+
416+ fn register_conflict (
417+ & mut self ,
418+ package_ids : impl Iterator < Item = PackageId > ,
419+ package_store : & PackageArena < Self :: P > ,
420+ ) {
421+ for package_id in package_ids {
422+ let pkg = match package_store. pkg ( package_id) . unwrap ( ) {
423+ PackageVersionWrapper :: Pkg ( p) => p. pkg ( ) ,
424+ PackageVersionWrapper :: VirtualPkg ( p) => p. pkg ( ) ,
425+ PackageVersionWrapper :: VirtualDep ( p) => p. pkg ( ) ,
426+ } ;
427+ * self . conflicts . entry ( pkg. clone ( ) ) . or_default ( ) += 1 ;
428+ }
429+ }
401430}
0 commit comments