@@ -213,7 +213,7 @@ impl Manifestation {
213213 for result in results {
214214 let ( bin, downloaded_file) = result?;
215215 things_downloaded. push ( bin. binary . hash . clone ( ) ) ;
216- things_to_install. push ( ( bin. component , bin . binary . compression , downloaded_file) ) ;
216+ things_to_install. push ( ( bin, downloaded_file) ) ;
217217 }
218218 }
219219
@@ -256,41 +256,14 @@ impl Manifestation {
256256 }
257257
258258 // Install components
259- for ( component, format, installer_file) in things_to_install {
260- // For historical reasons, the rust-installer component
261- // names are not the same as the dist manifest component
262- // names. Some are just the component name some are the
263- // component name plus the target triple.
264- let pkg_name = component. name_in_manifest ( ) ;
265- let short_pkg_name = component. short_name_in_manifest ( ) ;
266- let short_name = component. short_name ( new_manifest) ;
267-
268- match & component. target {
269- Some ( t) if t != & self . target_triple => {
270- info ! ( "installing component {short_name}" ) ;
271- }
272- _ => {
273- info ! (
274- "installing component {short_name} for target {}" ,
275- self . target_triple
276- )
277- }
278- }
279-
280- let reader = utils:: FileReaderWithProgress :: new_file ( & installer_file) ?;
281- let package = match format {
282- CompressionKind :: GZip => & TarGzPackage :: new ( reader, download_cfg) ? as & dyn Package ,
283- CompressionKind :: XZ => & TarXzPackage :: new ( reader, download_cfg) ?,
284- CompressionKind :: ZStd => & TarZStdPackage :: new ( reader, download_cfg) ?,
285- } ;
286-
287- // If the package doesn't contain the component that the
288- // manifest says it does then somebody must be playing a joke on us.
289- if !package. contains ( & pkg_name, Some ( short_pkg_name) ) {
290- return Err ( RustupError :: CorruptComponent ( short_name) . into ( ) ) ;
291- }
292-
293- tx = package. install ( & self . installation , & pkg_name, Some ( short_pkg_name) , tx) ?;
259+ for ( component_bin, installer_file) in things_to_install {
260+ tx = self . install_component (
261+ component_bin,
262+ installer_file,
263+ download_cfg,
264+ new_manifest,
265+ tx,
266+ ) ?;
294267 }
295268
296269 // Install new distribution manifest
@@ -305,7 +278,7 @@ impl Manifestation {
305278 // `Components` *also* tracks what is installed, but it only tracks names, not
306279 // name/target. Needs to be fixed in rust-installer.
307280 let new_config = Config {
308- components : update. final_component_list ,
281+ components : update. final_component_list . clone ( ) ,
309282 ..Config :: default ( )
310283 } ;
311284 let config_str = new_config. stringify ( ) ?;
@@ -499,6 +472,50 @@ impl Manifestation {
499472
500473 Ok ( tx)
501474 }
475+
476+ fn install_component < ' a > (
477+ & self ,
478+ component_bin : ComponentBinary < ' a > ,
479+ installer_file : File ,
480+ download_cfg : & DownloadCfg < ' _ > ,
481+ new_manifest : & Manifest ,
482+ tx : Transaction < ' a > ,
483+ ) -> Result < Transaction < ' a > > {
484+ // For historical reasons, the rust-installer component
485+ // names are not the same as the dist manifest component
486+ // names. Some are just the component name some are the
487+ // component name plus the target triple.
488+ let pkg_name = component_bin. component . name_in_manifest ( ) ;
489+ let short_pkg_name = component_bin. component . short_name_in_manifest ( ) ;
490+ let short_name = component_bin. component . short_name ( new_manifest) ;
491+
492+ match & component_bin. component . target {
493+ Some ( t) if t != & self . target_triple => {
494+ info ! ( "installing component {short_name}" ) ;
495+ }
496+ _ => {
497+ info ! (
498+ "installing component {short_name} for target {}" ,
499+ self . target_triple
500+ )
501+ }
502+ }
503+
504+ let reader = utils:: FileReaderWithProgress :: new_file ( & installer_file) ?;
505+ let package = match component_bin. binary . compression {
506+ CompressionKind :: GZip => & TarGzPackage :: new ( reader, download_cfg) ? as & dyn Package ,
507+ CompressionKind :: XZ => & TarXzPackage :: new ( reader, download_cfg) ?,
508+ CompressionKind :: ZStd => & TarZStdPackage :: new ( reader, download_cfg) ?,
509+ } ;
510+
511+ // If the package doesn't contain the component that the
512+ // manifest says it does then somebody must be playing a joke on us.
513+ if !package. contains ( & pkg_name, Some ( short_pkg_name) ) {
514+ return Err ( RustupError :: CorruptComponent ( short_name) . into ( ) ) ;
515+ }
516+
517+ package. install ( & self . installation , & pkg_name, Some ( short_pkg_name) , tx)
518+ }
502519}
503520
504521#[ derive( Debug ) ]
0 commit comments