Salome HOME
Implement pre-commit Git hook to check CRLF line endings (issue #1837)
authorazv <azv@opencascade.com>
Wed, 30 Nov 2016 14:46:30 +0000 (17:46 +0300)
committerazv <azv@opencascade.com>
Wed, 30 Nov 2016 14:51:44 +0000 (17:51 +0300)
.gitattributes [new file with mode: 0644]
CMakeLists.txt
GitHooks/pre-commit.in [new file with mode: 0644]

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..daafb86
--- /dev/null
@@ -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
index 561697239a975485863f04c2e8cd79cb191a7411..3cd0e3bf0baa92985e4e8444bbf7662aea0a652c 100644 (file)
@@ -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 (file)
index 0000000..52e778f
--- /dev/null
@@ -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