use std::fs; use std::path::{Path, PathBuf}; /// The [`PathBuf`] which points to a `*.keep` file, which should correspond to /// a packfile. /// /// Upon drop, it attempts to remove the [`PathBuf`] to release the lock on the /// packfile index, allowing it to be garbage collected. #[derive(Clone, Debug)] pub struct Keepfile { path: PathBuf, } impl Keepfile { pub fn new>(path: P) -> Option { let path = path.as_ref(); match path.extension() { Some(ext) if ext == "keep" => Some(Self { path: path.to_path_buf(), }), _ => None, } } } impl Drop for Keepfile { fn drop(&mut self) { if let Err(e) = fs::remove_file(&self.path) { log::warn!("Failed to remove {:?}: {e}", self.path); } } }