comparison rust/hg-core/src/dirstate_tree/dirstate_map.rs @ 47511:eaae39894312

dirstate: move most of the `remove` logic with dirstatemap `removefile` This code deal with special logic to preserving "merged" and "from_p2" information when removing a file. These are implementation details that are more suitable for the dirstatemap layer. Since the dirstatemap layer alreaday have most of the information necessary to do so, the move is easy. This move helps us to encapsulate more implementation details within the dirstatemap and its entry. Easing the use of a different storage for dirstate v2. Differential Revision: https://phab.mercurial-scm.org/D10953
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sat, 03 Jul 2021 19:52:00 +0200
parents ca8121d26732
children abed645b8e96
comparison
equal deleted inserted replaced
47510:94c58f3aab56 47511:eaae39894312
9 use super::path_with_basename::WithBasename; 9 use super::path_with_basename::WithBasename;
10 use crate::dirstate::parsers::pack_entry; 10 use crate::dirstate::parsers::pack_entry;
11 use crate::dirstate::parsers::packed_entry_size; 11 use crate::dirstate::parsers::packed_entry_size;
12 use crate::dirstate::parsers::parse_dirstate_entries; 12 use crate::dirstate::parsers::parse_dirstate_entries;
13 use crate::dirstate::parsers::Timestamp; 13 use crate::dirstate::parsers::Timestamp;
14 use crate::dirstate::SIZE_FROM_OTHER_PARENT;
15 use crate::dirstate::SIZE_NON_NORMAL;
14 use crate::matchers::Matcher; 16 use crate::matchers::Matcher;
15 use crate::utils::hg_path::{HgPath, HgPathBuf}; 17 use crate::utils::hg_path::{HgPath, HgPathBuf};
16 use crate::CopyMapIter; 18 use crate::CopyMapIter;
17 use crate::DirstateEntry; 19 use crate::DirstateEntry;
18 use crate::DirstateError; 20 use crate::DirstateError;
724 } 726 }
725 727
726 fn remove_file( 728 fn remove_file(
727 &mut self, 729 &mut self,
728 filename: &HgPath, 730 filename: &HgPath,
729 old_state: EntryState, 731 in_merge: bool,
730 size: i32,
731 ) -> Result<(), DirstateError> { 732 ) -> Result<(), DirstateError> {
733 let old_entry_opt = self.get(filename)?;
734 let old_state = match old_entry_opt {
735 Some(e) => e.state,
736 None => EntryState::Unknown,
737 };
738 let mut size = 0;
739 if in_merge {
740 // XXX we should not be able to have 'm' state and 'FROM_P2' if not
741 // during a merge. So I (marmoute) am not sure we need the
742 // conditionnal at all. Adding double checking this with assert
743 // would be nice.
744 if let Some(old_entry) = old_entry_opt {
745 // backup the previous state
746 if old_entry.state == EntryState::Merged {
747 size = SIZE_NON_NORMAL;
748 } else if old_entry.state == EntryState::Normal
749 && old_entry.size == SIZE_FROM_OTHER_PARENT
750 {
751 // other parent
752 size = SIZE_FROM_OTHER_PARENT;
753 }
754 }
755 }
756 if size == 0 {
757 self.copy_map_remove(filename)?;
758 }
732 let entry = DirstateEntry { 759 let entry = DirstateEntry {
733 state: EntryState::Removed, 760 state: EntryState::Removed,
734 mode: 0, 761 mode: 0,
735 size, 762 size,
736 mtime: 0, 763 mtime: 0,