raw
1use std::path::Path;
2
3use anyhow::Context as _;
4use git2::{Blob, Object, Tree};
5
6use crate::{error::Result, git::Repository};
7
8impl Repository {
9 #[tracing::instrument(skip_all)]
10 pub(crate) fn tree_blob(&self, tree: &Tree<'_>, path: &Path) -> Result<Option<Blob<'_>>> {
11 let Some(obj) = self.tree_object(tree, path)? else {
12 return Ok(None);
13 };
14
15 let blob = obj.peel_to_blob()?;
16
17 Ok(Some(blob))
18 }
19
20 #[tracing::instrument(skip_all)]
21 pub(crate) fn tree_object(&self, tree: &Tree<'_>, path: &Path) -> Result<Option<Object<'_>>> {
22 let entry = match tree
23 .get_path(path)
24 .context("failed to get object from tree")
25 {
26 Ok(entry) => entry,
27 Err(err) => {
28 tracing::error!(err=?err, "failed to get object from tree");
29 return Ok(None);
30 }
31 };
32
33 let obj = entry.to_object(&self.inner)?;
34
35 Ok(Some(obj))
36 }
37}
38