summaryrefslogtreecommitdiff
path: root/src/object.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/object.rs')
-rw-r--r--src/object.rs52
1 files changed, 8 insertions, 44 deletions
diff --git a/src/object.rs b/src/object.rs
index 11a7717..aa5f434 100644
--- a/src/object.rs
+++ b/src/object.rs
@@ -5,9 +5,12 @@ use flate2::read::{ZlibDecoder, ZlibEncoder};
use std::fs::File;
use std::io::{BufReader, Read, Write};
use std::path::PathBuf;
+use derive_is_enum_variant::is_enum_variant;
use flate2::Compression;
use sha1::{Digest, Sha1};
+use crate::utilities::deserialize_kv_with_message;
+#[derive(is_enum_variant)]
pub enum GitObjectType {
Blob,
Commit,
@@ -129,50 +132,11 @@ impl GitCommit {
}
}
- fn deserialize(data: &Vec<u8>) -> Self {
- let string_rep = String::from_utf8(data.clone());
- if string_rep.is_err() {
- die!("Failed to parse commit data");
- }
- let string_rep = string_rep.unwrap();
- let mut is_message = false;
- let mut header: HashMap<String, String> = HashMap::new();
- let mut message = String::new();
- let mut last_key: Option<String> = None;
- for line in string_rep.lines() {
- if is_message {
- message.push_str(format!("\n{}", line).as_str());
- continue;
- }
-
- if line == "" {
- is_message = true;
- continue;
- }
-
- if line.starts_with(" ") && last_key.is_some() {
- let key = last_key.clone().unwrap();
- match header.get(&key) {
- Some(val) => {
- let mut new_val = val.clone();
- new_val.push_str(format!("\n{}", line).as_str());
- header.insert(key, new_val);
- }
- None => {
- header.insert(key, line.to_string());
- }
- }
- } else {
- let mut line_iter = line.splitn(2, ' ');
- let key = line_iter.next().unwrap();
- let val = line_iter.next().unwrap();
- header.insert(key.to_string(), val.to_string());
- last_key = Some(key.to_string());
- }
- }
- Self {
- header,
- message,
+ pub fn from_git_object(git_object: GitObject) -> Self {
+ if !git_object.object_type.is_commit() {
+ die!("Could not create commit object");
}
+ let (header, message) = deserialize_kv_with_message(&git_object.data);
+ Self { header, message }
}
} \ No newline at end of file