in src/main.rs [208:263]
fn move_update(
log: &slog::Logger,
uninstdat_path: &Path,
update_folder_name: &str,
) -> Result<(), Box<dyn error::Error>> {
info!(
log,
"move_update: {:?}, {}", uninstdat_path, update_folder_name
);
let root_path = uninstdat_path.parent().ok_or(io::Error::new(
io::ErrorKind::Other,
"Could not get parent path of uninstdat",
))?;
let mut update_path = PathBuf::from(root_path);
update_path.push(update_folder_name);
let stat = fs::metadata(&update_path)?;
if !stat.is_dir() {
return Err(io::Error::new(io::ErrorKind::Other, "Update folder is not a directory").into());
}
// safely delete all current files
delete_existing_version(log, root_path, update_folder_name)?;
// move update to current
for entry in fs::read_dir(&update_path)? {
let entry = entry?;
let entry_name = entry.file_name();
let entry_name = entry_name.to_str().ok_or(io::Error::new(
io::ErrorKind::Other,
"Could not get entry name",
))?;
let mut target = PathBuf::from(root_path);
target.push(entry_name);
let msg = format!("Renaming: {:?}", entry_name);
util::retry(
&msg,
|attempt| {
info!(log, "Rename: {:?} (attempt {})", entry_name, attempt);
fs::rename(entry.path(), &target)?;
Ok(())
},
None,
)?;
}
info!(log, "Delete: {:?}", update_path);
fs::remove_dir_all(update_path)?;
Ok(())
}