wayver's git archive


a simple self-hosted git server
git clone https://git.wayver.dev/bile

src/utils/git/tree.rs@bd1a8f79badd439ab7a73e193be91ad175aafa67

raw
Date Commit Message Author Files + -
2026-02-17 21:07 initial mvp wayverd 74 10800 0
...

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