@@ -5,6 +5,8 @@ use resolvo::{
5
5
KnownDependencies , NameId , Pool , SolvableId , Solver , SolverCache , UnsolvableOrCancelled ,
6
6
VersionSet , VersionSetId ,
7
7
} ;
8
+ use std:: cell:: RefCell ;
9
+ use std:: collections:: HashSet ;
8
10
use std:: rc:: Rc ;
9
11
use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
10
12
use std:: sync:: Arc ;
@@ -153,6 +155,10 @@ struct BundleBoxProvider {
153
155
concurrent_requests : Arc < AtomicUsize > ,
154
156
concurrent_requests_max : Rc < Cell < usize > > ,
155
157
sleep_before_return : bool ,
158
+
159
+ // A mapping of packages that we have requested candidates for. This way we can keep track of duplicate requests.
160
+ requested_candidates : RefCell < HashSet < NameId > > ,
161
+ requested_dependencies : RefCell < HashSet < SolvableId > > ,
156
162
}
157
163
158
164
struct BundleBoxPackageDependencies {
@@ -272,6 +278,11 @@ impl DependencyProvider<Range<Pack>> for BundleBoxProvider {
272
278
. max ( concurrent_requests + 1 ) ,
273
279
) ;
274
280
281
+ assert ! (
282
+ self . requested_candidates. borrow_mut( ) . insert( name) ,
283
+ "duplicate get_candidates request"
284
+ ) ;
285
+
275
286
let package_name = self . pool . resolve_package_name ( name) ;
276
287
let Some ( package) = self . packages . get ( package_name) else {
277
288
return self . maybe_delay ( None ) . await ;
@@ -319,6 +330,11 @@ impl DependencyProvider<Range<Pack>> for BundleBoxProvider {
319
330
. max ( concurrent_requests + 1 ) ,
320
331
) ;
321
332
333
+ assert ! (
334
+ self . requested_dependencies. borrow_mut( ) . insert( solvable) ,
335
+ "duplicate get_dependencies request"
336
+ ) ;
337
+
322
338
let candidate = self . pool . resolve_solvable ( solvable) ;
323
339
let package_name = self . pool . resolve_package_name ( candidate. name_id ( ) ) ;
324
340
let pack = candidate. inner ( ) ;
0 commit comments