diff options
Diffstat (limited to 'tools/style-check.sh')
-rwxr-xr-x | tools/style-check.sh | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/tools/style-check.sh b/tools/style-check.sh new file mode 100755 index 0000000..479f7bb --- /dev/null +++ b/tools/style-check.sh @@ -0,0 +1,99 @@ +#!/bin/sh -u +# tools/style-check.sh -- for conformance or --fix to conform +# Copyright (C) 2017 Olaf Meeuwissen +# +# License: GPL-3.0+ + +check_final_newline() { + test x = "x$(tail -c 1 $1)" +} + +insert_final_newline() { + check_final_newline $1 || echo >> $1 +} + +check_trailing_whitespace() { + test -z "$(sed -n '/[ \t]$/{p;q}' $1)" +} + +trim_trailing_whitespace() { + sed -i 's/[ \t]*$//' $1 +} + +check_trailing_blank_lines() { + test -z "$(sed -n '${/^$/s/^/blank/p}' $1)" +} + +trim_trailing_blank_lines() { + sed -i -e :a -e '/^\n*$/{$d;N;};/\n$/ba' $1 +} + +check_leading_blank_lines() { + test -z "$(sed -n '1{/^$/s/^/blank/p;q}' $1)" +} + +trim_leading_blank_lines() { + sed -i '/./,$!d' $1 +} + +check_utf_8_charset() { + err=$(iconv -f utf-8 -t utf-8 < $1 2>&1 > /dev/null) + if test x != "x$err"; then + echo "charset not UTF-8: $1" >&2 + echo "$err" >&2 + return 1 + fi +} + +fix=false +case $1 in + --fix) fix=true; shift;; +esac + +status=0 +for file in "$@"; do + test -d $file && continue # skip directories, just in case + file=$(echo $file | sed 's,^\.\/,,') + case $file in + COPYING) ;; # hands off of the GPL + *.gif) ;; # don't touch image files + *.jpg) ;; + *.png) ;; + *.pnm) ;; + *.patch) ;; # patch output may have trailing lines or whitespace + Makefile.in) ;; # skip automake outputs + */Makefile.in) ;; + aclocal.m4) ;; # skip autoconf outputs + include/sane/config.h.in) ;; + m4/libtool.m4) ;; # courtesy of libtool + m4/lt~obsolete.m4) ;; + ABOUT-NLS) ;; # courtesy of gettext + doc/doxygen-*.conf.in) ;; # don't fix doxygen -g comments + + *) + if `$fix`; then + trim_trailing_whitespace $file + insert_final_newline $file + trim_trailing_blank_lines $file + else + if ! check_trailing_whitespace $file; then + status=1 + echo "trailing whitespace: $file" >&2 + fi + if ! check_final_newline $file; then + status=1 + echo "final newline missing: $file" >&2 + fi + if ! check_trailing_blank_lines $file; then + status=1 + echo "trailing blank lines: $file" >&2 + fi + if ! check_utf_8_charset $file; then + status=1 + fi + fi + ;; + esac +done + +exit $status |