From 203735ecf7d3418d47fc4632b814d0fed7ca7c8f Mon Sep 17 00:00:00 2001 From: Edoardo Bezzeccheri Date: Wed, 7 May 2025 09:00:23 +0000 Subject: [PATCH] Edge case with mixed endings Added case for which the file has mixed line endings. In this case, default into using LF for end of file line. --- pre_commit_hooks/end_of_file_fixer.py | 7 +++++-- tests/end_of_file_fixer_test.py | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pre_commit_hooks/end_of_file_fixer.py b/pre_commit_hooks/end_of_file_fixer.py index 2f397eb..6bb452e 100644 --- a/pre_commit_hooks/end_of_file_fixer.py +++ b/pre_commit_hooks/end_of_file_fixer.py @@ -20,10 +20,13 @@ def fix_file(file_obj: IO[bytes]) -> int: last_character = file_obj.read(1) # last_character will be '' for an empty file if last_character not in {LF, CR} and last_character != b'': - # Check if file uses CRLF endings + # Check for consistent CRLF usage file_obj.seek(0, os.SEEK_SET) content = file_obj.read() - ending = CRLF if CRLF in content else LF + lf_count = content.count(LF) + crlf_count = content.count(CRLF) + # Use CRLF only if all line endings are CRLF + ending = CRLF if crlf_count > 0 and crlf_count == lf_count else LF # Needs this seek for windows, otherwise IOError file_obj.seek(0, os.SEEK_END) file_obj.write(ending) diff --git a/tests/end_of_file_fixer_test.py b/tests/end_of_file_fixer_test.py index 05fdade..00544d8 100644 --- a/tests/end_of_file_fixer_test.py +++ b/tests/end_of_file_fixer_test.py @@ -19,6 +19,7 @@ TESTS = ( (b'\xe2\x98\x83', 1, b'\xe2\x98\x83\n'), (b'foo\r\n', 0, b'foo\r\n'), (b'foo\r\nbar', 1, b'foo\r\nbar\r\n'), + (b'foo\nbar\r\nbaz', 1, b'foo\nbar\r\nbaz\n'), (b'foo\r\n\r\n\r\n', 1, b'foo\r\n'), (b'foo\r', 0, b'foo\r'), (b'foo\r\r\r\r', 1, b'foo\r'),