From 7edf12c3f46522071d7b163d188b632ba231e2ef Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Wed, 19 Mar 2025 13:51:52 +0700 Subject: upd: tree serialization --- src/object.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/object.rs b/src/object.rs index b42412d..591c540 100644 --- a/src/object.rs +++ b/src/object.rs @@ -163,7 +163,7 @@ struct GitLeaf { sha: String, } -struct GitTree { +pub struct GitTree { records: Vec, } @@ -209,7 +209,7 @@ impl GitTree { } } - fn parse(data: &Vec) -> Self { + pub fn deserialize(data: &Vec) -> Self { let mut records: Vec = Vec::new(); let mut offset: usize = 0; while offset < data.len() { @@ -218,4 +218,31 @@ impl GitTree { } Self { records } } + + fn sort(&mut self) { + self.records.sort_by(|a, b| { + let mut a_path = a.path.clone(); + if PathBuf::from(&a_path).is_dir() { + a_path.push('/'); + } + let mut b_path = b.path.clone(); + if PathBuf::from(&b_path).is_dir() { + b_path.push('/'); + } + a_path.cmp(&b_path) + }) + } + + pub fn serialize(&mut self) -> Vec { + self.sort(); + let mut result: Vec = Vec::new(); + for record in &self.records { + result.extend(record.mode.as_bytes().to_vec()); + result.push(b' '); + result.extend(record.path.as_bytes().to_vec()); + result.push(0); + result.extend(record.sha.as_bytes().to_vec()); + } + result + } } \ No newline at end of file -- cgit v1.2.3-70-g09d2