use crate::bstr::BStr; use crate::types::AttributeStack; use crate::Repository; use gix_odb::FindExt; use std::ops::{Deref, DerefMut}; /// Lifecycle impl<'repo> AttributeStack<'repo> { /// Create a new instance from a `repo` and the underlying pre-configured `stack`. /// /// Note that this type is typically created by [`Repository::attributes()`] or [`Repository::attributes_only()`]. pub fn new(stack: gix_worktree::Stack, repo: &'repo Repository) -> Self { AttributeStack { repo, inner: stack } } /// Detach the repository and return the underlying plumbing datatype. pub fn detach(self) -> gix_worktree::Stack { self.inner } } impl Deref for AttributeStack<'_> { type Target = gix_worktree::Stack; fn deref(&self) -> &Self::Target { &self.inner } } impl DerefMut for AttributeStack<'_> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } } /// Platform retrieval impl<'repo> AttributeStack<'repo> { /// Append the `relative` path to the root directory of the cache and efficiently create leading directories, while assuring that no /// symlinks are in that path. /// Unless `is_dir` is known with `Some(…)`, then `relative` points to a directory itself in which case the entire resulting /// path is created as directory. If it's not known it is assumed to be a file. /// /// Provide access to cached information for that `relative` path via the returned platform. pub fn at_path( &mut self, relative: impl AsRef, is_dir: Option, ) -> std::io::Result> { self.inner .at_path(relative, is_dir, |id, buf| self.repo.objects.find_blob(id, buf)) } /// Obtain a platform for lookups from a repo-`relative` path, typically obtained from an index entry. `is_dir` should reflect /// whether it's a directory or not, or left at `None` if unknown. /// /// If `relative` ends with `/` and `is_dir` is `None`, it is automatically assumed to be a directory. /// /// ### Panics /// /// - on illformed UTF8 in `relative` pub fn at_entry<'r>( &mut self, relative: impl Into<&'r BStr>, is_dir: Option, ) -> std::io::Result> { self.inner .at_entry(relative, is_dir, |id, buf| self.repo.objects.find_blob(id, buf)) } }