1*f6217f89SApple OSS Distributions#!/bin/bash 2*f6217f89SApple OSS Distributions 3*f6217f89SApple OSS Distributions# 4*f6217f89SApple OSS Distributions# Abort a commit if the code style is incorrect. 5*f6217f89SApple OSS Distributions# 6*f6217f89SApple OSS Distributions 7*f6217f89SApple OSS DistributionsDENYLIST=tools/uncrustify-denylist 8*f6217f89SApple OSS DistributionsUNCRUSTIFY="$(xcrun -f uncrustify)" 9*f6217f89SApple OSS Distributions 10*f6217f89SApple OSS Distributionsif git rev-parse --verify HEAD >/dev/null 2>&1 ; then 11*f6217f89SApple OSS Distributions printf >&2 "Validating code style diff against previous commit...\n" 12*f6217f89SApple OSS Distributions against=HEAD 13*f6217f89SApple OSS Distributionselse 14*f6217f89SApple OSS Distributions # Initial commit: diff against an empty tree object 15*f6217f89SApple OSS Distributions printf >&2 "Validating code style diff for entire source tree...\n" 16*f6217f89SApple OSS Distributions against=$(git hash-object -t tree /dev/null) 17*f6217f89SApple OSS Distributionsfi 18*f6217f89SApple OSS Distributions 19*f6217f89SApple OSS Distributionsdiff_with_stdin() 20*f6217f89SApple OSS Distributions{ 21*f6217f89SApple OSS Distributions if which colordiff >/dev/null 2>&1; then 22*f6217f89SApple OSS Distributions diff -u "$1" - | colordiff 23*f6217f89SApple OSS Distributions else 24*f6217f89SApple OSS Distributions diff -u "$1" - 25*f6217f89SApple OSS Distributions fi 26*f6217f89SApple OSS Distributions} 27*f6217f89SApple OSS Distributions 28*f6217f89SApple OSS Distributions# Keep track of offending files 29*f6217f89SApple OSS Distributionsstaged_paths_with_format_errors=() 30*f6217f89SApple OSS Distributions 31*f6217f89SApple OSS Distributions# Note that we exclude staged deletions via --diff-filter 32*f6217f89SApple OSS Distributionsfor path in $(git diff --staged --name-only --diff-filter="d" $against); do 33*f6217f89SApple OSS Distributions # Parse our deny-list to find what to skip 34*f6217f89SApple OSS Distributions while IFS= read -r deny_path; do 35*f6217f89SApple OSS Distributions # Skip empty lines and comments 36*f6217f89SApple OSS Distributions if [[ -z "$deny_path" || "$deny_path" == \#* ]]; then 37*f6217f89SApple OSS Distributions continue 38*f6217f89SApple OSS Distributions fi 39*f6217f89SApple OSS Distributions 40*f6217f89SApple OSS Distributions # (Prepend ./ to the path in question to match the format used in the denylist) 41*f6217f89SApple OSS Distributions # Note that excluded directories must specify a trailing slash (or the latter string here needs tweaking) 42*f6217f89SApple OSS Distributions if [[ "./$path" == "$deny_path" || "./$path" == "$deny_path"* ]]; then 43*f6217f89SApple OSS Distributions # (Continue outer loop of files to be committed) 44*f6217f89SApple OSS Distributions continue 2 45*f6217f89SApple OSS Distributions fi 46*f6217f89SApple OSS Distributions done < "$DENYLIST" 47*f6217f89SApple OSS Distributions 48*f6217f89SApple OSS Distributions # Skip non-C/++ files 49*f6217f89SApple OSS Distributions case "$path" in 50*f6217f89SApple OSS Distributions *.c|*.h|*.cpp) 51*f6217f89SApple OSS Distributions ;; 52*f6217f89SApple OSS Distributions *) 53*f6217f89SApple OSS Distributions continue 54*f6217f89SApple OSS Distributions ;; 55*f6217f89SApple OSS Distributions esac 56*f6217f89SApple OSS Distributions 57*f6217f89SApple OSS Distributions printf >&2 "Validating code style for $path: " 58*f6217f89SApple OSS Distributions 59*f6217f89SApple OSS Distributions if "$UNCRUSTIFY" -q -c tools/xnu-uncrustify.cfg --check -f "$path" >/dev/null 2>&1; then 60*f6217f89SApple OSS Distributions printf >&2 "\e[1;32mok\e[0m.\n" 61*f6217f89SApple OSS Distributions else 62*f6217f89SApple OSS Distributions printf >&2 "\e[1;31minvalid style\e[0m.\n" 63*f6217f89SApple OSS Distributions "$UNCRUSTIFY" -q -c tools/xnu-uncrustify.cfg -f "$path" | diff_with_stdin "$path" 64*f6217f89SApple OSS Distributions staged_paths_with_format_errors+=($path) 65*f6217f89SApple OSS Distributions fi 66*f6217f89SApple OSS Distributionsdone 67*f6217f89SApple OSS Distributions 68*f6217f89SApple OSS Distributionsif [ ${#staged_paths_with_format_errors[@]} -ne 0 ]; then 69*f6217f89SApple OSS Distributions path_list="${staged_paths_with_format_errors[*]}" 70*f6217f89SApple OSS Distributions printf >&2 "\e[1;31mSome files have invalid code style, aborting commit. To reformat:\n" 71*f6217f89SApple OSS Distributions printf >&2 "$ $UNCRUSTIFY -q -c tools/xnu-uncrustify.cfg --replace --no-backup $path_list\e[0m\n" 72*f6217f89SApple OSS Distributions exit 1 73*f6217f89SApple OSS Distributionsfi 74*f6217f89SApple OSS Distributions 75*f6217f89SApple OSS Distributionsexit 0 76