use tempfile::TempDir; /// A [`gix::Repository`] backed by a temporary directory that is removed on drop. Derefs to /// `gix::Repository`, so it is used just like one; keeping it alive keeps the scratch dir alive. pub struct TempRepository { repo: gix::Repository, // Declared AFTER `repo` so `repo` drops first: any file handles into the scratch dir close // before the dir itself is removed (Rust drops struct fields in declaration order). _dir: TempDir, } impl TempRepository { pub fn open(dir: TempDir) -> Result { let repo = gix::open(dir.path())?; Ok(Self { repo, _dir: dir }) } #[allow(dead_code)] pub fn with_object_memory(mut self) -> Self { self.repo.objects.enable_object_memory(); self } } impl std::ops::Deref for TempRepository { type Target = gix::Repository; fn deref(&self) -> &gix::Repository { &self.repo } }