diff --git a/packages/tauri/src/gb_repository/repository.rs b/packages/tauri/src/gb_repository/repository.rs index 169f1799d..3af880528 100644 --- a/packages/tauri/src/gb_repository/repository.rs +++ b/packages/tauri/src/gb_repository/repository.rs @@ -626,7 +626,7 @@ fn build_wd_tree( .find_reference("refs/heads/current") { Result::Ok(reference) => { - // build the working directory tree from the current commit + // re-use the last tree as a base to copy non changed entries let tree = reference.peel_to_tree()?; let wd_tree_entry = tree.get_name("wd").unwrap(); let wd_tree = gb_repository.git_repository.find_tree(wd_tree_entry.id())?; @@ -637,7 +637,7 @@ fn build_wd_tree( .list_files(&path::PathBuf::from(".")) .context("failed to read session wd files")?; - // the session files on top of it + // write the session files on top of the last tree for file_path in &session_wd_files { let abs_path = gb_repository.session_wd_path().join(file_path); let metadata = abs_path.metadata().with_context(|| { @@ -698,12 +698,12 @@ fn build_wd_tree( })?; } - // remove deleted files from the index + // remove deleted files from the last tree wd_tree.walk(git2::TreeWalkMode::PreOrder, |root, entry| { if let Some(name) = &entry.name() { - let full_path = path::Path::new(root).join(name); - let exists = session_wd_files.contains(&full_path); - if !exists && index.remove_path(&full_path).is_err() { + let rel_path = path::Path::new(root).join(name); + let full_path = project_repository.path().join(&rel_path); + if !full_path.exists() && index.remove_path(&rel_path).is_err() { return TreeWalkResult::Abort; } } diff --git a/packages/tauri/src/watcher/handlers/project_file_change.rs b/packages/tauri/src/watcher/handlers/project_file_change.rs index 3f3530cbd..68e9f06b2 100644 --- a/packages/tauri/src/watcher/handlers/project_file_change.rs +++ b/packages/tauri/src/watcher/handlers/project_file_change.rs @@ -423,6 +423,35 @@ mod test { Ok(()) } + #[test] + fn test_register_no_changes_saved_thgoughout_flushes() -> Result<()> { + let suite = Suite::default(); + let Case { + gb_repository, + project_repository, + project, + .. + } = suite.new_case(); + let listener = Handler::from(&suite.local_app_data); + + // file change, wd and deltas are written + std::fs::write(project.path.join("test.txt"), "test")?; + listener.handle("test.txt", &project.id)?; + + // make two more sessions. + gb_repository.flush(&project_repository, None)?; + gb_repository.get_or_create_current_session()?; + gb_repository.flush(&project_repository, None)?; + + // after some sessions, files from the first change are still there. + let session = gb_repository.get_or_create_current_session()?; + let session_reader = sessions::Reader::open(&gb_repository, &session)?; + let files = session_reader.files(None)?; + assert_eq!(files.len(), 1); + + Ok(()) + } + #[test] fn test_register_new_file_twice() -> Result<()> { let suite = Suite::default();