From 04961a01868c616bd0b7fa2689bd14bd095b71fe Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Tue, 11 Mar 2025 18:17:04 -0400 Subject: [PATCH] Tweak stage/unstage-and-next to start a commit instead of wrapping in the project diff editor (#26434) Release Notes: - Git Beta: improved the stage-and-next and unstage-and-next actions in the project diff editor to start a commit after acting on the last hunk --- crates/editor/src/editor.rs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 0a20aee0290623507923a16ec27eaf8a7f6ac8d2..60a0f7746c7656efda8e21e8cfdcb5526526dd00 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -13855,7 +13855,37 @@ impl Editor { } self.stage_or_unstage_diff_hunks(stage, ranges, cx); - self.go_to_next_hunk(&GoToHunk, window, cx); + let snapshot = self.snapshot(window, cx); + let position = self.selections.newest::(cx).head(); + let mut row = snapshot + .buffer_snapshot + .diff_hunks_in_range(position..snapshot.buffer_snapshot.max_point()) + .find(|hunk| hunk.row_range.start.0 > position.row) + .map(|hunk| hunk.row_range.start); + + let all_diff_hunks_expanded = self.buffer().read(cx).all_diff_hunks_expanded(); + // Outside of the project diff editor, wrap around to the beginning. + if !all_diff_hunks_expanded { + row = row.or_else(|| { + snapshot + .buffer_snapshot + .diff_hunks_in_range(Point::zero()..position) + .find(|hunk| hunk.row_range.end.0 < position.row) + .map(|hunk| hunk.row_range.start) + }); + } + + if let Some(row) = row { + let destination = Point::new(row.0, 0); + let autoscroll = Autoscroll::center(); + + self.unfold_ranges(&[destination..destination], false, false, cx); + self.change_selections(Some(autoscroll), window, cx, |s| { + s.select_ranges([destination..destination]); + }); + } else if all_diff_hunks_expanded { + window.dispatch_action(::git::ExpandCommitEditor.boxed_clone(), cx); + } } fn do_stage_or_unstage(