#!/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)\>.*\' added_lines; then fail No new uses of six fi if grep -E '\' 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 '\' added_lines; then fail No new uses of future fi if grep -E '\<(from|import)\>.*\' added_lines; then fail Use of past library not allowed fi if grep -E '\ 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 '\.*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