Mercurial > public > mercurial-scm > hg-stable
comparison rust/hg-core/src/dirstate_tree/status.rs @ 47339:0252600fd1cf
dirstate-tree: Downgrade `&mut Node` to `&Node` in status and serialization
Mutable access is not used, and upcoming changes will make it more costly
(with copy-on-write nodes that can be read from disk representation)
Differential Revision: https://phab.mercurial-scm.org/D10745
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Wed, 19 May 2021 13:15:00 +0200 |
parents | ce41ee53263f |
children | 69530e5d4fe5 |
comparison
equal
deleted
inserted
replaced
47338:73f23e7610f8 | 47339:0252600fd1cf |
---|---|
54 let is_at_repo_root = true; | 54 let is_at_repo_root = true; |
55 let hg_path = HgPath::new(""); | 55 let hg_path = HgPath::new(""); |
56 let has_ignored_ancestor = false; | 56 let has_ignored_ancestor = false; |
57 common.traverse_fs_directory_and_dirstate( | 57 common.traverse_fs_directory_and_dirstate( |
58 has_ignored_ancestor, | 58 has_ignored_ancestor, |
59 &mut dmap.root, | 59 &dmap.root, |
60 hg_path, | 60 hg_path, |
61 &root_dir, | 61 &root_dir, |
62 is_at_repo_root, | 62 is_at_repo_root, |
63 ); | 63 ); |
64 Ok((common.outcome.into_inner().unwrap(), warnings)) | 64 Ok((common.outcome.into_inner().unwrap(), warnings)) |
91 } | 91 } |
92 | 92 |
93 fn traverse_fs_directory_and_dirstate( | 93 fn traverse_fs_directory_and_dirstate( |
94 &self, | 94 &self, |
95 has_ignored_ancestor: bool, | 95 has_ignored_ancestor: bool, |
96 dirstate_nodes: &'tree mut ChildNodes, | 96 dirstate_nodes: &'tree ChildNodes, |
97 directory_hg_path: &'tree HgPath, | 97 directory_hg_path: &'tree HgPath, |
98 directory_fs_path: &Path, | 98 directory_fs_path: &Path, |
99 is_at_repo_root: bool, | 99 is_at_repo_root: bool, |
100 ) { | 100 ) { |
101 let mut fs_entries = if let Ok(entries) = self.read_dir( | 101 let mut fs_entries = if let Ok(entries) = self.read_dir( |
149 | 149 |
150 fn traverse_fs_and_dirstate( | 150 fn traverse_fs_and_dirstate( |
151 &self, | 151 &self, |
152 fs_entry: &DirEntry, | 152 fs_entry: &DirEntry, |
153 hg_path: &'tree HgPath, | 153 hg_path: &'tree HgPath, |
154 dirstate_node: &'tree mut Node, | 154 dirstate_node: &'tree Node, |
155 has_ignored_ancestor: bool, | 155 has_ignored_ancestor: bool, |
156 ) { | 156 ) { |
157 let file_type = fs_entry.metadata.file_type(); | 157 let file_type = fs_entry.metadata.file_type(); |
158 let file_or_symlink = file_type.is_file() || file_type.is_symlink(); | 158 let file_or_symlink = file_type.is_file() || file_type.is_symlink(); |
159 if !file_or_symlink { | 159 if !file_or_symlink { |
171 } | 171 } |
172 let is_ignored = has_ignored_ancestor || (self.ignore_fn)(hg_path); | 172 let is_ignored = has_ignored_ancestor || (self.ignore_fn)(hg_path); |
173 let is_at_repo_root = false; | 173 let is_at_repo_root = false; |
174 self.traverse_fs_directory_and_dirstate( | 174 self.traverse_fs_directory_and_dirstate( |
175 is_ignored, | 175 is_ignored, |
176 &mut dirstate_node.children, | 176 &dirstate_node.children, |
177 hg_path, | 177 hg_path, |
178 &fs_entry.full_path, | 178 &fs_entry.full_path, |
179 is_at_repo_root, | 179 is_at_repo_root, |
180 ); | 180 ); |
181 } else { | 181 } else { |
218 full_path, | 218 full_path, |
219 ) | 219 ) |
220 } | 220 } |
221 } | 221 } |
222 | 222 |
223 for (child_hg_path, child_node) in &mut dirstate_node.children { | 223 for (child_hg_path, child_node) in &dirstate_node.children { |
224 self.traverse_dirstate_only( | 224 self.traverse_dirstate_only( |
225 child_hg_path.full_path(), | 225 child_hg_path.full_path(), |
226 child_node, | 226 child_node, |
227 ) | 227 ) |
228 } | 228 } |
276 | 276 |
277 /// A node in the dirstate tree has no corresponding filesystem entry | 277 /// A node in the dirstate tree has no corresponding filesystem entry |
278 fn traverse_dirstate_only( | 278 fn traverse_dirstate_only( |
279 &self, | 279 &self, |
280 hg_path: &'tree HgPath, | 280 hg_path: &'tree HgPath, |
281 dirstate_node: &'tree mut Node, | 281 dirstate_node: &'tree Node, |
282 ) { | 282 ) { |
283 self.mark_removed_or_deleted_if_file(hg_path, dirstate_node.state()); | 283 self.mark_removed_or_deleted_if_file(hg_path, dirstate_node.state()); |
284 dirstate_node.children.par_iter_mut().for_each( | 284 dirstate_node.children.par_iter().for_each( |
285 |(child_hg_path, child_node)| { | 285 |(child_hg_path, child_node)| { |
286 self.traverse_dirstate_only( | 286 self.traverse_dirstate_only( |
287 child_hg_path.full_path(), | 287 child_hg_path.full_path(), |
288 child_node, | 288 child_node, |
289 ) | 289 ) |