@@ -69,6 +69,7 @@ impl<V: Debug + Display + Clone + Ord> VersionRanges for Ranges<V> {
69
69
pub struct OfflineDependencyProvider < P : Debug + Display + Clone + Eq + Hash , R : VersionRanges > {
70
70
#[ allow( clippy:: type_complexity) ]
71
71
dependencies : Map < P , Vec < ( R :: V , Map < P , R > ) > > ,
72
+ conflicts : Map < P , u64 > ,
72
73
}
73
74
74
75
#[ cfg( feature = "serde" ) ]
@@ -112,6 +113,7 @@ where
112
113
. into_iter ( )
113
114
. map ( |( p, versions) | ( p, versions. into_iter ( ) . collect ( ) ) )
114
115
. collect ( ) ,
116
+ conflicts : Map :: default ( ) ,
115
117
} )
116
118
}
117
119
}
@@ -121,6 +123,7 @@ impl<P: Debug + Display + Clone + Eq + Hash, R: VersionRanges> OfflineDependency
121
123
pub fn new ( ) -> Self {
122
124
Self {
123
125
dependencies : Map :: default ( ) ,
126
+ conflicts : Map :: default ( ) ,
124
127
}
125
128
}
126
129
@@ -255,9 +258,20 @@ impl<P: Debug + Display + Clone + Eq + Hash, R: VersionRanges> DependencyProvide
255
258
& mut self ,
256
259
package_id : PackageId ,
257
260
set : VersionSet ,
258
- _ : & PackageArena < Self :: P > ,
261
+ package_store : & PackageArena < Self :: P > ,
259
262
) -> Self :: Priority {
260
- Reverse ( ( ( set. count ( ) as u64 ) << 32 ) + package_id. 0 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 )
261
275
}
262
276
263
277
fn get_dependencies (
@@ -398,4 +412,19 @@ impl<P: Debug + Display + Clone + Eq + Hash, R: VersionRanges> DependencyProvide
398
412
}
399
413
}
400
414
}
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
+ }
401
430
}
0 commit comments