Prevent bricked install when ^C is pressed during archive extraction
This commit is contained in:
@ -158,13 +158,22 @@ fn extract_release_archive(
|
|||||||
let progress_bar = new_spinner_progress_bar();
|
let progress_bar = new_spinner_progress_bar();
|
||||||
progress_bar.set_message(&format!("{}Extracting...", PACKAGE));
|
progress_bar.set_message(&format!("{}Extracting...", PACKAGE));
|
||||||
|
|
||||||
let _ = fs::remove_dir_all(extract_dir);
|
if extract_dir.exists() {
|
||||||
fs::create_dir_all(extract_dir)?;
|
let _ = fs::remove_dir_all(&extract_dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
let tmp_extract_dir = extract_dir.with_file_name("tmp-extract");
|
||||||
|
if tmp_extract_dir.exists() {
|
||||||
|
let _ = fs::remove_dir_all(&tmp_extract_dir);
|
||||||
|
}
|
||||||
|
fs::create_dir_all(&tmp_extract_dir)?;
|
||||||
|
|
||||||
let tar_bz2 = File::open(archive)?;
|
let tar_bz2 = File::open(archive)?;
|
||||||
let tar = BzDecoder::new(BufReader::new(tar_bz2));
|
let tar = BzDecoder::new(BufReader::new(tar_bz2));
|
||||||
let mut release = Archive::new(tar);
|
let mut release = Archive::new(tar);
|
||||||
release.unpack(extract_dir)?;
|
release.unpack(&tmp_extract_dir)?;
|
||||||
|
|
||||||
|
fs::rename(&tmp_extract_dir, extract_dir)?;
|
||||||
|
|
||||||
progress_bar.finish_and_clear();
|
progress_bar.finish_and_clear();
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -786,10 +795,10 @@ pub fn update(config_file: &str) -> Result<bool, String> {
|
|||||||
ExplicitRelease::Semver(release_semver) => {
|
ExplicitRelease::Semver(release_semver) => {
|
||||||
let download_url = github_release_download_url(release_semver);
|
let download_url = github_release_download_url(release_semver);
|
||||||
let release_dir = config.release_dir(&release_semver);
|
let release_dir = config.release_dir(&release_semver);
|
||||||
let download_url = if release_dir.join(".ok").exists() {
|
let download_url = if release_dir.exists() {
|
||||||
// If this release_semver has already been successfully downloaded, no update
|
// If this release_semver has already been successfully downloaded, no update
|
||||||
// needed
|
// needed
|
||||||
println!("{} is present, no download required.", release_semver);
|
println!("{} found in cache", release_semver);
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(download_url)
|
Some(download_url)
|
||||||
@ -797,33 +806,48 @@ pub fn update(config_file: &str) -> Result<bool, String> {
|
|||||||
(download_url, release_dir)
|
(download_url, release_dir)
|
||||||
}
|
}
|
||||||
ExplicitRelease::Channel(release_channel) => {
|
ExplicitRelease::Channel(release_channel) => {
|
||||||
let release_dir = config.release_dir(&release_channel);
|
let version_url = release_channel_version_url(release_channel);
|
||||||
|
|
||||||
|
let (_temp_dir, temp_file, _temp_archive_sha256) =
|
||||||
|
download_to_temp(&version_url, None)
|
||||||
|
.map_err(|err| format!("Unable to download {}: {}", version_url, err))?;
|
||||||
|
|
||||||
|
let update_release_version = load_release_version(&temp_file)?;
|
||||||
|
|
||||||
|
let release_id = format!("{}-{}", release_channel, update_release_version.commit);
|
||||||
|
let release_dir = config.release_dir(&release_id);
|
||||||
let current_release_version_yml =
|
let current_release_version_yml =
|
||||||
release_dir.join("solana-release").join("version.yml");
|
release_dir.join("solana-release").join("version.yml");
|
||||||
|
|
||||||
let download_url = Some(release_channel_download_url(release_channel));
|
let download_url = Some(release_channel_download_url(release_channel));
|
||||||
|
|
||||||
if !current_release_version_yml.exists() {
|
if !current_release_version_yml.exists() {
|
||||||
|
println_name_value(
|
||||||
|
&format!("{}Release commit:", BULLET),
|
||||||
|
&update_release_version.commit[0..7],
|
||||||
|
);
|
||||||
(download_url, release_dir)
|
(download_url, release_dir)
|
||||||
} else {
|
} else {
|
||||||
let version_url = release_channel_version_url(release_channel);
|
|
||||||
|
|
||||||
let (_temp_dir, temp_file, _temp_archive_sha256) =
|
|
||||||
download_to_temp(&version_url, None).map_err(|err| {
|
|
||||||
format!("Unable to download {}: {}", version_url, err)
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let update_release_version = load_release_version(&temp_file)?;
|
|
||||||
let current_release_version =
|
let current_release_version =
|
||||||
load_release_version(¤t_release_version_yml)?;
|
load_release_version(¤t_release_version_yml)?;
|
||||||
|
|
||||||
if update_release_version.commit == current_release_version.commit {
|
if update_release_version.commit == current_release_version.commit {
|
||||||
// Same commit, no update required
|
// Same commit, no update required
|
||||||
println!(
|
println!(
|
||||||
"Latest {} build is already present, no download required.",
|
"Latest {} build ({}) found in cache",
|
||||||
release_channel
|
release_channel,
|
||||||
|
¤t_release_version.commit[0..7],
|
||||||
);
|
);
|
||||||
(None, release_dir)
|
(None, release_dir)
|
||||||
} else {
|
} else {
|
||||||
|
println_name_value(
|
||||||
|
&format!("{}Release commit:", BULLET),
|
||||||
|
&format!(
|
||||||
|
"{} => {}:",
|
||||||
|
¤t_release_version.commit[0..7],
|
||||||
|
&update_release_version.commit[0..7],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
(download_url, release_dir)
|
(download_url, release_dir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -840,7 +864,6 @@ pub fn update(config_file: &str) -> Result<bool, String> {
|
|||||||
temp_archive, release_dir, err
|
temp_archive, release_dir, err
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let _ = fs::create_dir_all(release_dir.join(".ok"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
release_dir
|
release_dir
|
||||||
|
Reference in New Issue
Block a user