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.
This commit is contained in:
Edoardo Bezzeccheri 2025-05-07 09:00:23 +00:00
parent c881808ed6
commit 203735ecf7
2 changed files with 6 additions and 2 deletions

View file

@ -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)

View file

@ -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'),