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