From a859678240a802b37597333d8d1a590a0261177d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj?= Date: Wed, 24 Dec 2025 00:15:28 +0100 Subject: [PATCH 1/2] fix restore --- engine/src/handlers/restore/handlers.rs | 12 ++++++++---- engine/src/index/working_dir.rs | 2 +- engine/src/traversal/meva_commit_tree_walker.rs | 8 ++++---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/engine/src/handlers/restore/handlers.rs b/engine/src/handlers/restore/handlers.rs index 9c974cef..514ed1ad 100644 --- a/engine/src/handlers/restore/handlers.rs +++ b/engine/src/handlers/restore/handlers.rs @@ -10,6 +10,7 @@ use std::fs; use std::io::Write; use std::path::{Path, PathBuf}; use std::sync::{Arc, RwLock}; +use path_absolutize::Absolutize; /// Handles the `meva restore` command execution flow. /// @@ -134,6 +135,8 @@ impl RestoreHandler { Self::build_index_entries_to_add(&source_files_map, &index_entries_map)?; let index_entries_to_remove = Self::build_index_entries_to_remove(&index_entries_map, &source_files_map); + + drop(index_read_guard); let mut index_write_guard = self.index.write().unwrap(); index_write_guard.insert_entries(index_entries_to_add); @@ -152,10 +155,11 @@ impl RestoreHandler { .working_dir .collect_files(path, false) .into_iter() - .map(|(entry_path, _)| { - entry_path - .strip_base(&self.working_dir.layout().working_dir()) - .to_path_buf() + .filter_map(|(entry_path, _)| { + entry_path.absolutize().map(|path|{ + path.strip_base(&self.working_dir.layout().working_dir()) + .to_path_buf() + }).ok() }) .collect(); workdir_files.extend(collected_files); diff --git a/engine/src/index/working_dir.rs b/engine/src/index/working_dir.rs index 359ca565..a704b605 100644 --- a/engine/src/index/working_dir.rs +++ b/engine/src/index/working_dir.rs @@ -65,7 +65,7 @@ pub trait WorkingDir: Send + Sync { /// # Returns /// /// A vector of tuples of type `(PathBuf, bool)`: - /// - `PathBuf`: the absolute file path. + /// - `PathBuf`: file path. /// - `bool`: whether the file is ignored (`true` if ignored). fn collect_files(&self, path: &Path, include_ignored: bool) -> Vec<(PathBuf, bool)>; diff --git a/engine/src/traversal/meva_commit_tree_walker.rs b/engine/src/traversal/meva_commit_tree_walker.rs index e0d618c3..57376cde 100644 --- a/engine/src/traversal/meva_commit_tree_walker.rs +++ b/engine/src/traversal/meva_commit_tree_walker.rs @@ -2,8 +2,8 @@ use super::CommitTreeWalker; use crate::errors::EngineResult; use crate::object_storage::ObjectStorage; use crate::objects::{MevaBlob, MevaCommit, MevaTree, ObjectEntry, TreeEntry, TreeEntryType}; -use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::{path::{Path, PathBuf}, sync::Arc}; +use shared::IsWithin; /// A concrete implementation of [`CommitTreeWalker`] for traversing commits /// stored in a local Meva object database. @@ -38,7 +38,7 @@ impl MevaCommitTreeWalker { match path_filter { Some(filters) => filters .iter() - .any(|f| f.starts_with(entry_path) || entry_path.starts_with(f)), + .any(|f| f.is_within(entry_path).unwrap_or(false) || entry_path.is_within(f).unwrap_or(false)), None => true, } } @@ -49,7 +49,7 @@ impl MevaCommitTreeWalker { /// should be **included** in the traversal result. fn matches_entry(&self, entry_path: &Path, path_filter: Option<&[PathBuf]>) -> bool { match path_filter { - Some(filters) => filters.iter().any(|f| entry_path.starts_with(f)), + Some(filters) => filters.iter().any(|f| entry_path.is_within(f).unwrap_or(false)), None => true, } } From e671f36a6702d2f15f744481b1b023887a33f577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj?= Date: Sun, 28 Dec 2025 14:59:46 +0100 Subject: [PATCH 2/2] fix format --- engine/src/handlers/restore/handlers.rs | 15 +++++++++------ engine/src/traversal/meva_commit_tree_walker.rs | 15 ++++++++++----- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/engine/src/handlers/restore/handlers.rs b/engine/src/handlers/restore/handlers.rs index 514ed1ad..d4f199cc 100644 --- a/engine/src/handlers/restore/handlers.rs +++ b/engine/src/handlers/restore/handlers.rs @@ -4,13 +4,13 @@ use crate::index::{FileMode, index_entry::IndexEntry, stage::Stage}; use crate::objects::{MevaBlob, MevaObject, ObjectEntry}; use crate::{CommitTreeWalker, Index, ObjectStorage, RevisionResolver, WorkingDir}; use chrono::Utc; +use path_absolutize::Absolutize; use shared::{PathToString, StripBase}; use std::collections::{HashMap, HashSet}; use std::fs; use std::io::Write; use std::path::{Path, PathBuf}; use std::sync::{Arc, RwLock}; -use path_absolutize::Absolutize; /// Handles the `meva restore` command execution flow. /// @@ -135,7 +135,7 @@ impl RestoreHandler { Self::build_index_entries_to_add(&source_files_map, &index_entries_map)?; let index_entries_to_remove = Self::build_index_entries_to_remove(&index_entries_map, &source_files_map); - + drop(index_read_guard); let mut index_write_guard = self.index.write().unwrap(); @@ -156,10 +156,13 @@ impl RestoreHandler { .collect_files(path, false) .into_iter() .filter_map(|(entry_path, _)| { - entry_path.absolutize().map(|path|{ - path.strip_base(&self.working_dir.layout().working_dir()) - .to_path_buf() - }).ok() + entry_path + .absolutize() + .map(|path| { + path.strip_base(&self.working_dir.layout().working_dir()) + .to_path_buf() + }) + .ok() }) .collect(); workdir_files.extend(collected_files); diff --git a/engine/src/traversal/meva_commit_tree_walker.rs b/engine/src/traversal/meva_commit_tree_walker.rs index 57376cde..48c071c5 100644 --- a/engine/src/traversal/meva_commit_tree_walker.rs +++ b/engine/src/traversal/meva_commit_tree_walker.rs @@ -2,8 +2,11 @@ use super::CommitTreeWalker; use crate::errors::EngineResult; use crate::object_storage::ObjectStorage; use crate::objects::{MevaBlob, MevaCommit, MevaTree, ObjectEntry, TreeEntry, TreeEntryType}; -use std::{path::{Path, PathBuf}, sync::Arc}; use shared::IsWithin; +use std::{ + path::{Path, PathBuf}, + sync::Arc, +}; /// A concrete implementation of [`CommitTreeWalker`] for traversing commits /// stored in a local Meva object database. @@ -36,9 +39,9 @@ impl MevaCommitTreeWalker { /// - The current entry path **starts with** or **is a prefix of** any of the filters. fn should_traverse(&self, entry_path: &Path, path_filter: Option<&[PathBuf]>) -> bool { match path_filter { - Some(filters) => filters - .iter() - .any(|f| f.is_within(entry_path).unwrap_or(false) || entry_path.is_within(f).unwrap_or(false)), + Some(filters) => filters.iter().any(|f| { + f.is_within(entry_path).unwrap_or(false) || entry_path.is_within(f).unwrap_or(false) + }), None => true, } } @@ -49,7 +52,9 @@ impl MevaCommitTreeWalker { /// should be **included** in the traversal result. fn matches_entry(&self, entry_path: &Path, path_filter: Option<&[PathBuf]>) -> bool { match path_filter { - Some(filters) => filters.iter().any(|f| entry_path.is_within(f).unwrap_or(false)), + Some(filters) => filters + .iter() + .any(|f| entry_path.is_within(f).unwrap_or(false)), None => true, } }