diff --git a/lib/src/merge.rs b/lib/src/merge.rs index 37a5b11c6..de3d68bd1 100644 --- a/lib/src/merge.rs +++ b/lib/src/merge.rs @@ -34,7 +34,6 @@ use smallvec::SmallVec; use crate::backend; use crate::backend::BackendResult; use crate::backend::FileId; -use crate::backend::TreeId; use crate::backend::TreeValue; use crate::content_hash::ContentHash; use crate::content_hash::DigestUpdate; @@ -598,7 +597,7 @@ where /// is a `TreeValue::Tree`, this converts it to /// a `Merge`, with empty trees instead of /// any `None` terms. Otherwise, returns `None`. - pub fn to_tree_merge( + pub async fn to_tree_merge( &self, store: &Arc, dir: &RepoPath, @@ -609,14 +608,17 @@ where Some(_) => Err(()), }); if let Ok(tree_id_merge) = tree_id_merge { - let get_tree = |id: &Option<&TreeId>| -> BackendResult { - if let Some(id) = id { - store.get_tree(dir.to_owned(), id) - } else { - Ok(Tree::empty(store.clone(), dir.to_owned())) - } - }; - Ok(Some(tree_id_merge.try_map(get_tree)?)) + Ok(Some( + tree_id_merge + .try_map_async(|id| async move { + if let Some(id) = id { + store.get_tree_async(dir.to_owned(), id).await + } else { + Ok(Tree::empty(store.clone(), dir.to_owned())) + } + }) + .await?, + )) } else { Ok(None) } diff --git a/lib/src/merged_tree.rs b/lib/src/merged_tree.rs index ffcb40423..3d11d4b38 100644 --- a/lib/src/merged_tree.rs +++ b/lib/src/merged_tree.rs @@ -497,7 +497,7 @@ async fn merge_tree_values( return Ok(Merge::resolved(resolved.cloned())); } - if let Some(trees) = values.to_tree_merge(store, path)? { + if let Some(trees) = values.to_tree_merge(store, path).await? { // If all sides are trees or missing, merge the trees recursively, treating // missing trees as empty. let empty_tree_id = store.empty_tree_id(); @@ -594,7 +594,7 @@ impl Iterator for TreeEntriesIterator<'_> { fn next(&mut self) -> Option { while let Some(top) = self.stack.last_mut() { if let Some((path, value)) = top.entries.pop() { - let maybe_trees = match value.to_tree_merge(&self.store, &path) { + let maybe_trees = match value.to_tree_merge(&self.store, &path).block_on() { Ok(maybe_trees) => maybe_trees, Err(err) => return Some((path, Err(err))), }; @@ -656,7 +656,7 @@ impl Iterator for ConflictIterator { fn next(&mut self) -> Option { while let Some(top) = self.stack.last_mut() { if let Some((path, tree_values)) = top.entries.pop() { - match tree_values.to_tree_merge(&self.store, &path) { + match tree_values.to_tree_merge(&self.store, &path).block_on() { Ok(Some(trees)) => { // If all sides are trees or missing, descend into the merged tree self.stack.push(ConflictsDirItem::from(&trees)); @@ -723,7 +723,7 @@ impl<'matcher> TreeDiffIterator<'matcher> { dir: &RepoPath, values: &MergedTreeValue, ) -> BackendResult> { - if let Some(trees) = values.to_tree_merge(store, dir)? { + if let Some(trees) = values.to_tree_merge(store, dir).block_on()? { Ok(trees) } else { Ok(Merge::resolved(Tree::empty(store.clone(), dir.to_owned())))