From 162313b7bc3147014c56903ffef66dd17af0bdd0 Mon Sep 17 00:00:00 2001 From: mrbeanc Date: Wed, 20 Dec 2023 21:28:55 +0800 Subject: [PATCH] =?UTF-8?q?Index=EF=BC=9A=E5=9C=A8=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E4=B8=AD=E5=AF=B9=E4=BC=A0=E5=85=A5=E7=9A=84?= =?UTF-8?q?path=E8=BF=9B=E8=A1=8C=E9=A2=84=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B7=AF=E5=BE=84=E5=BD=A2=E5=BC=8F=EF=BC=88?= =?UTF-8?q?absolute=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/index.rs | 29 ++++++++++++++++++++--------- src/utils/util.rs | 2 +- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/models/index.rs b/src/models/index.rs index 075d60e..4767497 100644 --- a/src/models/index.rs +++ b/src/models/index.rs @@ -31,7 +31,10 @@ impl FileMetaData { } } -// 索引数据结构 +/** + Index +注意:逻辑处理均为绝对路径,但是存储时为相对路径 + */ #[derive(Serialize, Deserialize, Debug, Default)] pub struct Index { entries: HashMap, @@ -49,8 +52,14 @@ impl Index { return index; } + /// 预处理路径,统一形式为绝对路径 + fn preprocess_path(path: &Path) -> PathBuf { + util::get_absolute_path(&path) + } + // 添加文件 - pub fn add(&mut self, path: PathBuf, data: FileMetaData) { + pub fn add(&mut self, mut path: PathBuf, data: FileMetaData) { + path = Index::preprocess_path(&path); self.entries.insert(path, data); } @@ -61,7 +70,8 @@ impl Index { // 获取文件元数据 fn get(&self, path: &Path) -> Option<&FileMetaData> { - self.entries.get(path) + let path = Index::preprocess_path(path); + self.entries.get(&path) } pub fn get_hash(&self, file: &Path) -> Option { @@ -78,7 +88,8 @@ impl Index { } pub fn contains(&self, path: &Path) -> bool { - self.entries.contains_key(path) + let path = Index::preprocess_path(path); + self.entries.contains_key(&path) } /// 获取所有已删除的文件 @@ -100,7 +111,7 @@ impl Index { && self_data.modified_time == meta.modified().unwrap_or(SystemTime::now()) && self_data.size == meta.len(); - return !same; + !same } else { true } @@ -109,7 +120,8 @@ impl Index { } } - pub fn update(&mut self, path: PathBuf, data: FileMetaData) { + pub fn update(&mut self, mut path: PathBuf, data: FileMetaData) { + path = Index::preprocess_path(&path); self.entries.insert(path, data); } @@ -188,11 +200,10 @@ mod tests { util::setup_test_with_clean_mit(); let mut index = Index::new(); - let path = PathBuf::from(".mit/HEAD"); - let metadata = fs::metadata(".mit/HEAD").unwrap(); + let path = PathBuf::from("../mit_test_storage/.mit/HEAD"); //测试../相对路径的处理 index.add(path.clone(), FileMetaData::new(&Blob::new(&path), &path)); - let path = PathBuf::from("../mit_test_storage/中文路径测试.txt"); + let path = PathBuf::from("中文路径测试.txt"); index.add( path.clone(), FileMetaData::new( diff --git a/src/utils/util.rs b/src/utils/util.rs index 52d07ea..028c816 100644 --- a/src/utils/util.rs +++ b/src/utils/util.rs @@ -178,7 +178,7 @@ pub fn get_absolute_path(path: &Path) -> PathBuf { if path.is_absolute() { path.to_path_buf() } else { - let abs_path = path.canonicalize().unwrap(); + let abs_path = path.canonicalize().unwrap(); //这一步会统一路径分隔符 clean_win_abs_path_pre(abs_path) } }