//! Copyright (c) 2022-2026 GitDataAi All rights reserved. pub mod find_files; pub mod get_file_metadata; pub mod get_tree; pub mod list_tree; use crate::bare::GitBare; use crate::pb::{self, RecentCommit, object_selector}; pub(crate) fn resolve_revision( sel: &Option, ) -> Result { match sel.as_ref().and_then(|s| s.selector.as_ref()) { Some(object_selector::Selector::Oid(oid)) => { crate::sanitize::validate_oid_hex(&oid.hex)?; Ok(oid.hex.clone()) } Some(object_selector::Selector::Revision(name)) => { crate::sanitize::validate_revision(&name.revision)?; Ok(name.revision.clone()) } None => Ok("HEAD".into()), } } pub(crate) fn recent_commit(gb: &GitBare, revision: &str, path: &str) -> Option { let output = std::process::Command::new("git") .args([ "--git-dir", &gb.bare_dir.to_string_lossy(), "log", "-1", "--format=%H %s %at", revision, "--", path, ]) .output() .ok()?; if !output.status.success() { return None; } let line = String::from_utf8_lossy(&output.stdout).trim().to_string(); if line.is_empty() { return None; } let (hex, rest) = line.split_once(' ')?; let (subject, ts_str) = rest.rsplit_once(' ')?; let ts: i64 = ts_str.parse().ok()?; Some(RecentCommit { oid: Some(gb.oid_to_pb(hex)), subject: subject.to_string(), committed_timestamp: ts, }) } pub(crate) fn is_lfs_pointer(data: &[u8]) -> bool { data.starts_with(b"version https://git-lfs.github.com/spec/v1") }