Skip to content

Commit 9ff199a

Browse files
fix(installation): extract installation of a component into a separate function
1 parent 60d6afb commit 9ff199a

File tree

1 file changed

+55
-38
lines changed

1 file changed

+55
-38
lines changed

src/dist/manifestation.rs

Lines changed: 55 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ impl Manifestation {
211211
for result in results {
212212
let (bin, downloaded_file) = result?;
213213
things_downloaded.push(bin.binary.hash.clone());
214-
things_to_install.push((bin.component, bin.binary.compression, downloaded_file));
214+
things_to_install.push((bin, downloaded_file));
215215
}
216216
}
217217

@@ -250,44 +250,15 @@ impl Manifestation {
250250
}
251251

252252
// Install components
253-
for (component, format, installer_file) in things_to_install {
254-
// For historical reasons, the rust-installer component
255-
// names are not the same as the dist manifest component
256-
// names. Some are just the component name some are the
257-
// component name plus the target triple.
258-
let pkg_name = component.name_in_manifest();
259-
let short_pkg_name = component.short_name_in_manifest();
260-
let short_name = component.short_name(new_manifest);
261-
262-
(download_cfg.notify_handler)(Notification::InstallingComponent(
263-
&short_name,
264-
&self.target_triple,
265-
component.target.as_ref(),
266-
));
267-
268-
let cx = PackageContext {
253+
for (component_bin, installer_file) in things_to_install {
254+
tx = self.install_component(
255+
component_bin,
256+
installer_file,
269257
tmp_cx,
270-
notify_handler: Some(download_cfg.notify_handler),
271-
process: download_cfg.process,
272-
};
273-
274-
let reader = utils::FileReaderWithProgress::new_file(
275-
&installer_file,
276-
download_cfg.notify_handler,
258+
download_cfg,
259+
new_manifest,
260+
tx,
277261
)?;
278-
let package = match format {
279-
CompressionKind::GZip => &TarGzPackage::new(reader, &cx)? as &dyn Package,
280-
CompressionKind::XZ => &TarXzPackage::new(reader, &cx)?,
281-
CompressionKind::ZStd => &TarZStdPackage::new(reader, &cx)?,
282-
};
283-
284-
// If the package doesn't contain the component that the
285-
// manifest says it does then somebody must be playing a joke on us.
286-
if !package.contains(&pkg_name, Some(short_pkg_name)) {
287-
return Err(RustupError::CorruptComponent(short_name).into());
288-
}
289-
290-
tx = package.install(&self.installation, &pkg_name, Some(short_pkg_name), tx)?;
291262
}
292263

293264
// Install new distribution manifest
@@ -302,7 +273,7 @@ impl Manifestation {
302273
// `Components` *also* tracks what is installed, but it only tracks names, not
303274
// name/target. Needs to be fixed in rust-installer.
304275
let new_config = Config {
305-
components: update.final_component_list,
276+
components: update.final_component_list.clone(),
306277
..Config::default()
307278
};
308279
let config_str = new_config.stringify()?;
@@ -526,6 +497,52 @@ impl Manifestation {
526497

527498
Ok(tx)
528499
}
500+
501+
fn install_component<'a>(
502+
&self,
503+
component_bin: ComponentBinary<'a>,
504+
installer_file: File,
505+
tmp_cx: &temp::Context,
506+
download_cfg: &DownloadCfg<'_>,
507+
new_manifest: &Manifest,
508+
tx: Transaction<'a>,
509+
) -> Result<Transaction<'a>> {
510+
// For historical reasons, the rust-installer component
511+
// names are not the same as the dist manifest component
512+
// names. Some are just the component name some are the
513+
// component name plus the target triple.
514+
let pkg_name = component_bin.component.name_in_manifest();
515+
let short_pkg_name = component_bin.component.short_name_in_manifest();
516+
let short_name = component_bin.component.short_name(new_manifest);
517+
518+
(download_cfg.notify_handler)(Notification::InstallingComponent(
519+
&short_name,
520+
&self.target_triple,
521+
component_bin.component.target.as_ref(),
522+
));
523+
524+
let cx = PackageContext {
525+
tmp_cx,
526+
notify_handler: Some(download_cfg.notify_handler),
527+
process: download_cfg.process,
528+
};
529+
530+
let reader =
531+
utils::FileReaderWithProgress::new_file(&installer_file, download_cfg.notify_handler)?;
532+
let package = match component_bin.binary.compression {
533+
CompressionKind::GZip => &TarGzPackage::new(reader, &cx)? as &dyn Package,
534+
CompressionKind::XZ => &TarXzPackage::new(reader, &cx)?,
535+
CompressionKind::ZStd => &TarZStdPackage::new(reader, &cx)?,
536+
};
537+
538+
// If the package doesn't contain the component that the
539+
// manifest says it does then somebody must be playing a joke on us.
540+
if !package.contains(&pkg_name, Some(short_pkg_name)) {
541+
return Err(RustupError::CorruptComponent(short_name).into());
542+
}
543+
544+
package.install(&self.installation, &pkg_name, Some(short_pkg_name), tx)
545+
}
529546
}
530547

531548
#[derive(Debug)]

0 commit comments

Comments
 (0)