expire media trash after a week

This commit is contained in:
Damien Elmes 2020-02-09 10:29:42 +10:00
parent e9f51a694c
commit 314e643140
2 changed files with 34 additions and 3 deletions

View file

@ -4,12 +4,12 @@
use crate::err::{AnkiError, Result}; use crate::err::{AnkiError, Result};
use crate::media::database::MediaDatabaseContext; use crate::media::database::MediaDatabaseContext;
use crate::media::files::{ use crate::media::files::{
data_for_file, filename_if_normalized, remove_files, MEDIA_SYNC_FILESIZE_LIMIT, data_for_file, filename_if_normalized, remove_files, trash_folder, MEDIA_SYNC_FILESIZE_LIMIT,
}; };
use crate::media::MediaManager; use crate::media::MediaManager;
use coarsetime::Instant; use coarsetime::Instant;
use log::debug; use log::debug;
use std::borrow::Cow; use std::{borrow::Cow, fs, time};
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub struct MediaCheckOutput { pub struct MediaCheckOutput {
@ -51,6 +51,8 @@ where
} }
pub fn check(&mut self) -> Result<MediaCheckOutput> { pub fn check(&mut self) -> Result<MediaCheckOutput> {
self.expire_old_trash()?;
// loop through on-disk files // loop through on-disk files
let mut dirs = vec![]; let mut dirs = vec![];
let mut oversize = vec![]; let mut oversize = vec![];
@ -151,6 +153,35 @@ where
self.progress_updated = now; self.progress_updated = now;
self.fire_progress_cb() self.fire_progress_cb()
} }
fn expire_old_trash(&mut self) -> Result<()> {
let trash = trash_folder(&self.mgr.media_folder)?;
let now = time::SystemTime::now();
for dentry in trash.read_dir()? {
let dentry = dentry?;
self.checked += 1;
if self.checked % 10 == 0 {
self.maybe_fire_progress_cb()?;
}
let meta = dentry.metadata()?;
let elap_secs = now
.duration_since(meta.modified()?)
.map(|d| d.as_secs())
.unwrap_or(0);
if elap_secs >= 7 * 86_400 {
debug!(
"removing {:?} from trash, as 7 days have elapsed",
dentry.path()
);
fs::remove_file(dentry.path())?;
}
}
Ok(())
}
} }
#[cfg(test)] #[cfg(test)]

View file

@ -302,7 +302,7 @@ where
Ok(()) Ok(())
} }
fn trash_folder(media_folder: &Path) -> Result<PathBuf> { pub(super) fn trash_folder(media_folder: &Path) -> Result<PathBuf> {
let trash_folder = media_folder.with_file_name("media.trash"); let trash_folder = media_folder.with_file_name("media.trash");
match fs::create_dir(&trash_folder) { match fs::create_dir(&trash_folder) {
Ok(()) => Ok(trash_folder), Ok(()) => Ok(trash_folder),