Skip to content

Commit 7efec83

Browse files
authored
Merge pull request #271 from pre-commit/dont_modify_end_of_file
Don't add end-of-file newline while trimming whitespace
2 parents 2f8b625 + 38e02ff commit 7efec83

File tree

2 files changed

+28
-23
lines changed

2 files changed

+28
-23
lines changed

pre_commit_hooks/trailing_whitespace_fixer.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,19 @@ def _fix_file(filename, is_markdown):
1919

2020

2121
def _process_line(line, is_markdown):
22+
if line[-2:] == b'\r\n':
23+
eol = b'\r\n'
24+
elif line[-1:] == b'\n':
25+
eol = b'\n'
26+
else:
27+
eol = b''
2228
# preserve trailing two-space for non-blank lines in markdown files
23-
eol = b'\r\n' if line[-2:] == b'\r\n' else b'\n'
2429
if is_markdown and (not line.isspace()) and line.endswith(b' ' + eol):
2530
return line.rstrip() + b' ' + eol
2631
return line.rstrip() + eol
2732

2833

29-
def fix_trailing_whitespace(argv=None):
34+
def main(argv=None):
3035
parser = argparse.ArgumentParser()
3136
parser.add_argument(
3237
'--no-markdown-linebreak-ext',
@@ -77,4 +82,4 @@ def fix_trailing_whitespace(argv=None):
7782

7883

7984
if __name__ == '__main__':
80-
sys.exit(fix_trailing_whitespace())
85+
sys.exit(main())

tests/trailing_whitespace_fixer_test.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import pytest
55

6-
from pre_commit_hooks.trailing_whitespace_fixer import fix_trailing_whitespace
6+
from pre_commit_hooks.trailing_whitespace_fixer import main
77

88

99
@pytest.mark.parametrize(
@@ -16,29 +16,37 @@
1616
def test_fixes_trailing_whitespace(input_s, expected, tmpdir):
1717
path = tmpdir.join('file.txt')
1818
path.write(input_s)
19-
assert fix_trailing_whitespace((path.strpath,)) == 1
19+
assert main((path.strpath,)) == 1
2020
assert path.read() == expected
2121

2222

23+
def test_ok_no_newline_end_of_file(tmpdir):
24+
filename = tmpdir.join('f')
25+
filename.write_binary(b'foo\nbar')
26+
ret = main((filename.strpath,))
27+
assert filename.read_binary() == b'foo\nbar'
28+
assert ret == 0
29+
30+
2331
def test_ok_with_dos_line_endings(tmpdir):
2432
filename = tmpdir.join('f')
2533
filename.write_binary(b'foo\r\nbar\r\nbaz\r\n')
26-
ret = fix_trailing_whitespace((filename.strpath,))
34+
ret = main((filename.strpath,))
2735
assert filename.read_binary() == b'foo\r\nbar\r\nbaz\r\n'
2836
assert ret == 0
2937

3038

3139
def test_markdown_ok(tmpdir):
3240
filename = tmpdir.join('foo.md')
3341
filename.write_binary(b'foo \n')
34-
ret = fix_trailing_whitespace((filename.strpath,))
42+
ret = main((filename.strpath,))
3543
assert filename.read_binary() == b'foo \n'
3644
assert ret == 0
3745

3846

3947
# filename, expected input, expected output
4048
MD_TESTS_1 = (
41-
('foo.md', 'foo \nbar \n ', 'foo \nbar\n\n'),
49+
('foo.md', 'foo \nbar \n ', 'foo \nbar\n'),
4250
('bar.Markdown', 'bar \nbaz\t\n\t\n', 'bar \nbaz\n\n'),
4351
('.md', 'baz \nquux \t\n\t\n', 'baz\nquux\n\n'),
4452
('txt', 'foo \nbaz \n\t\n', 'foo\nbaz\n\n'),
@@ -49,7 +57,7 @@ def test_markdown_ok(tmpdir):
4957
def test_fixes_trailing_markdown_whitespace(filename, input_s, output, tmpdir):
5058
path = tmpdir.join(filename)
5159
path.write(input_s)
52-
ret = fix_trailing_whitespace([path.strpath])
60+
ret = main([path.strpath])
5361
assert ret == 1
5462
assert path.read() == output
5563

@@ -68,16 +76,14 @@ def test_fixes_trailing_markdown_whitespace(filename, input_s, output, tmpdir):
6876
def test_markdown_linebreak_ext_opt(filename, input_s, output, tmpdir):
6977
path = tmpdir.join(filename)
7078
path.write(input_s)
71-
ret = fix_trailing_whitespace((
72-
'--markdown-linebreak-ext=TxT', path.strpath,
73-
))
79+
ret = main(('--markdown-linebreak-ext=TxT', path.strpath))
7480
assert ret == 1
7581
assert path.read() == output
7682

7783

7884
# filename, expected input, expected output
7985
MD_TESTS_3 = (
80-
('foo.baz', 'foo \nbar \n ', 'foo \nbar\n\n'),
86+
('foo.baz', 'foo \nbar \n ', 'foo \nbar\n'),
8187
('bar', 'bar \nbaz\t\n\t\n', 'bar \nbaz\n\n'),
8288
)
8389

@@ -87,17 +93,15 @@ def test_markdown_linebreak_ext_opt_all(filename, input_s, output, tmpdir):
8793
path = tmpdir.join(filename)
8894
path.write(input_s)
8995
# need to make sure filename is not treated as argument to option
90-
ret = fix_trailing_whitespace([
91-
'--markdown-linebreak-ext=*', path.strpath,
92-
])
96+
ret = main(('--markdown-linebreak-ext=*', path.strpath))
9397
assert ret == 1
9498
assert path.read() == output
9599

96100

97101
@pytest.mark.parametrize(('arg'), ('--', 'a.b', 'a/b'))
98102
def test_markdown_linebreak_ext_badopt(arg):
99103
with pytest.raises(SystemExit) as excinfo:
100-
fix_trailing_whitespace(['--markdown-linebreak-ext', arg])
104+
main(['--markdown-linebreak-ext', arg])
101105
assert excinfo.value.code == 2
102106

103107

@@ -112,19 +116,15 @@ def test_markdown_linebreak_ext_badopt(arg):
112116
def test_no_markdown_linebreak_ext_opt(filename, input_s, output, tmpdir):
113117
path = tmpdir.join(filename)
114118
path.write(input_s)
115-
ret = fix_trailing_whitespace(['--no-markdown-linebreak-ext', path.strpath])
119+
ret = main(['--no-markdown-linebreak-ext', path.strpath])
116120
assert ret == 1
117121
assert path.read() == output
118122

119123

120-
def test_returns_zero_for_no_changes():
121-
assert fix_trailing_whitespace([__file__]) == 0
122-
123-
124124
def test_preserve_non_utf8_file(tmpdir):
125125
non_utf8_bytes_content = b'<a>\xe9 \n</a>\n'
126126
path = tmpdir.join('file.txt')
127127
path.write_binary(non_utf8_bytes_content)
128-
ret = fix_trailing_whitespace([path.strpath])
128+
ret = main([path.strpath])
129129
assert ret == 1
130130
assert path.size() == (len(non_utf8_bytes_content) - 1)

0 commit comments

Comments
 (0)