This fixes an issue where diff hunks were shown for untracked files, but only if the files did not end with a newline. Release Notes: - N/A
Showing the changes to crates/buffer_diff/src/buffer_diff.rs (1 of 4 files). Show all
Unified · Split
| @@ -56,8 +56,8 @@ pub enum DiffHunkSecondaryStatus { · 55 unmodified lines | ||
| 56 | 56 | /// A diff hunk resolved to rows in the buffer. |
| 57 | 57 | #[derive(Debug, Clone, PartialEq, Eq)] |
| 58 | 58 | pub struct DiffHunk { |
| 59 | − /// The buffer range, expressed in terms of rows. | |
| 60 | − pub row_range: Range<u32>, | |
| 59 | + /// The buffer range as points. | |
| 60 | + pub range: Range<Point>, | |
| 61 | 61 | /// The range in the buffer to which this hunk corresponds. |
| 62 | 62 | pub buffer_range: Range<Anchor>, |
| 63 | 63 | /// The range in the buffer's diff base text to which this hunk corresponds. |
| @@ -362,6 +362,7 @@ impl BufferDiffInner { · 298 unmodified lines | ||
| 362 | 362 | pending_hunks = secondary.pending_hunks.clone(); |
| 363 | 363 | } |
| 364 | 364 | |
| 365 | + let max_point = buffer.max_point(); | |
| 365 | 366 | let mut summaries = buffer.summaries_for_anchors_with_payload::<Point, _, _>(anchor_iter); |
| 366 | 367 | iter::from_fn(move || loop { |
| 367 | 368 | let (start_point, (start_anchor, start_base)) = summaries.next()?; |
| @@ -371,7 +372,7 @@ impl BufferDiffInner { · 3 unmodified lines | ||
| 371 | 372 | continue; |
| 372 | 373 | } |
| 373 | 374 | |
| 374 | − if end_point.column > 0 { | |
| 375 | + if end_point.column > 0 && end_point < max_point { | |
| 375 | 376 | end_point.row += 1; |
| 376 | 377 | end_point.column = 0; |
| 377 | 378 | end_anchor = buffer.anchor_before(end_point); |
| @@ -416,7 +417,7 @@ impl BufferDiffInner { · 38 unmodified lines | ||
| 416 | 417 | } |
| 417 | 418 | |
| 418 | 419 | return Some(DiffHunk { |
| 419 | − row_range: start_point.row..end_point.row, | |
| 420 | + range: start_point..end_point, | |
| 420 | 421 | diff_base_byte_range: start_base..end_base, |
| 421 | 422 | buffer_range: start_anchor..end_anchor, |
| 422 | 423 | secondary_status, |
| @@ -442,14 +443,9 @@ impl BufferDiffInner { · 19 unmodified lines | ||
| 442 | 443 | |
| 443 | 444 | let hunk = cursor.item()?; |
| 444 | 445 | let range = hunk.buffer_range.to_point(buffer); |
| 445 | − let end_row = if range.end.column > 0 { | |
| 446 | − range.end.row + 1 | |
| 447 | − } else { | |
| 448 | − range.end.row | |
| 449 | − }; | |
| 450 | 446 | |
| 451 | 447 | Some(DiffHunk { |
| 452 | − row_range: range.start.row..end_row, | |
| 448 | + range, | |
| 453 | 449 | diff_base_byte_range: hunk.diff_base_byte_range.clone(), |
| 454 | 450 | buffer_range: hunk.buffer_range.clone(), |
| 455 | 451 | // The secondary status is not used by callers of this method. |
| @@ -1136,12 +1132,10 @@ pub fn assert_hunks<Iter>( · 680 unmodified lines | ||
| 1136 | 1132 | let actual_hunks = diff_hunks |
| 1137 | 1133 | .map(|hunk| { |
| 1138 | 1134 | ( |
| 1139 | − hunk.row_range.clone(), | |
| 1135 | + hunk.range.clone(), | |
| 1140 | 1136 | &diff_base[hunk.diff_base_byte_range.clone()], |
| 1141 | 1137 | buffer |
| 1142 | − .text_for_range( | |
| 1143 | − Point::new(hunk.row_range.start, 0)..Point::new(hunk.row_range.end, 0), | |
| 1144 | − ) | |
| 1138 | + .text_for_range(hunk.range.clone()) | |
| 1145 | 1139 | .collect::<String>(), |
| 1146 | 1140 | hunk.status(), |
| 1147 | 1141 | ) |
| @@ -1150,7 +1144,14 @@ pub fn assert_hunks<Iter>( · 2 unmodified lines | ||
| 1150 | 1144 | |
| 1151 | 1145 | let expected_hunks: Vec<_> = expected_hunks |
| 1152 | 1146 | .iter() |
| 1153 | − .map(|(r, s, h, status)| (r.clone(), *s, h.to_string(), *status)) | |
| 1147 | + .map(|(r, old_text, new_text, status)| { | |
| 1148 | + ( | |
| 1149 | + Point::new(r.start, 0)..Point::new(r.end, 0), | |
| 1150 | + *old_text, | |
| 1151 | + new_text.to_string(), | |
| 1152 | + *status, | |
| 1153 | + ) | |
| 1154 | + }) | |
| 1154 | 1155 | .collect(); |
| 1155 | 1156 | |
| 1156 | 1157 | assert_eq!(actual_hunks, expected_hunks); |