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