From 8cdb59fa5edd896cd639592a9ee94673992bcb21 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Mon, 21 Oct 2024 08:34:39 -0700 Subject: [PATCH] Normalise newlines before diffing This produces good, consistent results on different trailing newlines before, consistent with the behaviour before 7edd2a82cd (see #755). --- sample_files/compare.expected | 10 +++++----- src/display/side_by_side.rs | 11 +++++++++-- src/main.rs | 23 ++++++++++++++--------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/sample_files/compare.expected b/sample_files/compare.expected index 3f1a3b27ee..77b7ce1f05 100644 --- a/sample_files/compare.expected +++ b/sample_files/compare.expected @@ -5,7 +5,7 @@ sample_files/ada_1.adb sample_files/ada_2.adb eb3b0e12e239ae33789136380e81406b - sample_files/added_line_1.txt sample_files/added_line_2.txt -f935214c79833318d39364145d36d8e2 - +8a1587e6b5fc53f2ec2ac665a5d00372 - sample_files/align_footer_1.txt sample_files/align_footer_2.txt d640bd2de31e56a39f0efb92aff0f379 - @@ -23,7 +23,7 @@ sample_files/bad_combine_1.rs sample_files/bad_combine_2.rs f5051bf7d2b8afa3a677388cbd458891 - sample_files/big_text_hunk_1.txt sample_files/big_text_hunk_2.txt -dcc22684c2a200afdd583d621b47dfa3 - +fc26d41a5ff771670e04033b177973d2 - sample_files/change_outer_1.el sample_files/change_outer_2.el 2b9334a4cc72da63bba28eff958f0038 - @@ -74,7 +74,7 @@ sample_files/erlang_1.erl sample_files/erlang_2.erl dccdb8f65d2f099ab1a8cb66011376a2 - sample_files/f_sharp_1.fs sample_files/f_sharp_2.fs -1a9173c15a42c1ebb9522109df172faf - +0a6651925acadf366f213d15968ae353 - sample_files/hack_1.php sample_files/hack_2.php c2bb0aa7d7b07d6ced79f6a5363e878b - @@ -215,7 +215,7 @@ sample_files/racket_1.rkt sample_files/racket_2.rkt 605aec93fa7b89d08e5d8ed56ad3c1be - sample_files/repeated_line_no_eol_1.txt sample_files/repeated_line_no_eol_2.txt -ac714893a2d28dc0204855d308972ccd - +3786f55d2c9b1897e866b4602e50408d - sample_files/ruby_1.rb sample_files/ruby_2.rb d4d591902030355656f5c18c78f965a6 - @@ -302,5 +302,5 @@ sample_files/yaml_1.yaml sample_files/yaml_2.yaml f068239fc7bade0e6de96d81136c1ac5 - sample_files/zig_1.zig sample_files/zig_2.zig -e36d1ea126b8b68e3344434bb63f205e - +4516796003b81f35bfa57d84bb7c0cbe - diff --git a/src/display/side_by_side.rs b/src/display/side_by_side.rs index 055fa655f4..c3407bd300 100644 --- a/src/display/side_by_side.rs +++ b/src/display/side_by_side.rs @@ -407,8 +407,15 @@ pub(crate) fn print( let mut prev_lhs_line_num = None; let mut prev_rhs_line_num = None; - let lhs_lines = split_on_newlines(lhs_src).collect::>(); - let rhs_lines = split_on_newlines(rhs_src).collect::>(); + let mut lhs_lines = split_on_newlines(lhs_src).collect::>(); + let mut rhs_lines = split_on_newlines(rhs_src).collect::>(); + + if lhs_lines.last() == Some(&"") && lhs_lines.len() > 1 { + lhs_lines.pop(); + } + if rhs_lines.last() == Some(&"") && rhs_lines.len() > 1 { + rhs_lines.pop(); + } let matched_lines = all_matched_lines_filled(lhs_mps, rhs_mps, &lhs_lines, &rhs_lines); let mut matched_lines_to_print = &matched_lines[..]; diff --git a/src/main.rs b/src/main.rs index 4aad367612..6fd6b3fe1c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -373,16 +373,21 @@ fn diff_file( rhs_src.retain(|c| c != '\r'); } - // If "foo" is one line, is "foo\n" two lines? Generally we want - // to care about newlines when deciding whether content differs. + // Ensure that lhs_src and rhs_src both have trailing + // newlines. // - // Ending a file with a trailing newline is extremely common - // though. If both files have a trailing newline, consider "foo\n" - // to be "foo" so we don't end up displaying a blank line on both - // sides. - if lhs_src.ends_with('\n') && rhs_src.ends_with('\n') { - lhs_src.pop(); - rhs_src.pop(); + // This is important when textually diffing files that don't have + // a trailing newline, e.g. "foo\n\bar\n" versus "foo". We want to + // consider `foo` to be unchanged in this case. + // + // Theoretically a tree-sitter parser coud change its AST due to + // the additional trailing newline, but it seems vanishingly + // unlikely. + if !lhs_src.is_empty() && !lhs_src.ends_with('\n') { + lhs_src.push('\n'); + } + if !rhs_src.is_empty() && !rhs_src.ends_with('\n') { + rhs_src.push('\n'); } let mut extra_info = renamed;