fn move_update()

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(())
}