##// END OF EJS Templates
dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources...
Simon Sapin -
r47873:214ae40e default
parent child Browse files
Show More
@@ -30,6 +30,13 b' pub struct DirstateMap {'
30 30 parents: Option<DirstateParents>,
31 31 dirty_parents: bool,
32 32 root: ChildNodes,
33
34 /// Number of nodes anywhere in the tree that have `.entry.is_some()`.
35 nodes_with_entry_count: usize,
36
37 /// Number of nodes anywhere in the tree that have
38 /// `.copy_source.is_some()`.
39 nodes_with_copy_source_count: usize,
33 40 }
34 41
35 42 /// Using a plain `HgPathBuf` of the full path from the repository root as a
@@ -59,6 +66,8 b' impl DirstateMap {'
59 66 parents: None,
60 67 dirty_parents: false,
61 68 root: ChildNodes::new(),
69 nodes_with_entry_count: 0,
70 nodes_with_copy_source_count: 0,
62 71 }
63 72 }
64 73
@@ -78,8 +87,13 b' impl DirstateMap {'
78 87 }
79 88 }
80 89
81 fn get_or_insert_node(&mut self, path: &HgPath) -> &mut Node {
82 let mut child_nodes = &mut self.root;
90 /// This takes `root` instead of `&mut self` so that callers can mutate
91 /// other fields while the returned borrow is still valid
92 fn get_or_insert_node<'tree>(
93 root: &'tree mut ChildNodes,
94 path: &HgPath,
95 ) -> &'tree mut Node {
96 let mut child_nodes = root;
83 97 let mut inclusive_ancestor_paths =
84 98 WithBasename::inclusive_ancestors_of(path);
85 99 let mut ancestor_path = inclusive_ancestor_paths
@@ -106,6 +120,35 b' impl DirstateMap {'
106 120 }
107 121 }
108 122
123 /// The meaning of `new_copy_source` is:
124 ///
125 /// * `Some(Some(x))`: set `Node::copy_source` to `Some(x)`
126 /// * `Some(None)`: set `Node::copy_source` to `None`
127 /// * `None`: leave `Node::copy_source` unchanged
128 fn add_file_node(
129 &mut self,
130 path: &HgPath,
131 new_entry: DirstateEntry,
132 new_copy_source: Option<Option<HgPathBuf>>,
133 ) {
134 let node = Self::get_or_insert_node(&mut self.root, path);
135 if node.entry.is_none() {
136 self.nodes_with_entry_count += 1
137 }
138 if let Some(source) = &new_copy_source {
139 if node.copy_source.is_none() && source.is_some() {
140 self.nodes_with_copy_source_count += 1
141 }
142 if node.copy_source.is_some() && source.is_none() {
143 self.nodes_with_copy_source_count -= 1
144 }
145 }
146 node.entry = Some(new_entry);
147 if let Some(source) = new_copy_source {
148 node.copy_source = source
149 }
150 }
151
109 152 fn iter_nodes<'a>(
110 153 &'a self,
111 154 ) -> impl Iterator<Item = (&'a WithBasename<HgPathBuf>, &'a Node)> + 'a
@@ -194,7 +237,9 b' impl super::dispatch::DirstateMapMethods'
194 237 p1: NULL_NODE,
195 238 p2: NULL_NODE,
196 239 });
197 self.root.clear()
240 self.root.clear();
241 self.nodes_with_entry_count = 0;
242 self.nodes_with_copy_source_count = 0;
198 243 }
199 244
200 245 fn add_file(
@@ -315,9 +360,11 b' impl super::dispatch::DirstateMapMethods'
315 360 let parents = parse_dirstate_entries(
316 361 file_contents,
317 362 |path, entry, copy_source| {
318 let node = self.get_or_insert_node(path);
319 node.entry = Some(*entry);
320 node.copy_source = copy_source.map(HgPath::to_owned);
363 self.add_file_node(
364 path,
365 *entry,
366 Some(copy_source.map(HgPath::to_owned)),
367 )
321 368 },
322 369 )?;
323 370
@@ -393,7 +440,7 b' impl super::dispatch::DirstateMapMethods'
393 440 }
394 441
395 442 fn copy_map_len(&self) -> usize {
396 todo!()
443 self.nodes_with_copy_source_count
397 444 }
398 445
399 446 fn copy_map_iter(&self) -> CopyMapIter<'_> {
@@ -429,7 +476,7 b' impl super::dispatch::DirstateMapMethods'
429 476 }
430 477
431 478 fn len(&self) -> usize {
432 todo!()
479 self.nodes_with_entry_count
433 480 }
434 481
435 482 fn contains_key(&self, key: &HgPath) -> bool {
General Comments 0
You need to be logged in to leave comments. Login now