mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-16 04:32:33 +00:00
48 lines
3.5 KiB
Bash
Executable File
48 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# For code formatting we have clang-format.
|
|
#
|
|
# But it's not sane to apply clang-format for whole code base,
|
|
# because it sometimes makes worse for properly formatted files.
|
|
#
|
|
# It's only reasonable to blindly apply clang-format only in cases
|
|
# when the code is likely to be out of style.
|
|
#
|
|
# For this purpose we have a script that will use very primitive heuristics
|
|
# (simple regexps) to check if the code is likely to have basic style violations.
|
|
# and then to run formatter only for the specified files.
|
|
|
|
ROOT_PATH=$(git rev-parse --show-toplevel)
|
|
EXCLUDE_DIRS='build/|integration/|widechar_width/|glibc-compatibility/|memcpy/|consistent-hashing'
|
|
|
|
find $ROOT_PATH/{dbms,base} -name '*.h' -or -name '*.cpp' 2>/dev/null |
|
|
grep -vP $EXCLUDE_DIRS |
|
|
xargs grep $@ -P '((class|struct|namespace|enum|if|for|while|else|throw|switch).*|\)(\s*const)?(\s*override)?\s*)\{$|\s$|\t|^ {1,3}[^\* ]\S|\t|^\s*(if|else if|if constexpr|else if constexpr|for|while|catch|switch)\(|\( [^\s\\]|\S \)' |
|
|
# a curly brace not in a new line, but not for the case of C++11 init or agg. initialization | trailing whitespace | number of ws not a multiple of 4, but not in the case of comment continuation | a tab character | missing whitespace after for/if/while... before opening brace | whitespaces inside braces
|
|
grep -v -P '(//|:\s+\*|\$\(\()| \)"'
|
|
# single-line comment | continuation of a multiline comment | a typical piece of embedded shell code | something like ending of raw string literal
|
|
|
|
# // namespace comments are unneeded
|
|
find $ROOT_PATH/{dbms,base} -name '*.h' -or -name '*.cpp' 2>/dev/null |
|
|
grep -vP $EXCLUDE_DIRS |
|
|
xargs grep $@ -P '}\s*//+\s*namespace\s*'
|
|
|
|
# Broken symlinks
|
|
find -L $ROOT_PATH -type l 2>/dev/null | grep -v contrib && echo "^ Broken symlinks found"
|
|
|
|
# Double whitespaces
|
|
find $ROOT_PATH/{dbms,base} -name '*.h' -or -name '*.cpp' 2>/dev/null | while read i; do $ROOT_PATH/utils/check-style/double-whitespaces.pl < $i || echo -e "^ File $i contains double whitespaces\n"; done
|
|
|
|
# Unused ErrorCodes
|
|
# NOTE: to fix automatically, replace echo with:
|
|
# sed -i "/extern const int $code/d" $file
|
|
find $ROOT_PATH/{dbms,base} -name '*.h' -or -name '*.cpp' | xargs grep -l -P 'extern const int [_A-Z]+' | while read file; do grep -P 'extern const int [_A-Z]+;' $file | sed -r -e 's/^.*?extern const int ([_A-Z]+);.*?$/\1/' | while read code; do grep -q "ErrorCodes::$code" $file || echo "ErrorCode $code is defined but not used in file $file"; done; done
|
|
|
|
# Undefined ErrorCodes
|
|
# NOTE: to fix automatically, replace echo with:
|
|
# ( grep -q -F 'namespace ErrorCodes' $file && sed -i -r "0,/(\s*)extern const int [_A-Z]+/s//\1extern const int $code;\n&/" $file || awk '{ print; if (ns == 1) { ns = 2 }; if (ns == 2) { ns = 0; print "namespace ErrorCodes\n{\n extern const int '$code';\n}" } }; /namespace DB/ { ns = 1; };' < $file > ${file}.tmp && mv ${file}.tmp $file )
|
|
find $ROOT_PATH/{dbms,base} -name '*.h' -or -name '*.cpp' | xargs grep -l -P 'ErrorCodes::[_A-Z]+' | while read file; do grep -P 'ErrorCodes::[_A-Z]+' $file | sed -r -e 's/^.*?ErrorCodes::([_A-Z]+).*?$/\1/' | while read code; do grep -q "extern const int $code" $file || echo "ErrorCode $code is used in file $file but not defined"; done; done
|
|
|
|
# Duplicate ErrorCodes
|
|
find $ROOT_PATH/{dbms,base} -name '*.h' -or -name '*.cpp' | xargs grep -l -P 'ErrorCodes::[_A-Z]+' | while read file; do grep -P 'extern const int [_A-Z]+;' $file | sort | uniq -c | grep -v -P ' +1 ' && echo "Duplicate ErrorCode in file $file"; done
|