1
- use std:: { borrow:: Borrow , cell:: RefCell , collections:: HashMap , error:: Error as StdError } ;
1
+ use std:: { borrow:: Borrow , cell:: RefCell , collections:: HashMap , error:: Error as StdError , rc :: Rc } ;
2
2
3
3
use crate :: { manifest, Error , Result } ;
4
4
@@ -197,7 +197,7 @@ but it is locked to {locked_version}, which is incompatible.",
197
197
}
198
198
199
199
pub trait PackageFetcher {
200
- fn get_dependencies ( & self , package : & str ) -> Result < hexpm:: Package , Box < dyn StdError > > ;
200
+ fn get_dependencies ( & self , package : & str ) -> Result < Rc < hexpm:: Package > , Box < dyn StdError > > ;
201
201
}
202
202
203
203
struct DependencyProvider < ' a , T : PackageFetcher > {
@@ -247,7 +247,9 @@ where
247
247
) -> Result < ( ) , Box < dyn StdError > > {
248
248
let mut packages = self . packages . borrow_mut ( ) ;
249
249
if packages. get ( name) . is_none ( ) {
250
- let mut package = self . remote . get_dependencies ( name) ?;
250
+ let package = self . remote . get_dependencies ( name) ?;
251
+ // mut (therefore clone) is required here in order to sort the releases
252
+ let mut package = ( * package) . clone ( ) ;
251
253
// Sort the packages from newest to oldest, pres after all others
252
254
package. releases . sort_by ( |a, b| a. version . cmp ( & b. version ) ) ;
253
255
package. releases . reverse ( ) ;
@@ -362,14 +364,14 @@ mod tests {
362
364
use super :: * ;
363
365
364
366
struct Remote {
365
- deps : HashMap < String , hexpm:: Package > ,
367
+ deps : HashMap < String , Rc < hexpm:: Package > > ,
366
368
}
367
369
368
370
impl PackageFetcher for Remote {
369
- fn get_dependencies ( & self , package : & str ) -> Result < hexpm:: Package , Box < dyn StdError > > {
371
+ fn get_dependencies ( & self , package : & str ) -> Result < Rc < hexpm:: Package > , Box < dyn StdError > > {
370
372
self . deps
371
373
. get ( package)
372
- . cloned ( )
374
+ . map ( Rc :: clone )
373
375
. ok_or ( Box :: new ( hexpm:: ApiError :: NotFound ) )
374
376
}
375
377
}
@@ -411,7 +413,8 @@ mod tests {
411
413
meta: ( ) ,
412
414
} ,
413
415
] ,
414
- } ,
416
+ }
417
+ . into ( ) ,
415
418
) ;
416
419
let _ = deps. insert (
417
420
"gleam_otp" . into ( ) ,
@@ -484,7 +487,8 @@ mod tests {
484
487
meta: ( ) ,
485
488
} ,
486
489
] ,
487
- } ,
490
+ }
491
+ . into ( ) ,
488
492
) ;
489
493
let _ = deps. insert (
490
494
"package_with_retired" . into ( ) ,
@@ -510,7 +514,8 @@ mod tests {
510
514
meta: ( ) ,
511
515
} ,
512
516
] ,
513
- } ,
517
+ }
518
+ . into ( ) ,
514
519
) ;
515
520
516
521
let _ = deps. insert (
@@ -534,7 +539,8 @@ mod tests {
534
539
outer_checksum: vec![ 1 , 2 , 3 ] ,
535
540
meta: ( ) ,
536
541
} ] ,
537
- } ,
542
+ }
543
+ . into ( ) ,
538
544
) ;
539
545
540
546
let simple_deps_for_major_version_check = vec ! [
@@ -577,7 +583,7 @@ mod tests {
577
583
578
584
fn insert_simplified_deps (
579
585
simple_deps : Vec < ( & str , Vec < ( & str , Vec < ( & str , & str ) > ) > ) > ,
580
- deps : & mut HashMap < String , hexpm:: Package > ,
586
+ deps : & mut HashMap < String , Rc < hexpm:: Package > > ,
581
587
) {
582
588
for ( name, releases) in simple_deps {
583
589
let _ = deps. insert (
@@ -608,7 +614,8 @@ mod tests {
608
614
meta : ( ) ,
609
615
} )
610
616
. collect ( ) ,
611
- } ,
617
+ }
618
+ . into ( ) ,
612
619
) ;
613
620
}
614
621
}
0 commit comments