xref: /xnu-12377.1.9/tools/pre-commit.sh (revision f6217f891ac0bb64f3d375211650a4c1ff8ca1ea)
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