use gix::object::tree::EntryKind; use crate::bare::GitBare; use crate::error::{GitError, GitResult}; use crate::pb::{FileMetadata, GetFileMetadataRequest, ObjectType}; use crate::resolve_revision; use crate::tree; impl GitBare { pub fn get_file_metadata(&self, request: GetFileMetadataRequest) -> GitResult { crate::sanitize::validate_file_path(&request.path)?; let repo = self.gix_repo()?; let revision = resolve_revision!(request.revision); let tree = repo .rev_parse_single(format!("{}^{{tree}}", revision).as_str())? .object()? .try_into_tree() .map_err(|e| GitError::Gix(e.to_string()))?; let entry = tree .lookup_entry_by_path(&request.path)? .ok_or_else(|| GitError::NotFound(request.path.clone()))?; let hex = entry.id().to_string(); let kind = match entry.mode().kind() { EntryKind::Tree => ObjectType::Tree, EntryKind::Commit => ObjectType::Commit, _ => ObjectType::Blob, } as i32; let rc = tree::recent_commit(self, &revision, &request.path); Ok(FileMetadata { path: request.path, oid: Some(self.oid_to_pb(hex)), mode: u32::from_str_radix(&format!("{:o}", entry.mode()), 8).unwrap_or(0), size: 0, r#type: kind, binary: false, is_lfs: false, recent_commit: rc, }) } }