From c51da821be8aefe07af3fc63f244f86aaa50bc6e Mon Sep 17 00:00:00 2001 From: azv Date: Wed, 30 Nov 2016 17:46:30 +0300 Subject: [PATCH] Implement pre-commit Git hook to check CRLF line endings (issue #1837) --- .gitattributes | 46 ++++++++++++++++++++++++++++++ CMakeLists.txt | 6 ++++ GitHooks/pre-commit.in | 64 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 .gitattributes create mode 100644 GitHooks/pre-commit.in diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..daafb86b8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,46 @@ +.gitattributes eol=lf +.gitignore eol=lf +*.txt eol=lf +*.in eol=lf +*.h eol=lf +*.c eol=lf +*.inl eol=lf +*.cpp eol=lf +*.cxx eol=lf +*.hxx eol=lf +*.cls eol=lf +*.sty eol=lf +*.tex eol=lf +*.m eol=lf +*.sh eol=lf +*.csh eol=lf +*.workspace eol=lf +*.cbp eol=lf +*.svg eol=lf +*.dia eol=lf +*.xib eol=lf +*.plist eol=lf +*.java eol=lf +*.ts eol=lf +*.qml eol=lf +*.qrc eol=lf +*.bat eol=crlf +*.cmd eol=crlf +*.dll binary +*.so binary +*.dylib binary +*.7z binary +*.pdf binary +*.png binary +*.jpg binary +*.bmp binary +*.gif binary +*.xwd binary +*.ico binary +*.icns binary +*.std binary +*.gz binary +*.doc binary +*.rgb binary +*.mft binary +*.stl binary diff --git a/CMakeLists.txt b/CMakeLists.txt index 561697239..3cd0e3bf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,3 +115,9 @@ configure_file("${CMAKE_SOURCE_DIR}/CMakeCommon/cmake_uninstall.cmake.in" add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) endif (CMAKE_GENERATOR MATCHES "NMake Makefiles") + +# Add special Git hooks +if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + configure_file("${CMAKE_SOURCE_DIR}/GitHooks/pre-commit.in" + "${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit") +endif() diff --git a/GitHooks/pre-commit.in b/GitHooks/pre-commit.in new file mode 100644 index 000000000..52e778fdf --- /dev/null +++ b/GitHooks/pre-commit.in @@ -0,0 +1,64 @@ +#!/bin/bash + +function isDOSFile +{ + local FILENAME="$1" + file "$FILENAME" | grep -q "CRLF line terminators" +} + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +FOUND=0 +# If there are whitespace errors, print the offending file names and fail. +if [ "$(exec git diff-index --check --cached $against -- )" != "" ] +then + FOUND=1 +fi + +# Find files with DOS line endings +for FILE in $(exec git diff --name-only --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq) ; do + isDOSFile "$FILE" + if (( $? == 0 )) + then + echo "ERROR: \"$FILE\" has DOS line endings" >&2 + FOUND=1 + fi +done + +exit $FOUND -- 2.39.2