731 new = true; |
731 new = true; |
732 }; |
732 }; |
733 Ok(new) |
733 Ok(new) |
734 } |
734 } |
735 |
735 |
736 /// It is the responsibility of the caller to know that there was an entry |
736 /// Set a node as untracked in the dirstate. |
737 /// there before. Does not handle the removal of copy source |
737 /// |
|
738 /// It is the responsibility of the caller to remove the copy source and/or |
|
739 /// the entry itself if appropriate. |
|
740 /// |
|
741 /// # Panics |
|
742 /// |
|
743 /// Panics if the node does not exist. |
738 fn set_untracked( |
744 fn set_untracked( |
739 &mut self, |
745 &mut self, |
740 filename: &HgPath, |
746 filename: &HgPath, |
741 old_entry: DirstateEntry, |
747 old_entry: DirstateEntry, |
742 ) -> Result<(), DirstateV2ParseError> { |
748 ) -> Result<(), DirstateV2ParseError> { |
743 let node = self.get_or_insert_node(filename, |ancestor| { |
749 let node = DirstateMap::get_node_mut( |
744 ancestor.tracked_descendants_count = ancestor |
750 self.on_disk, |
745 .tracked_descendants_count |
751 &mut self.unreachable_bytes, |
746 .checked_sub(1) |
752 &mut self.root, |
747 .expect("tracked_descendants_count should be >= 0"); |
753 filename, |
748 })?; |
754 |ancestor| { |
|
755 ancestor.tracked_descendants_count = ancestor |
|
756 .tracked_descendants_count |
|
757 .checked_sub(1) |
|
758 .expect("tracked_descendants_count should be >= 0"); |
|
759 }, |
|
760 )? |
|
761 .expect("node should exist"); |
749 let mut new_entry = old_entry.clone(); |
762 let mut new_entry = old_entry.clone(); |
750 new_entry.set_untracked(); |
763 new_entry.set_untracked(); |
751 node.data = NodeData::Entry(new_entry); |
764 node.data = NodeData::Entry(new_entry); |
752 Ok(()) |
765 Ok(()) |
753 } |
766 } |
754 |
767 |
|
768 /// Set a node as clean in the dirstate. |
|
769 /// |
|
770 /// It is the responsibility of the caller to remove the copy source. |
|
771 /// |
|
772 /// # Panics |
|
773 /// |
|
774 /// Panics if the node does not exist. |
755 fn set_clean( |
775 fn set_clean( |
756 &mut self, |
776 &mut self, |
757 filename: &HgPath, |
777 filename: &HgPath, |
758 old_entry: DirstateEntry, |
778 old_entry: DirstateEntry, |
759 mode: u32, |
779 mode: u32, |
760 size: u32, |
780 size: u32, |
761 mtime: TruncatedTimestamp, |
781 mtime: TruncatedTimestamp, |
762 ) -> Result<(), DirstateError> { |
782 ) -> Result<(), DirstateError> { |
763 let node = self.get_or_insert_node(filename, |ancestor| { |
783 let node = DirstateMap::get_node_mut( |
764 if !old_entry.tracked() { |
784 self.on_disk, |
765 ancestor.tracked_descendants_count += 1; |
785 &mut self.unreachable_bytes, |
766 } |
786 &mut self.root, |
767 })?; |
787 filename, |
|
788 |ancestor| { |
|
789 if !old_entry.tracked() { |
|
790 ancestor.tracked_descendants_count += 1; |
|
791 } |
|
792 }, |
|
793 )? |
|
794 .expect("node should exist"); |
768 let mut new_entry = old_entry.clone(); |
795 let mut new_entry = old_entry.clone(); |
769 new_entry.set_clean(mode, size, mtime); |
796 new_entry.set_clean(mode, size, mtime); |
770 node.data = NodeData::Entry(new_entry); |
797 node.data = NodeData::Entry(new_entry); |
771 Ok(()) |
798 Ok(()) |
772 } |
799 } |
773 |
800 |
|
801 /// Set a node as possibly dirty in the dirstate. |
|
802 /// |
|
803 /// # Panics |
|
804 /// |
|
805 /// Panics if the node does not exist. |
774 fn set_possibly_dirty( |
806 fn set_possibly_dirty( |
775 &mut self, |
807 &mut self, |
776 filename: &HgPath, |
808 filename: &HgPath, |
777 ) -> Result<(), DirstateError> { |
809 ) -> Result<(), DirstateError> { |
778 let node = self.get_or_insert_node(filename, |_ancestor| {})?; |
810 let node = DirstateMap::get_node_mut( |
|
811 self.on_disk, |
|
812 &mut self.unreachable_bytes, |
|
813 &mut self.root, |
|
814 filename, |
|
815 |_ancestor| {}, |
|
816 )? |
|
817 .expect("node should exist"); |
779 let entry = node.data.as_entry_mut().expect("entry should exist"); |
818 let entry = node.data.as_entry_mut().expect("entry should exist"); |
780 entry.set_possibly_dirty(); |
819 entry.set_possibly_dirty(); |
781 node.data = NodeData::Entry(*entry); |
820 node.data = NodeData::Entry(*entry); |
782 Ok(()) |
821 Ok(()) |
783 } |
822 } |