just playing with tangled
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

working copy: use `MergedTree::diff_stream()`

This will make it a little faster to update the working copy at Google
once we've made `MergedTree::diff_stream()` fetch trees
concurrently. (It only makes it a little faster because we still fetch
files serially.)

authored by

Martin von Zweigbergk and committed by
Martin von Zweigbergk
904c37d3 72245cfa

+17 -8
+17 -8
lib/src/local_working_copy.rs
··· 30 30 use std::sync::Arc; 31 31 use std::time::UNIX_EPOCH; 32 32 33 + use futures::StreamExt; 33 34 use itertools::Itertools; 34 35 use once_cell::unsync::OnceCell; 35 36 use pollster::FutureExt; ··· 1099 1100 }, 1100 1101 other => CheckoutError::InternalBackendError(other), 1101 1102 })?; 1102 - let stats = self.update(&old_tree, new_tree, self.sparse_matcher().as_ref())?; 1103 + let stats = self 1104 + .update(&old_tree, new_tree, self.sparse_matcher().as_ref()) 1105 + .block_on()?; 1103 1106 self.tree_id = new_tree.id(); 1104 1107 Ok(stats) 1105 1108 } ··· 1119 1122 let added_matcher = DifferenceMatcher::new(&new_matcher, &old_matcher); 1120 1123 let removed_matcher = DifferenceMatcher::new(&old_matcher, &new_matcher); 1121 1124 let empty_tree = MergedTree::resolved(Tree::null(self.store.clone(), RepoPath::root())); 1122 - let added_stats = self.update(&empty_tree, &tree, &added_matcher)?; 1123 - let removed_stats = self.update(&tree, &empty_tree, &removed_matcher)?; 1125 + let added_stats = self.update(&empty_tree, &tree, &added_matcher).block_on()?; 1126 + let removed_stats = self 1127 + .update(&tree, &empty_tree, &removed_matcher) 1128 + .block_on()?; 1124 1129 self.sparse_patterns = sparse_patterns; 1125 1130 assert_eq!(added_stats.updated_files, 0); 1126 1131 assert_eq!(added_stats.removed_files, 0); ··· 1135 1140 }) 1136 1141 } 1137 1142 1138 - fn update( 1143 + async fn update( 1139 1144 &mut self, 1140 1145 old_tree: &MergedTree, 1141 1146 new_tree: &MergedTree, ··· 1149 1154 removed_files: 0, 1150 1155 skipped_files: 0, 1151 1156 }; 1152 - for (path, diff) in old_tree.diff(new_tree, matcher) { 1157 + let mut diff_stream = old_tree.diff_stream(new_tree, matcher); 1158 + while let Some((path, diff)) = diff_stream.next().await { 1153 1159 let (before, after) = diff?; 1154 1160 if after.is_absent() { 1155 1161 stats.removed_files += 1; ··· 1216 1222 Ok(stats) 1217 1223 } 1218 1224 1219 - pub fn reset(&mut self, new_tree: &MergedTree) -> Result<(), ResetError> { 1225 + pub async fn reset(&mut self, new_tree: &MergedTree) -> Result<(), ResetError> { 1220 1226 let old_tree = self.current_tree().map_err(|err| match err { 1221 1227 err @ BackendError::ObjectNotFound { .. } => ResetError::SourceNotFound { 1222 1228 source: Box::new(err), ··· 1224 1230 other => ResetError::InternalBackendError(other), 1225 1231 })?; 1226 1232 1227 - for (path, diff) in old_tree.diff(new_tree, self.sparse_matcher().as_ref()) { 1233 + let matcher = self.sparse_matcher(); 1234 + let mut diff_stream = old_tree.diff_stream(new_tree, matcher.as_ref()); 1235 + while let Some((path, diff)) = diff_stream.next().await { 1228 1236 let (_before, after) = diff?; 1229 1237 if after.is_absent() { 1230 1238 self.file_states.remove(&path); ··· 1547 1555 message: "Failed to read the working copy state".to_string(), 1548 1556 err: err.into(), 1549 1557 })? 1550 - .reset(new_tree)?; 1558 + .reset(new_tree) 1559 + .block_on()?; 1551 1560 self.tree_state_dirty = true; 1552 1561 Ok(()) 1553 1562 }