mirror of
https://github.com/pre-commit/pre-commit-hooks.git
synced 2026-04-04 19:26:52 +00:00
Added end of file fixer hook.
This commit is contained in:
parent
be8b296a0a
commit
57f1533b84
4 changed files with 118 additions and 0 deletions
70
pre_commit_hooks/end_of_file_fixer.py
Normal file
70
pre_commit_hooks/end_of_file_fixer.py
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
from __future__ import print_function
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
from pre_commit_hooks.util import entry
|
||||
|
||||
|
||||
def fix_file(file_obj):
|
||||
# Test for newline at end of file
|
||||
# Empty files will throw IOError here
|
||||
try:
|
||||
file_obj.seek(-1, os.SEEK_END)
|
||||
except IOError:
|
||||
return 0
|
||||
last_character = file_obj.read(1)
|
||||
# last_character will be '' for an empty file
|
||||
if last_character != '\n' and last_character != '':
|
||||
file_obj.write('\n')
|
||||
return 1
|
||||
|
||||
while last_character == '\n':
|
||||
# Deal with the beginning of the file
|
||||
if file_obj.tell() == 1:
|
||||
# If we've reached the beginning of the file and it is all
|
||||
# linebreaks then we can make this file empty
|
||||
file_obj.seek(0)
|
||||
file_obj.truncate()
|
||||
return 1
|
||||
|
||||
# Go back two bytes and read a character
|
||||
file_obj.seek(-2, os.SEEK_CUR)
|
||||
last_character = file_obj.read(1)
|
||||
|
||||
# Our current position is at the end of the file just before any amount of
|
||||
# newlines. If we read two characters and get two newlines back we know
|
||||
# there are extraneous newlines at the ned of the file. Then backtrack and
|
||||
# trim the end off.
|
||||
if len(file_obj.read(2)) == 2:
|
||||
file_obj.seek(-1, os.SEEK_CUR)
|
||||
file_obj.truncate()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
@entry
|
||||
def end_of_file_fixer(argv):
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('filenames', nargs='*', help='Filenames to fix')
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
retv = 0
|
||||
|
||||
for filename in args.filenames:
|
||||
# Read as binary so we can read byte-by-byte
|
||||
with open(filename, 'rb+') as file_obj:
|
||||
ret_for_file = fix_file(file_obj)
|
||||
if ret_for_file:
|
||||
print('Fixing {0}'.format(filename))
|
||||
retv |= ret_for_file
|
||||
|
||||
return retv
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(end_of_file_fixer())
|
||||
Loading…
Add table
Add a link
Reference in a new issue