use gix_error::ResultExt;
use gix_object::TreeRefIter;
use super::{Action, Change, Platform};
use crate::{Result, Tree};
impl<'old> Platform<'_, 'old> {
pub fn for_each_to_obtain_tree<'new>(
&mut self,
other: &Tree<'new>,
for_each: impl FnMut(Change<'_, 'old, 'new>) -> Result<Action>,
) -> Result<Option<gix_diff::rewrites::Outcome>> {
self.for_each_to_obtain_tree_inner(other, for_each, None)
}
pub fn for_each_to_obtain_tree_with_cache<'new>(
&mut self,
other: &Tree<'new>,
resource_cache: &mut gix_diff::blob::Platform,
for_each: impl FnMut(Change<'_, 'old, 'new>) -> Result<Action>,
) -> Result<Option<gix_diff::rewrites::Outcome>> {
self.for_each_to_obtain_tree_inner(other, for_each, Some(resource_cache))
}
fn for_each_to_obtain_tree_inner<'new>(
&mut self,
other: &Tree<'new>,
mut for_each: impl FnMut(Change<'_, 'old, 'new>) -> Result<Action>,
resource_cache: Option<&mut gix_diff::blob::Platform>,
) -> Result<Option<gix_diff::rewrites::Outcome>> {
let repo = self.lhs.repo;
let mut storage;
let cache = match resource_cache {
None => {
storage = repo.diff_resource_cache(gix_diff::blob::pipeline::Mode::ToGit, Default::default())?;
&mut storage
}
Some(cache) => cache,
};
let opts = self.options.into();
gix_diff::tree_with_rewrites(
TreeRefIter::from_bytes(&self.lhs.data, self.lhs.id.kind()),
TreeRefIter::from_bytes(&other.data, other.id.kind()),
cache,
&mut self.state,
&repo.objects,
|change| for_each(Change::from_change_ref(change, repo, other.repo)),
opts,
)
.or_error()
}
}