mirror of
https://github.com/ankitects/anki.git
synced 2025-09-23 16:26:40 -04:00
don't clean up the trash folder automatically
The media check now reports if any files are in the trash folder, and a method has been exposed to clear the trash.
This commit is contained in:
parent
67d6b4f713
commit
255d6f8af7
2 changed files with 57 additions and 22 deletions
|
@ -1,5 +1,12 @@
|
||||||
## Shown at the top of the media check screen
|
## Shown at the top of the media check screen
|
||||||
|
|
||||||
|
# the number of files, and the total space used by files
|
||||||
|
# that have been moved to the trash folder. eg,
|
||||||
|
# "Trash folder: 3 files, 3.47MB"
|
||||||
|
media-check-trash-count = Trash folder: { $count ->
|
||||||
|
[one] 1 file, {$megs}MB
|
||||||
|
*[other] {$count} files, {$megs}MB
|
||||||
|
}
|
||||||
media-check-missing-count = Missing files: {$count}
|
media-check-missing-count = Missing files: {$count}
|
||||||
media-check-unused-count = Unused files: {$count}
|
media-check-unused-count = Unused files: {$count}
|
||||||
media-check-renamed-count = Renamed files: {$count}
|
media-check-renamed-count = Renamed files: {$count}
|
||||||
|
|
|
@ -11,14 +11,14 @@ use crate::media::col::{
|
||||||
};
|
};
|
||||||
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, trash_folder, MEDIA_SYNC_FILESIZE_LIMIT,
|
data_for_file, filename_if_normalized, trash_folder, MEDIA_SYNC_FILESIZE_LIMIT,
|
||||||
};
|
};
|
||||||
use crate::text::{normalize_to_nfc, MediaRef};
|
use crate::text::{normalize_to_nfc, MediaRef};
|
||||||
use crate::{media::MediaManager, text::extract_media_refs};
|
use crate::{media::MediaManager, text::extract_media_refs};
|
||||||
use coarsetime::Instant;
|
use coarsetime::Instant;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::{borrow::Cow, fs, time};
|
use std::{borrow::Cow, fs};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct MediaCheckOutput {
|
pub struct MediaCheckOutput {
|
||||||
|
@ -27,6 +27,8 @@ pub struct MediaCheckOutput {
|
||||||
pub renamed: HashMap<String, String>,
|
pub renamed: HashMap<String, String>,
|
||||||
pub dirs: Vec<String>,
|
pub dirs: Vec<String>,
|
||||||
pub oversize: Vec<String>,
|
pub oversize: Vec<String>,
|
||||||
|
pub trash_count: u64,
|
||||||
|
pub trash_bytes: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Default)]
|
#[derive(Debug, PartialEq, Default)]
|
||||||
|
@ -73,19 +75,20 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn check(&mut self) -> Result<MediaCheckOutput> {
|
pub fn check(&mut self) -> Result<MediaCheckOutput> {
|
||||||
self.expire_old_trash()?;
|
|
||||||
|
|
||||||
let mut ctx = self.mgr.dbctx();
|
let mut ctx = self.mgr.dbctx();
|
||||||
|
|
||||||
let folder_check = self.check_media_folder(&mut ctx)?;
|
let folder_check = self.check_media_folder(&mut ctx)?;
|
||||||
let referenced_files = self.check_media_references(&folder_check.renamed)?;
|
let referenced_files = self.check_media_references(&folder_check.renamed)?;
|
||||||
let (unused, missing) = find_unused_and_missing(folder_check.files, referenced_files);
|
let (unused, missing) = find_unused_and_missing(folder_check.files, referenced_files);
|
||||||
|
let (trash_count, trash_bytes) = self.files_in_trash()?;
|
||||||
Ok(MediaCheckOutput {
|
Ok(MediaCheckOutput {
|
||||||
unused,
|
unused,
|
||||||
missing,
|
missing,
|
||||||
renamed: folder_check.renamed,
|
renamed: folder_check.renamed,
|
||||||
dirs: folder_check.dirs,
|
dirs: folder_check.dirs,
|
||||||
oversize: folder_check.oversize,
|
oversize: folder_check.oversize,
|
||||||
|
trash_count,
|
||||||
|
trash_bytes,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +97,15 @@ where
|
||||||
let i = &self.i18n;
|
let i = &self.i18n;
|
||||||
|
|
||||||
// top summary area
|
// top summary area
|
||||||
|
if output.trash_count > 0 {
|
||||||
|
let megs = (output.trash_bytes as f32) / 1024.0 / 1024.0;
|
||||||
|
buf += &i.trn(
|
||||||
|
FString::MediaCheckTrashCount,
|
||||||
|
tr_args!["count"=>output.trash_count, "megs"=>megs],
|
||||||
|
);
|
||||||
|
buf.push('\n');
|
||||||
|
}
|
||||||
|
|
||||||
buf += &i.trn(
|
buf += &i.trn(
|
||||||
FString::MediaCheckMissingCount,
|
FString::MediaCheckMissingCount,
|
||||||
tr_args!["count"=>output.missing.len()],
|
tr_args!["count"=>output.missing.len()],
|
||||||
|
@ -264,8 +276,9 @@ where
|
||||||
debug!(self.log, "renamed"; "from"=>disk_fname, "to"=>&fname.as_ref());
|
debug!(self.log, "renamed"; "from"=>disk_fname, "to"=>&fname.as_ref());
|
||||||
assert_ne!(fname.as_ref(), disk_fname);
|
assert_ne!(fname.as_ref(), disk_fname);
|
||||||
|
|
||||||
// move the originally named file to the trash
|
// remove the original file
|
||||||
remove_files(&self.mgr.media_folder, &[disk_fname])?;
|
let path = &self.mgr.media_folder.join(disk_fname);
|
||||||
|
fs::remove_file(path)?;
|
||||||
|
|
||||||
Ok((fname, true))
|
Ok((fname, true))
|
||||||
}
|
}
|
||||||
|
@ -287,9 +300,11 @@ where
|
||||||
self.fire_progress_cb()
|
self.fire_progress_cb()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expire_old_trash(&mut self) -> Result<()> {
|
/// Returns the count and total size of the files in the trash folder
|
||||||
|
fn files_in_trash(&mut self) -> Result<(u64, u64)> {
|
||||||
let trash = trash_folder(&self.mgr.media_folder)?;
|
let trash = trash_folder(&self.mgr.media_folder)?;
|
||||||
let now = time::SystemTime::now();
|
let mut total_files = 0;
|
||||||
|
let mut total_bytes = 0;
|
||||||
|
|
||||||
for dentry in trash.read_dir()? {
|
for dentry in trash.read_dir()? {
|
||||||
let dentry = dentry?;
|
let dentry = dentry?;
|
||||||
|
@ -300,18 +315,25 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
let meta = dentry.metadata()?;
|
let meta = dentry.metadata()?;
|
||||||
let elap_secs = now
|
total_files += 1;
|
||||||
.duration_since(meta.modified()?)
|
total_bytes += meta.len();
|
||||||
.map(|d| d.as_secs())
|
|
||||||
.unwrap_or(0);
|
|
||||||
if elap_secs >= 7 * 86_400 {
|
|
||||||
debug!(
|
|
||||||
self.log,
|
|
||||||
"removing {:?} from trash, as 7 days have elapsed",
|
|
||||||
dentry.path()
|
|
||||||
);
|
|
||||||
fs::remove_file(dentry.path())?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok((total_files, total_bytes))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn empty_trash(&mut self) -> Result<()> {
|
||||||
|
let trash = trash_folder(&self.mgr.media_folder)?;
|
||||||
|
|
||||||
|
for dentry in trash.read_dir()? {
|
||||||
|
let dentry = dentry?;
|
||||||
|
|
||||||
|
self.checked += 1;
|
||||||
|
if self.checked % 10 == 0 {
|
||||||
|
self.maybe_fire_progress_cb()?;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::remove_file(dentry.path())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -495,7 +517,9 @@ mod test {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.collect(),
|
.collect(),
|
||||||
dirs: vec!["folder".to_string()],
|
dirs: vec!["folder".to_string()],
|
||||||
oversize: vec![]
|
oversize: vec![],
|
||||||
|
trash_count: 0,
|
||||||
|
trash_bytes: 0
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -550,7 +574,9 @@ Unused: unused.jpg
|
||||||
missing: vec!["foo[.jpg".into(), "normal.jpg".into()],
|
missing: vec!["foo[.jpg".into(), "normal.jpg".into()],
|
||||||
renamed: Default::default(),
|
renamed: Default::default(),
|
||||||
dirs: vec![],
|
dirs: vec![],
|
||||||
oversize: vec![]
|
oversize: vec![],
|
||||||
|
trash_count: 0,
|
||||||
|
trash_bytes: 0
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert!(fs::metadata(&mgr.media_folder.join("ぱぱ.jpg")).is_ok());
|
assert!(fs::metadata(&mgr.media_folder.join("ぱぱ.jpg")).is_ok());
|
||||||
|
@ -565,7 +591,9 @@ Unused: unused.jpg
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.collect(),
|
.collect(),
|
||||||
dirs: vec![],
|
dirs: vec![],
|
||||||
oversize: vec![]
|
oversize: vec![],
|
||||||
|
trash_count: 0,
|
||||||
|
trash_bytes: 0
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert!(fs::metadata(&mgr.media_folder.join("ぱぱ.jpg")).is_err());
|
assert!(fs::metadata(&mgr.media_folder.join("ぱぱ.jpg")).is_err());
|
||||||
|
|
Loading…
Reference in a new issue