Add a git hook to ensure that all commits adhere to the copyright header
[arvados-dev.git] / git / hooks / check-copyright-headers.sh
1 #!/bin/bash
2 # Copyright (C) The Arvados Authors. All rights reserved.
3 #
4 # SPDX-License-Identifier: AGPL-3.0
5
6 # This script is intended to be run as a git update hook. It ensures that all
7 # commits adhere to the copyright header convention for the Arvados project,
8 # which is documented at
9 #
10 #    https://dev.arvados.org/projects/arvados/wiki/Coding_Standards#Copyright-headers
11
12 REFNAME=$1
13 OLDREV=$2
14 NEWREV=$3
15
16 EXITCODE=0
17
18 # Load the .licenseignore file
19 LICENSEIGNORE=`mktemp`
20 git show ${NEWREV}:.licenseignore > "${LICENSEIGNORE}" 2>/dev/null
21 if [[ "$?" != "0" ]]; then
22   # e.g., .licenseignore does not exist
23   ignores=()
24 else
25   IFS=$'\n' read -a ignores -r -d $'\000' < "$LICENSEIGNORE" || true
26 fi
27 rm -f $LICENSEIGNORE
28
29 oldIFS="$IFS"
30 IFS=$'\n'
31 for rev in $(git rev-list --objects $2..$3 | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)'| sed -n 's/^blob //p'); do
32
33   IFS="$oldIFS" read -r -a array <<<"$rev"
34   sha=${array[0]}
35   fnm=${array[2]}
36
37   # Make sure to skip files that match patterns in .licenseignore
38   ignore=
39   for pattern in "${ignores[@]}"; do
40     if [[ ${fnm} == ${pattern} ]]; then
41       ignore=1
42     fi
43   done
44   if [[ ${ignore} = 1 ]]; then continue; fi
45
46   HEADER=`git show ${sha} | head -n20 | egrep -A3 -B1 'Copyright.*Arvados'`
47
48   if [[ ! "$HEADER" =~ "SPDX-License-Identifier:" ]]; then
49     if [[ "$EXITCODE" == "0" ]]; then
50       echo
51       echo "ERROR"
52       echo
53     fi
54     echo "missing or invalid copyright header in file ${fnm}"
55     EXITCODE=1
56   fi
57 done
58 IFS="$oldIFS"
59
60 if [[ "$EXITCODE" != "0" ]]; then
61   echo
62   echo "[POLICY] all files must contain copyright headers, for more information see"
63   echo
64   echo "          https://dev.arvados.org/projects/arvados/wiki/Coding_Standards#Copyright-headers"
65   echo
66   exit $EXITCODE
67 fi