Show More
@@ -34,8 +34,8 b' pub struct DirstateMap {' | |||
|
34 | 34 | file_fold_map: Option<FileFoldMap>, |
|
35 | 35 | pub dirs: Option<DirsMultiset>, |
|
36 | 36 | pub all_dirs: Option<DirsMultiset>, |
|
37 | non_normal_set: HashSet<HgPathBuf>, | |
|
38 | other_parent_set: HashSet<HgPathBuf>, | |
|
37 | non_normal_set: Option<HashSet<HgPathBuf>>, | |
|
38 | other_parent_set: Option<HashSet<HgPathBuf>>, | |
|
39 | 39 | parents: Option<DirstateParents>, |
|
40 | 40 | dirty_parents: bool, |
|
41 | 41 | } |
@@ -69,8 +69,8 b' impl DirstateMap {' | |||
|
69 | 69 | self.state_map.clear(); |
|
70 | 70 | self.copy_map.clear(); |
|
71 | 71 | self.file_fold_map = None; |
|
72 |
self.non_normal_set |
|
|
73 |
self.other_parent_set |
|
|
72 | self.non_normal_set = None; | |
|
73 | self.other_parent_set = None; | |
|
74 | 74 | self.set_parents(&DirstateParents { |
|
75 | 75 | p1: NULL_ID, |
|
76 | 76 | p2: NULL_ID, |
@@ -98,11 +98,19 b' impl DirstateMap {' | |||
|
98 | 98 | self.state_map.insert(filename.to_owned(), entry.to_owned()); |
|
99 | 99 | |
|
100 | 100 | if entry.state != EntryState::Normal || entry.mtime == MTIME_UNSET { |
|
101 |
self.non_normal_ |
|
|
101 | self.get_non_normal_other_parent_entries() | |
|
102 | .0 | |
|
103 | .as_mut() | |
|
104 | .unwrap() | |
|
105 | .insert(filename.to_owned()); | |
|
102 | 106 | } |
|
103 | 107 | |
|
104 | 108 | if entry.size == SIZE_FROM_OTHER_PARENT { |
|
105 |
self.other_parent_ |
|
|
109 | self.get_non_normal_other_parent_entries() | |
|
110 | .1 | |
|
111 | .as_mut() | |
|
112 | .unwrap() | |
|
113 | .insert(filename.to_owned()); | |
|
106 | 114 | } |
|
107 | 115 | Ok(()) |
|
108 | 116 | } |
@@ -142,7 +150,11 b' impl DirstateMap {' | |||
|
142 | 150 | mtime: 0, |
|
143 | 151 | }, |
|
144 | 152 | ); |
|
145 |
self.non_normal_ |
|
|
153 | self.get_non_normal_other_parent_entries() | |
|
154 | .0 | |
|
155 | .as_mut() | |
|
156 | .unwrap() | |
|
157 | .insert(filename.to_owned()); | |
|
146 | 158 | Ok(()) |
|
147 | 159 | } |
|
148 | 160 | |
@@ -168,7 +180,11 b' impl DirstateMap {' | |||
|
168 | 180 | if let Some(ref mut file_fold_map) = self.file_fold_map { |
|
169 | 181 | file_fold_map.remove(&normalize_case(filename)); |
|
170 | 182 | } |
|
171 |
self.non_normal_ |
|
|
183 | self.get_non_normal_other_parent_entries() | |
|
184 | .0 | |
|
185 | .as_mut() | |
|
186 | .unwrap() | |
|
187 | .remove(filename); | |
|
172 | 188 | |
|
173 | 189 | Ok(exists) |
|
174 | 190 | } |
@@ -193,14 +209,55 b' impl DirstateMap {' | |||
|
193 | 209 | } |
|
194 | 210 | }); |
|
195 | 211 | if changed { |
|
196 |
self.non_normal_ |
|
|
212 | self.get_non_normal_other_parent_entries() | |
|
213 | .0 | |
|
214 | .as_mut() | |
|
215 | .unwrap() | |
|
216 | .insert(filename.to_owned()); | |
|
197 | 217 | } |
|
198 | 218 | } |
|
199 | 219 | } |
|
200 | 220 | |
|
201 |
pub fn non_normal_ |
|
|
202 | &self, | |
|
203 | ) -> (HashSet<HgPathBuf>, HashSet<HgPathBuf>) { | |
|
221 | pub fn non_normal_entries_remove( | |
|
222 | &mut self, | |
|
223 | key: impl AsRef<HgPath>, | |
|
224 | ) -> bool { | |
|
225 | self.get_non_normal_other_parent_entries() | |
|
226 | .0 | |
|
227 | .as_mut() | |
|
228 | .unwrap() | |
|
229 | .remove(key.as_ref()) | |
|
230 | } | |
|
231 | pub fn non_normal_entries_union( | |
|
232 | &mut self, | |
|
233 | other: HashSet<HgPathBuf>, | |
|
234 | ) -> Vec<HgPathBuf> { | |
|
235 | self.get_non_normal_other_parent_entries() | |
|
236 | .0 | |
|
237 | .as_mut() | |
|
238 | .unwrap() | |
|
239 | .union(&other) | |
|
240 | .map(|e| e.to_owned()) | |
|
241 | .collect() | |
|
242 | } | |
|
243 | ||
|
244 | pub fn get_non_normal_other_parent_entries( | |
|
245 | &mut self, | |
|
246 | ) -> ( | |
|
247 | &mut Option<HashSet<HgPathBuf>>, | |
|
248 | &mut Option<HashSet<HgPathBuf>>, | |
|
249 | ) { | |
|
250 | self.set_non_normal_other_parent_entries(false); | |
|
251 | (&mut self.non_normal_set, &mut self.other_parent_set) | |
|
252 | } | |
|
253 | ||
|
254 | pub fn set_non_normal_other_parent_entries(&mut self, force: bool) { | |
|
255 | if !force | |
|
256 | && self.non_normal_set.is_some() | |
|
257 | && self.other_parent_set.is_some() | |
|
258 | { | |
|
259 | return; | |
|
260 | } | |
|
204 | 261 | let mut non_normal = HashSet::new(); |
|
205 | 262 | let mut other_parent = HashSet::new(); |
|
206 | 263 | |
@@ -219,8 +276,8 b' impl DirstateMap {' | |||
|
219 | 276 | other_parent.insert(filename.to_owned()); |
|
220 | 277 | } |
|
221 | 278 | } |
|
222 | ||
|
223 | (non_normal, other_parent) | |
|
279 | self.non_normal_set = Some(non_normal); | |
|
280 | self.other_parent_set = Some(other_parent); | |
|
224 | 281 | } |
|
225 | 282 | |
|
226 | 283 | /// Both of these setters and their uses appear to be the simplest way to |
@@ -325,9 +382,7 b' impl DirstateMap {' | |||
|
325 | 382 | |
|
326 | 383 | self.dirty_parents = false; |
|
327 | 384 | |
|
328 |
|
|
|
329 | self.non_normal_set = result.0; | |
|
330 | self.other_parent_set = result.1; | |
|
385 | self.set_non_normal_other_parent_entries(true); | |
|
331 | 386 | Ok(packed) |
|
332 | 387 | } |
|
333 | 388 | |
@@ -385,13 +440,27 b' mod tests {' | |||
|
385 | 440 | .unwrap(); |
|
386 | 441 | |
|
387 | 442 | assert_eq!(1, map.len()); |
|
388 | assert_eq!(0, map.non_normal_set.len()); | |
|
389 | assert_eq!(0, map.other_parent_set.len()); | |
|
443 | assert_eq!( | |
|
444 | 0, | |
|
445 | map.get_non_normal_other_parent_entries() | |
|
446 | .0 | |
|
447 | .as_ref() | |
|
448 | .unwrap() | |
|
449 | .len() | |
|
450 | ); | |
|
451 | assert_eq!( | |
|
452 | 0, | |
|
453 | map.get_non_normal_other_parent_entries() | |
|
454 | .1 | |
|
455 | .as_ref() | |
|
456 | .unwrap() | |
|
457 | .len() | |
|
458 | ); | |
|
390 | 459 | } |
|
391 | 460 | |
|
392 | 461 | #[test] |
|
393 | 462 | fn test_non_normal_other_parent_entries() { |
|
394 | let map: DirstateMap = [ | |
|
463 | let mut map: DirstateMap = [ | |
|
395 | 464 | (b"f1", (EntryState::Removed, 1337, 1337, 1337)), |
|
396 | 465 | (b"f2", (EntryState::Normal, 1337, 1337, -1)), |
|
397 | 466 | (b"f3", (EntryState::Normal, 1337, 1337, 1337)), |
@@ -427,10 +496,11 b' mod tests {' | |||
|
427 | 496 | |
|
428 | 497 | let mut other_parent = HashSet::new(); |
|
429 | 498 | other_parent.insert(HgPathBuf::from_bytes(b"f4")); |
|
499 | let entries = map.get_non_normal_other_parent_entries(); | |
|
430 | 500 | |
|
431 | 501 | assert_eq!( |
|
432 | (non_normal, other_parent), | |
|
433 | map.non_normal_other_parent_entries() | |
|
502 | (Some(non_normal), Some(other_parent)), | |
|
503 | (entries.0.to_owned(), entries.1.to_owned()) | |
|
434 | 504 | ); |
|
435 | 505 | } |
|
436 | 506 | } |
General Comments 0
You need to be logged in to leave comments.
Login now