This is a script I wrote that hooks into git-commit, and automatically runs checkpatch and “git diff –check” on a commit. If any of these fail, the commit is rejected. (In case you are not already using it, checkpatch looks for common coding mistakes, and it facilitates better kernel code.)
In addition, the script sets file permissions for common files (c, h, makefile, readme) to 0644, and executables (directories, shell scripts) to 0755. This is a common issue when editing files in Windows.To install, save the script in your kernel GIT repository/ies under the $GIT_DIR/hooks directory (usually .git/hooks) as .git/hooks/pre-commit.
If you want to bypass the check (e.g. if the failure is intended), use the -n flag for git-commit to ignore the checks. Just be sure that you still resolve any failures that were correct, and there really wasn’t a better proper way to write your code without checkpatch errors. Now there is a whole set of discussion about the 80 character limit that sometime forces less understandable code (you can read about the pros/cons and find a patch to checkpatch to make this optional) BTW, Linus prefers in many cases to ignore the 80-char-limit warnings.But wait! You can do even more. Since you are already modifying files, why not run checkpatch on the whole file (and not just on the lines you are changing)? To see if there are any already existing checkpatch errors in the files that you modified, set up these two bash aliases that will run checkpatch on the whole files that are about to be committed (just run ‘chkp’ - NOTE: this will not work in an empty repository.):
alias gitd='git rev-parse --show-cdup'
alias chkp='`gitd`scripts/checkpatch.pl -f `git diff --name-only HEAD | awk -v i=$(gitd) "{print i\\$0}"`'
Let me know if you have any questions/suggestions.#!/bin/bash # # Run checkpatch.pl and fix permissions on what is about to be # committed. # # Written by Lajos Molnarbased on the sample git # pre-commit script. if git-rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # Change access modes on committed files - do this first so # we fix permissions even if there are errors for i in `git diff-index --cached --name-only $against` do name=${i##*/} # set permissions for common kernel files if echo $name \ | grep -Eq "^(README|Kconfig|Kbuild|Makefile|HOWTO|TODO|"\ "\.gitignore|.*\.(c|h|cpp|txt|S|xml|mk))$" then chmod 0644 $i git add $i # directories and scripts are executable elif [ -d $i ] \ || (echo $name | grep -Eq "^.*\.(sh|pl|py)$") || (head -1 $i | grep -Eq "^#!") then chmod 0755 $i git add $i fi done # run simple diff checks git diff-index --cached $against --check -- || exit $? # run checkpatch if there is actual code difference if git diff --cached $against | grep -Eq "^---" then (git diff --cached $against \ | $GIT_DIR/../scripts/checkpatch.pl --no-signoff -) || exit $? fi exit 0
No comments:
Post a Comment