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
This commit is contained in:
Cole Miller 2025-03-11 18:17:04 -04:00 committed by GitHub
parent fd7ab20ea4
commit 04961a0186
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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::<Point>(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(