完善add逻辑

This commit is contained in:
mrbeanc
2023-12-19 23:53:12 +08:00
parent 6616e98109
commit 6780be2e02
4 changed files with 49 additions and 18 deletions

View File

@@ -15,10 +15,13 @@ pub struct Blob {
}
impl Blob {
/// 从源文件新建blob对象并直接保存到/objects/中
pub fn new(file: &Path) -> Blob {
let data = fs::read_to_string(file).unwrap();
let hash = calc_hash(&data);
Blob { hash, data }
let blob = Blob { hash, data };
blob.save();
blob
}
pub fn load(hash: &String) -> Blob {
@@ -32,7 +35,10 @@ impl Blob {
pub fn save(&self) {
let s = Store::new();
s.save(&self.data);
if !s.contains(&self.hash) {
let hash = s.save(&self.data);
assert_eq!(hash, self.hash);
}
}
pub fn get_hash(&self) -> String {

View File

@@ -3,8 +3,9 @@ use std::fs;
use std::path::{Path, PathBuf};
use std::time::SystemTime;
use serde::{Deserialize, Serialize};
use crate::models::blob::Blob;
use crate::models::object::Hash;
use crate::utils::util::get_working_dir;
use crate::utils::util::{get_file_mode, get_working_dir};
// 文件元数据结构
#[derive(Serialize, Deserialize, Debug, Clone)]
@@ -16,6 +17,19 @@ pub struct FileMetaData {
pub mode: String, // 文件模式
}
impl FileMetaData {
pub fn new(blob: &Blob, file: &Path) -> FileMetaData {
let meta = file.metadata().unwrap();
FileMetaData {
hash: blob.get_hash(),
size: meta.len(),
created_time: meta.created().unwrap(),
modified_time: meta.modified().unwrap(),
mode: get_file_mode(file)
}
}
}
// 索引数据结构
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct Index {
@@ -69,12 +83,16 @@ impl Index {
files
}
pub fn update(&mut self, path: PathBuf, data: FileMetaData) {
self.entries.insert(path, data);
}
fn load(&mut self) {
}
/// 二进制序列化
fn save(&self) { //要先转化为相对路径
pub fn save(&self) { //要先转化为相对路径
let ser = serde_json::to_string(&self).unwrap();
println!("{}", ser);
}
@@ -97,8 +115,9 @@ mod tests {
#[test]
fn test_save(){
util::setup_test_with_mit();
let mut index = Index::new();
let metadata = fs::metadata(".gitignore").unwrap();
let metadata = fs::metadata("../.gitignore").unwrap();
let file_meta_data = FileMetaData {
hash: "123".to_string(),
size: metadata.len(),