#!/bin/bash DIR="${BASH_SOURCE%/*}" # if no CHECKPATCH is explicitly given by the environment, try to # locate checkpatch.pl: first take the one from the path, then check # for a local copy of the linux headers, finally try sources downloaded # with OP-TEE (for QEMU) if [ -z "$CHECKPATCH" ]; then CHECKPATCH=$(command -v checkpatch.pl) fi if [ -z "$CHECKPATCH" ]; then CHECKPATCH=$(find /usr/src/linux-headers* -name checkpatch.pl -print -quit) fi if [ -z "$CHECKPATCH" ]; then CHECKPATCH=$(find "$PWD/../linux" -name checkpatch.pl -print -quit) fi source "$DIR/checkpatch_inc.sh" hash $CHECKPATCH 2>/dev/null || { echo >&2 "Could not find checkpatch.pl, aborting"; exit 1; } help() { cat <<-EOF Usage: checkpatch.sh [--working] checkpatch.sh ... checkpatch.sh ... checkpatch.sh --diff checkpatch.sh --cached checkpatch.sh --help Args: Any commit or any number of commits. Any number of Git Revision Selections. (requires git v2.19) https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection Options: --working Check the working area [Default]. --cached Check the staging area. --diff Check the diff between commit1 and commit2. --help Print this help message. Examples: checkpatch.sh commit1 commit2 commit3 Check commit1, commit2, and commit3. checkpatch.sh HEAD~5 Check the commit 5 revisions before the current HEAD. checkpatch.sh commit1..^commit2 Check each commit from commit1 to commit2 inclusively. (requires git v2.19) checkpatch.sh HEAD~5..HEAD~1 Check each commit from HEAD~5 to HEAD~1 exclusively, aka not including HEAD~1. (requires git v2.19) checkpatch.sh commit1...tags/tag1 Check each commit that exists exclusively within the history of only one of each given revision. (requires git v2.19) checkpatch.sh HEAD~10-5 Check 5 commits moving forward in history starting from HEAD~10. (requires git v2.19) checkpatch.sh branch1 tags/tag1 Check the HEAD of branch1 and the HEAD of tag1. (requires git v2.19) EOF exit 1 } op=${1:---working} case "$op" in --cached) echo "Checking staging area: " checkstaging ;; --diff) echo "Checking diff (diff $1...$2)" checkdiff "$2" "$3" ;; --working) echo "Checking working area: " checkworking ;; --help|-h) help ;; *) echo "Checking commit(s):" read -r MAJOR MINOR < <(git --version | awk -F '[. ]' '{print $3, $4}') if (( MAJOR < 2 )) || (( MAJOR == 2 && MINOR < 19 )); then for c in "$@"; do checkpatch "$c"; done else for arg in "$@"; do # parse the argument into a git object or list of git objects object="$(git rev-parse "${arg}")" || continue # run checkpatch if the parsed argument represents a single commit hash if git cat-file -e "${object}" 2>/dev/null; then checkpatch "${object}" else # expand the object list and run checkpatch on each commit id commits="$(echo "${object}" | git rev-list --stdin)" for c in ${commits}; do checkpatch "$c"; done fi done fi ;; esac