Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
lib: make TreeState::check_out() and set_sparse_patterns() async
Assisted-by: Opus 4.6 via Claude Code
Signed-off-by: Austin Seipp <aseipp@pobox.com>
  • Loading branch information
thoughtpolice committed Mar 12, 2026
commit 006f9da33d181ad45bd35c7c2f7a34ae7d36dfd1
38 changes: 20 additions & 18 deletions cli/src/merge_tools/diff_working_copies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,28 +146,30 @@ pub(crate) async fn check_out_trees(
let temp_path = temp_dir.path();

// Checkout a tree into our temp directory with the given prefix.
let check_out = |name: &str, tree| -> Result<TreeState, DiffCheckoutError> {
let wc_path = temp_path.join(name);
let state_dir = temp_path.join(format!("{name}_state"));
std::fs::create_dir(&wc_path).map_err(DiffCheckoutError::SetUpDir)?;
std::fs::create_dir(&state_dir).map_err(DiffCheckoutError::SetUpDir)?;
let tree_state_settings = TreeStateSettings {
conflict_marker_style,
eol_conversion_mode: EolConversionMode::None,
exec_change_setting: ExecChangeSetting::Auto,
fsmonitor_settings: FsmonitorSettings::None,
let check_out =
async |name: &str, tree| -> Result<TreeState, DiffCheckoutError> {
let wc_path = temp_path.join(name);
let state_dir = temp_path.join(format!("{name}_state"));
std::fs::create_dir(&wc_path).map_err(DiffCheckoutError::SetUpDir)?;
std::fs::create_dir(&state_dir).map_err(DiffCheckoutError::SetUpDir)?;
let tree_state_settings = TreeStateSettings {
conflict_marker_style,
eol_conversion_mode: EolConversionMode::None,
exec_change_setting: ExecChangeSetting::Auto,
fsmonitor_settings: FsmonitorSettings::None,
};
let mut state =
TreeState::init(store.clone(), wc_path, state_dir, &tree_state_settings)?;
state.set_sparse_patterns(changed_files.clone()).await?;
state.check_out(tree).await?;
Ok(state)
};
let mut state = TreeState::init(store.clone(), wc_path, state_dir, &tree_state_settings)?;
state.set_sparse_patterns(changed_files.clone())?;
state.check_out(tree)?;
Ok(state)
};

let left = check_out("left", trees.before)?;
let right = check_out("right", trees.after)?;
let left = check_out("left", trees.before).await?;
let right = check_out("right", trees.after).await?;
let output = match diff_type {
DiffType::TwoWay => None,
DiffType::ThreeWay => Some(check_out("output", trees.after)?),
DiffType::ThreeWay => Some(check_out("output", trees.after).await?),
};
Ok(DiffWorkingCopies {
_temp_dir: temp_dir,
Expand Down
18 changes: 11 additions & 7 deletions lib/src/local_working_copy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2127,16 +2127,19 @@ impl TreeState {
.map_err(|err| checkout_error_for_mtime_out_of_range(err, disk_path))
}

pub fn check_out(&mut self, new_tree: &MergedTree) -> Result<CheckoutStats, CheckoutError> {
pub async fn check_out(
&mut self,
new_tree: &MergedTree,
) -> Result<CheckoutStats, CheckoutError> {
let old_tree = self.tree.clone();
let stats = self
.update(&old_tree, new_tree, self.sparse_matcher().as_ref())
.block_on()?;
.await?;
self.tree = new_tree.clone();
Ok(stats)
}

pub fn set_sparse_patterns(
pub async fn set_sparse_patterns(
&mut self,
sparse_patterns: Vec<RepoPathBuf>,
) -> Result<CheckoutStats, CheckoutError> {
Expand All @@ -2146,10 +2149,10 @@ impl TreeState {
let added_matcher = DifferenceMatcher::new(&new_matcher, &old_matcher);
let removed_matcher = DifferenceMatcher::new(&old_matcher, &new_matcher);
let empty_tree = self.store.empty_merged_tree();
let added_stats = self.update(&empty_tree, &tree, &added_matcher).block_on()?;
let added_stats = self.update(&empty_tree, &tree, &added_matcher).await?;
let removed_stats = self
.update(&tree, &empty_tree, &removed_matcher)
.block_on()?;
.await?;
self.sparse_patterns = sparse_patterns;
assert_eq!(added_stats.updated_files, 0);
assert_eq!(added_stats.removed_files, 0);
Expand Down Expand Up @@ -2797,7 +2800,7 @@ impl LockedWorkingCopy for LockedLocalWorkingCopy {
let new_tree = commit.tree();
let tree_state = self.wc.tree_state_mut()?;
if tree_state.tree.tree_ids_and_labels() != new_tree.tree_ids_and_labels() {
let stats = tree_state.check_out(&new_tree)?;
let stats = tree_state.check_out(&new_tree).await?;
self.tree_state_dirty = true;
Ok(stats)
} else {
Expand Down Expand Up @@ -2836,7 +2839,8 @@ impl LockedWorkingCopy for LockedLocalWorkingCopy {
let stats = self
.wc
.tree_state_mut()?
.set_sparse_patterns(new_sparse_patterns)?;
.set_sparse_patterns(new_sparse_patterns)
.await?;
self.tree_state_dirty = true;
Ok(stats)
}
Expand Down
Loading