//! Copyright (c) 2022-2026 GitDataAi All rights reserved. use crate::bare::GitBare; use crate::error::{GitError, GitResult}; use crate::pb::{GetTreeRequest, ListTreeRequest, Tree}; use crate::resolve_revision; impl GitBare { pub fn get_tree(&self, request: GetTreeRequest) -> GitResult { let entries = self.list_tree(ListTreeRequest { repository: request.repository.clone(), revision: request.revision.clone(), path: request.path.clone(), recursive: false, pagination: None, })?; let repo = self.gix_repo()?; let revision = resolve_revision!(request.revision); let root = repo .rev_parse_single(format!("{}^{{tree}}", revision).as_str())? .object()? .try_into_tree() .map_err(|e| GitError::Gix(e.to_string()))?; let tree_hex = if request.path.is_empty() { root.id.to_string() } else { root.lookup_entry_by_path(&request.path)? .ok_or_else(|| GitError::NotFound(request.path.clone()))? .id() .to_string() }; Ok(Tree { oid: Some(self.oid_to_pb(tree_hex)), path: request.path, entries: entries.entries, truncated: false, }) } }