|
1 | 1 | use std::num::NonZeroU32; |
2 | 2 |
|
3 | | -#[cfg(feature = "blob-experimental")] |
4 | | -use gix_diff::blob::v2::Hunk; |
5 | | - |
6 | 3 | use gix_diff::{blob::intern::TokenSource, tree::Visit}; |
7 | 4 | use gix_hash::ObjectId; |
8 | 5 | use gix_object::{ |
@@ -857,6 +854,8 @@ fn blob_changes( |
857 | 854 | diff_algorithm: gix_diff::blob::Algorithm, |
858 | 855 | stats: &mut Statistics, |
859 | 856 | ) -> Result<Vec<Change>, Error> { |
| 857 | + use gix_diff::blob::v2::Hunk; |
| 858 | + |
860 | 859 | resource_cache.set_resource( |
861 | 860 | previous_oid, |
862 | 861 | gix_object::tree::EntryKind::Blob, |
@@ -886,36 +885,40 @@ fn blob_changes( |
886 | 885 | let mut diff = gix_diff::blob::v2::Diff::compute(diff_algorithm, &input); |
887 | 886 | diff.postprocess_lines(&input); |
888 | 887 |
|
889 | | - let changes = diff |
890 | | - .hunks() |
891 | | - .fold((Vec::new(), 0), |(mut hunks, mut last_seen_after_end), hunk| { |
892 | | - let Hunk { before, after } = hunk; |
| 888 | + let mut last_seen_after_end = 0; |
| 889 | + let mut changes = diff.hunks().fold(Vec::new(), |mut hunks, hunk| { |
| 890 | + let Hunk { before, after } = hunk; |
893 | 891 |
|
894 | | - // This checks for unchanged hunks. |
895 | | - if after.start > last_seen_after_end { |
896 | | - hunks.push(Change::Unchanged(last_seen_after_end..after.start)); |
897 | | - } |
| 892 | + // This checks for unchanged hunks. |
| 893 | + if after.start > last_seen_after_end { |
| 894 | + hunks.push(Change::Unchanged(last_seen_after_end..after.start)); |
| 895 | + } |
898 | 896 |
|
899 | | - match (!before.is_empty(), !after.is_empty()) { |
900 | | - (_, true) => { |
901 | | - hunks.push(Change::AddedOrReplaced( |
902 | | - after.start..after.end, |
903 | | - before.end - before.start, |
904 | | - )); |
905 | | - } |
906 | | - (true, false) => { |
907 | | - hunks.push(Change::Deleted(after.start, before.end - before.start)); |
908 | | - } |
909 | | - (false, false) => unreachable!("BUG: imara-diff provided a non-change"), |
| 897 | + match (!before.is_empty(), !after.is_empty()) { |
| 898 | + (_, true) => { |
| 899 | + hunks.push(Change::AddedOrReplaced( |
| 900 | + after.start..after.end, |
| 901 | + before.end - before.start, |
| 902 | + )); |
910 | 903 | } |
| 904 | + (true, false) => { |
| 905 | + hunks.push(Change::Deleted(after.start, before.end - before.start)); |
| 906 | + } |
| 907 | + (false, false) => unreachable!("BUG: imara-diff provided a non-change"), |
| 908 | + } |
911 | 909 |
|
912 | | - last_seen_after_end = after.end; |
| 910 | + last_seen_after_end = after.end; |
913 | 911 |
|
914 | | - (hunks, last_seen_after_end) |
915 | | - }); |
| 912 | + hunks |
| 913 | + }); |
| 914 | + |
| 915 | + let total_number_of_lines = input.after.len() as u32; |
| 916 | + if input.after.len() > last_seen_after_end as usize { |
| 917 | + changes.push(Change::Unchanged(last_seen_after_end..total_number_of_lines)); |
| 918 | + } |
916 | 919 |
|
917 | 920 | stats.blobs_diffed += 1; |
918 | | - Ok(changes.0) |
| 921 | + Ok(changes) |
919 | 922 | } |
920 | 923 |
|
921 | 924 | fn find_path_entry_in_commit( |
|
0 commit comments