chirp/tools/check_commit.sh
Finn Thain 6ff333968a Improve regexps to avoid some false positives
Commit fbcca4a9d1 changed a grep command in an attempt to prevent a
false positive, that is, to prevent grep from matching python code not
actually using the banned 'past' module. Problem is, (?!e) is not valid
syntax unless grep was compiled with support for Perl Compatible Regular
Expressions. However, we can use extended regexp syntax to avoid the
false positive. While we're at it, let's make similar improvements to
the other regular expressions to prevent more false positives.
2026-07-02 15:51:11 -07:00

141 lines
4.1 KiB
Bash
Executable file

#!/bin/bash
BASE=${1:-origin/master}
RETCODE=0
RED='\033[1;31m'
GREEN='\033[1;32m'
NC='\033[0m'
function fail() {
echo -e "${RED}$*${NC}"
RETCODE=1
}
echo -e "${GREEN}Checking from $(git rev-parse --short ${BASE}):${NC}"
git log --pretty=oneline --no-merges --abbrev-commit ${BASE}..
echo
git diff ${BASE}.. -- '*.py' | grep '^+' > added_lines
git diff ${BASE}.. -- 'chirp/drivers/*.py' | grep '^+' > driver_lines
if grep -E '\<(from|import)\>.*\<six\>' added_lines; then
fail No new uses of six
fi
if grep -E '\<six\>' added_lines; then
fail No new uses of six
fi
if grep -E '\<(from|import)\>.*builtins' added_lines; then
fail No new uses of future
fi
if grep -E '\<future\>' added_lines; then
fail No new uses of future
fi
if grep -E '\<(from|import)\>.*\<past\>' added_lines; then
fail Use of past library not allowed
fi
if grep -E '\<MemoryMap\(' added_lines; then
fail New uses of MemoryMap should be MemoryMapBytes
fi
if grep -E "[^_]_\([^\"']" added_lines; then
fail 'Translated strings must be literals!'
fi
if grep -E "\<eval\(" added_lines; then
fail 'Use of eval() is dangerous and not permitted!'
fi
if git diff ${BASE}.. -- 'tools/cpep8.manifest' | tail -n +5 | grep -q '^+'; then
fail 'Do not add new files to cpep8.manifest; no longer needed'
fi
if git diff ${BASE}.. -- 'tools/cpep8.blacklist' | tail -n +5 | grep -q '^+'; then
fail 'Do not add new files to cpep8.blacklist; fix the code'
fi
grep -i 'license' added_lines > license_lines
if grep -ivE '(GNU General Public License|Free Software Foundation|gnu.org.licenses)' license_lines; then
fail 'Files must be GPLv3 licensed (or not contain any license language)'
fi
for file in $(git diff --name-only ${BASE}..); do
if file $file | grep -q CRLF; then
fail "$file : Files should be LF (Unix) format, not CR (Mac) or CRLF (Windows)"
fi
done
#if grep 'def match_model' added_lines; then
# fail 'New drivers should not have match_model() implemented as it is not needed'
#fi
if grep -E '\<print\(' added_lines; then
fail 'Do not use print()'
fi
if grep -E '\<(from|import)\>.*wx' driver_lines; then
fail 'Drivers may not import GUI components or manipulate the GUI'
fi
if grep -E '(subprocess|webbrowser)' driver_lines; then
fail 'Drivers may not spawn external commands'
fi
if git log ${BASE}.. --merges | grep .; then
fail Please do not include merge commits in your PR
fi
make -C chirp/locale clean all >/dev/null 2>&1
if git diff -- chirp/locale | grep '^+[^#+]' | grep -v POT-Creation; then
fail Locale files need updating
fi
added_files=$(git diff --name-only --diff-filter=A ${BASE}..)
added_py=$(git diff --name-only --diff-filter=A ${BASE}.. | grep '\.py$')
if echo $added_py | grep -q chirp.drivers && ! echo $added_files | grep -q tests.images; then
fail All new drivers should include a test image
fi
modified_files=$(git diff --name-only --diff-filter=M ${BASE}..)
modified_img=$(echo "$modified_files" | grep 'tests.images')
modified_py=$(echo "$modified_files" | grep '\.py$')
if [ "$modified_img" -a "$modified_py" ]; then
fail "Change modifies an image and (potentially) a driver for a possible upgrade breakage"
fi
existing_drivers=$(git ls-tree --name-only $BASE -- chirp/drivers/)
limit=51
for nf in $added_py; do
for of in $existing_drivers; do
common=$(wdiff -s $of $nf | grep -I $nf | sed -r 's/.* ([0-9]+)% common.*/\1/')
if [ ! "$common" ]; then
continue
fi
if [ "$common" -gt "$limit" ]; then
fail "New file $nf shares at least ${common}% with $of!"
fi
done
done
rm -f added_lines license_lines
commits=$(git log --pretty=format:%h ${BASE}..)
for commit in $commits; do
git log -n1 $commit --pretty=format:%B > commit_msg
if [[ `sed -n '1p' commit_msg | wc -c` > 99 ]]; then
fail "First line of commit message of $commit must be <99 chars"
fi
if [[ `wc -l < commit_msg` > 1 ]]; then
if ! sed -n '2p' commit_msg | grep '^$'; then
fail "Second line of commit message of $commit must be blank for proper formatting in the notification emails"
fi
fi
rm -f commit_msg
done
exit $RETCODE