From 8e6b0dd6b4b22050096f720730e372e0c443cc08 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 23 Mar 2024 11:56:55 -0400 Subject: [PATCH] Fix issue where patches could panic because file didn't exist Some of the recent boot updates now include patch files that try to ask us to remove files that were already deleted. Now the patch process is smarter and will quietly warn that said operation failed but will continue to chug along. --- src/patch.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/patch.rs b/src/patch.rs index aaa1cb0..30d3ac6 100755 --- a/src/patch.rs +++ b/src/patch.rs @@ -10,7 +10,7 @@ use std::path::PathBuf; use binrw::binread; use binrw::BinRead; use binrw::binrw; -use tracing::debug; +use tracing::{debug, warn}; use crate::common::Region; use crate::sqpack::read_data_block_patch; @@ -576,20 +576,26 @@ pub fn apply_patch(data_dir: &str, patch_path: &str) -> Result<(), PatchError> { file.seek(SeekFrom::Current(4))?; // now apply the file! - let mut new_file = OpenOptions::new() + let new_file = OpenOptions::new() .write(true) .create(true) - .open(file_path)?; + .open(&file_path); - if fop.offset == 0 { - new_file.set_len(0)?; + if let Ok(mut file) = new_file { + if fop.offset == 0 { + file.set_len(0)?; + } + + file.seek(SeekFrom::Start(fop.offset))?; + file.write_all(&data)?; + } else { + warn!("{file_path} does not exist, skipping."); } - - new_file.seek(SeekFrom::Start(fop.offset))?; - new_file.write_all(&data)?; } SqpkFileOperation::DeleteFile => { - fs::remove_file(file_path.as_str())?; + if fs::remove_file(file_path.as_str()).is_err() { + warn!("Failed to remove {file_path}"); + } } SqpkFileOperation::RemoveAll => { let path: PathBuf =