From 18a6218a77190dfe9f06ebfa32595c6ad0a555eb Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 30 Apr 2020 08:01:45 +1000 Subject: [PATCH] don't throw an error when a file is greater than MAXPATH https://anki.tenderapp.com/discussions/ankidesktop/40931-check-media-error --- rslib/src/media/check.rs | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/rslib/src/media/check.rs b/rslib/src/media/check.rs index 3eb079a4b..75a66adda 100644 --- a/rslib/src/media/check.rs +++ b/rslib/src/media/check.rs @@ -235,36 +235,36 @@ where continue; } - // rename if required - let (norm_name, renamed_on_disk) = self.normalize_and_maybe_rename(ctx, &disk_fname)?; - if renamed_on_disk { - out.renamed - .insert(disk_fname.to_string(), norm_name.to_string()); + if let Some(norm_name) = filename_if_normalized(disk_fname) { + out.files.push(norm_name.into_owned()); + } else { + match data_for_file(&self.mgr.media_folder, disk_fname)? { + Some(data) => { + let norm_name = self.normalize_file(ctx, &disk_fname, data)?; + out.renamed + .insert(disk_fname.to_string(), norm_name.to_string()); + out.files.push(norm_name.into_owned()); + } + None => { + // file not found, caused by the file being removed at this exact instant, + // or the path being larger than MAXPATH on Windows + continue; + } + }; } - - out.files.push(norm_name.into_owned()); } Ok(out) } - /// Returns (normalized_form, needs_rename) - fn normalize_and_maybe_rename<'a>( + /// Write file data to normalized location, moving old file to trash. + fn normalize_file<'a>( &mut self, ctx: &mut MediaDatabaseContext, disk_fname: &'a str, - ) -> Result<(Cow<'a, str>, bool)> { - // already normalized? - if let Some(fname) = filename_if_normalized(disk_fname) { - return Ok((fname, false)); - } - + data: Vec, + ) -> Result> { // add a copy of the file using the correct name - let data = data_for_file(&self.mgr.media_folder, disk_fname)?.ok_or_else(|| { - AnkiError::IOError { - info: format!("file disappeared: {}", disk_fname), - } - })?; let fname = self.mgr.add_file(ctx, disk_fname, &data)?; debug!(self.ctx.log, "renamed"; "from"=>disk_fname, "to"=>&fname.as_ref()); assert_ne!(fname.as_ref(), disk_fname); @@ -273,7 +273,7 @@ where let path = &self.mgr.media_folder.join(disk_fname); fs::remove_file(path)?; - Ok((fname, true)) + Ok(fname) } fn fire_progress_cb(&mut self) -> Result<()> {