xref: /optee_os/scripts/checkpatch.sh (revision 228cf40e2ba89ab3d8afac3eba57e4563fd6c630)
1*228cf40eSRouven Czerwinski#!/usr/bin/env bash
21c93c2b5SIgor Opaniuk
31c93c2b5SIgor OpaniukDIR="${BASH_SOURCE%/*}"
41c93c2b5SIgor Opaniuk
533977c01SMarkus S. Wamser# if no CHECKPATCH is explicitly given by the environment, try to
633977c01SMarkus S. Wamser# locate checkpatch.pl: first take the one from the path, then check
733977c01SMarkus S. Wamser# for a local copy of the linux headers, finally try sources downloaded
833977c01SMarkus S. Wamser# with OP-TEE (for QEMU)
933977c01SMarkus S. Wamserif [ -z "$CHECKPATCH" ]; then
1033977c01SMarkus S. Wamser  CHECKPATCH=$(command -v checkpatch.pl)
1133977c01SMarkus S. Wamserfi
1233977c01SMarkus S. Wamserif [ -z "$CHECKPATCH" ]; then
1333977c01SMarkus S. Wamser  CHECKPATCH=$(find /usr/src/linux-headers* -name checkpatch.pl -print -quit)
1433977c01SMarkus S. Wamserfi
1533977c01SMarkus S. Wamserif [ -z "$CHECKPATCH" ]; then
1633977c01SMarkus S. Wamser  CHECKPATCH=$(find "$PWD/../linux" -name checkpatch.pl -print -quit)
1733977c01SMarkus S. Wamserfi
1833977c01SMarkus S. Wamser
191c93c2b5SIgor Opaniuksource "$DIR/checkpatch_inc.sh"
201c93c2b5SIgor Opaniuk
211c93c2b5SIgor Opaniukhash $CHECKPATCH 2>/dev/null ||
221c93c2b5SIgor Opaniuk		{ echo >&2 "Could not find checkpatch.pl, aborting"; exit 1; }
231c93c2b5SIgor Opaniuk
24bac79749SAndrew Musteahelp() {
25bac79749SAndrew Mustea  cat <<-EOF
26bac79749SAndrew MusteaUsage:
27bac79749SAndrew Mustea  checkpatch.sh [--working]
28bac79749SAndrew Mustea  checkpatch.sh <COMMIT>...
29bac79749SAndrew Mustea  checkpatch.sh <SELECTION>...
30bac79749SAndrew Mustea  checkpatch.sh --diff <COMMIT> <COMMIT>
31bac79749SAndrew Mustea  checkpatch.sh --cached
32bac79749SAndrew Mustea  checkpatch.sh --help
33bac79749SAndrew Mustea
34bac79749SAndrew MusteaArgs:
35bac79749SAndrew Mustea  <COMMIT>        Any commit or any number of commits.
36bac79749SAndrew Mustea  <SELECTION>     Any number of Git Revision Selections. (requires git v2.19)
37bac79749SAndrew Mustea                  https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection
38bac79749SAndrew Mustea
39bac79749SAndrew MusteaOptions:
40bac79749SAndrew Mustea  --working                     Check the working area [Default].
41bac79749SAndrew Mustea  --cached                      Check the staging area.
42bac79749SAndrew Mustea  --diff <commit1> <commit2>    Check the diff between commit1 and commit2.
43bac79749SAndrew Mustea  --help                        Print this help message.
44bac79749SAndrew Mustea
45bac79749SAndrew MusteaExamples:
46bac79749SAndrew Mustea  checkpatch.sh commit1 commit2 commit3   Check commit1, commit2, and commit3.
47bac79749SAndrew Mustea
48bac79749SAndrew Mustea  checkpatch.sh HEAD~5                    Check the commit 5 revisions before
49bac79749SAndrew Mustea                                          the current HEAD.
50bac79749SAndrew Mustea
51bac79749SAndrew Mustea  checkpatch.sh commit1..^commit2         Check each commit from commit1 to
52bac79749SAndrew Mustea                                          commit2 inclusively.
53bac79749SAndrew Mustea                                          (requires git v2.19)
54bac79749SAndrew Mustea
55bac79749SAndrew Mustea  checkpatch.sh HEAD~5..HEAD~1            Check each commit from HEAD~5 to
56bac79749SAndrew Mustea                                          HEAD~1 exclusively, aka not including
57bac79749SAndrew Mustea                                          HEAD~1. (requires git v2.19)
58bac79749SAndrew Mustea
59bac79749SAndrew Mustea  checkpatch.sh commit1...tags/tag1       Check each commit that exists
60bac79749SAndrew Mustea                                          exclusively within the history of
61bac79749SAndrew Mustea                                          only one of each given revision.
62bac79749SAndrew Mustea                                          (requires git v2.19)
63bac79749SAndrew Mustea
64bac79749SAndrew Mustea  checkpatch.sh HEAD~10-5                 Check 5 commits moving forward in
65bac79749SAndrew Mustea                                          history starting from HEAD~10.
66bac79749SAndrew Mustea                                          (requires git v2.19)
67bac79749SAndrew Mustea
68bac79749SAndrew Mustea  checkpatch.sh branch1 tags/tag1         Check the HEAD of branch1 and the
69bac79749SAndrew Mustea                                          HEAD of tag1. (requires git v2.19)
70bac79749SAndrew MusteaEOF
711c93c2b5SIgor Opaniuk  exit 1
721c93c2b5SIgor Opaniuk}
731c93c2b5SIgor Opaniuk
741c93c2b5SIgor Opaniukop=${1:---working}
751c93c2b5SIgor Opaniukcase "$op" in
761c93c2b5SIgor Opaniuk	--cached)
771c93c2b5SIgor Opaniuk		echo "Checking staging area:  "
781c93c2b5SIgor Opaniuk		checkstaging
791c93c2b5SIgor Opaniuk		;;
801c93c2b5SIgor Opaniuk	--diff)
811c93c2b5SIgor Opaniuk		echo "Checking diff (diff $1...$2)"
821c93c2b5SIgor Opaniuk		checkdiff "$2" "$3"
831c93c2b5SIgor Opaniuk		;;
841c93c2b5SIgor Opaniuk	--working)
851c93c2b5SIgor Opaniuk		echo "Checking working area:  "
861c93c2b5SIgor Opaniuk		checkworking
871c93c2b5SIgor Opaniuk		;;
881c93c2b5SIgor Opaniuk	--help|-h)
89bac79749SAndrew Mustea		help
901c93c2b5SIgor Opaniuk		;;
911c93c2b5SIgor Opaniuk	*)
92849b17bdSJerome Forissier		echo "Checking commit(s):"
9377571213SAndrew Mustea    read -r MAJOR MINOR < <(git --version | awk -F '[. ]' '{print $3, $4}')
9477571213SAndrew Mustea    if (( MAJOR < 2 )) || (( MAJOR == 2 && MINOR < 19 )); then
9577571213SAndrew Mustea      for c in "$@"; do checkpatch "$c"; done
9677571213SAndrew Mustea    else
9777571213SAndrew Mustea      for arg in "$@"; do
9877571213SAndrew Mustea        # parse the argument into a git object or list of git objects
9977571213SAndrew Mustea        object="$(git rev-parse "${arg}")" || continue
10077571213SAndrew Mustea        # run checkpatch if the parsed argument represents a single commit hash
10177571213SAndrew Mustea        if git cat-file -e "${object}" 2>/dev/null; then
10277571213SAndrew Mustea          checkpatch "${object}"
10377571213SAndrew Mustea        else
10477571213SAndrew Mustea          # expand the object list and run checkpatch on each commit id
10577571213SAndrew Mustea          commits="$(echo "${object}" | git rev-list --stdin)"
10677571213SAndrew Mustea          for c in ${commits}; do checkpatch "$c"; done
10777571213SAndrew Mustea        fi
10877571213SAndrew Mustea      done
10977571213SAndrew Mustea    fi
1101c93c2b5SIgor Opaniuk    ;;
1111c93c2b5SIgor Opaniuk
1121c93c2b5SIgor Opaniukesac
113