From 9f129580b53a11d7f0f2d10d3c62e4f3a596fd35 Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Wed, 19 Mar 2025 03:00:37 +0700 Subject: upd: git tree with parsing. not tested yet --- src/object.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'src/object.rs') diff --git a/src/object.rs b/src/object.rs index f7b1108..b42412d 100644 --- a/src/object.rs +++ b/src/object.rs @@ -155,4 +155,67 @@ impl Display for GitCommit { write!(f, "{}", self.message)?; Ok(()) } +} + +struct GitLeaf { + mode: String, + path: String, + sha: String, +} + +struct GitTree { + records: Vec, +} + +impl GitTree { + pub fn new() -> Self { + Self { records: Vec::new() } + } + + fn parse_leaf(record: &[u8], offset: &mut usize) -> GitLeaf { + // wacky + let space_idx = record.iter().position(|&b| b == b' '); + if space_idx.is_none() { + die!("Malformed tree"); + } + let mode_vec = record[..space_idx.unwrap()].to_vec(); + let mode = String::from_utf8(mode_vec); + if mode.is_err() { die!("Malformed tree") } + *offset += space_idx.unwrap(); + + let record = &record[space_idx.unwrap() + 1..]; + let zero_byte_idx = record.iter().position(|&b| b == 0); + if zero_byte_idx.is_none() { + die!("Malformed tree"); + } + let path_vec = record[..zero_byte_idx.unwrap()].to_vec(); + let path = String::from_utf8(path_vec); + if path.is_err() { die!("Malformed tree") } + *offset += zero_byte_idx.unwrap(); + + let record = &record[zero_byte_idx.unwrap() + 1..]; + if record.len() < 20 { + die!("Malformed tree"); + } + *offset += 21; + + let sha = String::from_utf8(record.to_vec()); + if sha.is_err() { die!("Malformed tree") } + + GitLeaf { + mode: mode.unwrap(), + path: path.unwrap(), + sha: sha.unwrap(), + } + } + + fn parse(data: &Vec) -> Self { + let mut records: Vec = Vec::new(); + let mut offset: usize = 0; + while offset < data.len() { + let leaf = Self::parse_leaf(&data[offset..], &mut offset); + records.push(leaf); + } + Self { records } + } } \ No newline at end of file -- cgit v1.2.3-70-g09d2