[PATCH] reformat_with_checkpatch: Add automation to checkpatch
Greg KH
gregkh at linuxfoundation.org
Fri Jul 11 21:43:25 EDT 2014
On Fri, Jul 11, 2014 at 06:21:27PM -0700, Joe Perches wrote:
> A simple script to run checkpatch --fix for various types of
> of cleanups.
>
> This script is useful primarily for staging.
>
> This reformats code to a more CodingStyle conforming style,
> compiles it, verifies that the object code hasn't changed,
> and git commits it too.
>
> You must have the necessary development tools, git, and a
> recent git tree. Ideally use Greg KH's staging-next, which
> can be retrieved via these commands:
>
> git clone git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
> git checkout staging-next
>
> To use this script try a sequence of commands like:
>
> cd <linux_repository>
> git checkout -b <your_branch>
> make allyesconfig
> mkdir patches
> ./scripts/reformat_with_checkpatch.sh drivers/staging/<dir>/*.[ch]
> git format-patch --cover-letter -o patches/<your_branch> staging-next
> git send-email patches/<your_branch>
>
> Signed-off-by: Joe Perches <joe at perches.com>
> ---
> scripts/reformat_with_checkpatch.sh | 141 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 141 insertions(+)
> create mode 100755 scripts/reformat_with_checkpatch.sh
>
> diff --git a/scripts/reformat_with_checkpatch.sh b/scripts/reformat_with_checkpatch.sh
> new file mode 100755
> index 0000000..5415a8e
> --- /dev/null
> +++ b/scripts/reformat_with_checkpatch.sh
> @@ -0,0 +1,141 @@
> +#!/bin/bash
> +# (c) 2014, Joe Perches <joe at perches.com>
> +#
> +# Automate checkpatch modifications and git commits to
> +# neaten code that doesn't conform to CodingStyle.
> +# Useful primarily for files in drivers/staging
> +#
> +# Licensed under the terms of the GNU GPL License version 2
> +
> +declare -ar whitespace_types=( \
> + 'whitespace_neatening:spacing,space_before_tab,pointer_location,trailing_whitespace,bracket_space' \
> + 'remove_spaces_before_tabs:space_before_tab' \
> + 'fix_label_positions:indented_label' \
> + 'align_arguments_to_parenthesis:parenthesis_alignment' \
> +)
> +
> +declare -ar changecode_types=( \
> + 'fix_brace_positions:open_brace,braces,else_after_brace,while_after_brace' \
> + 'fix_blank_lines:line_spacing' \
> + 'use_standard_attributes:prefer_packed,prefer_aligned' \
> + 'remove_unnecessary_externs:avoid_externs' \
> + 'update_c90_comment_style:c99_comments' \
> +)
> +
> +checkpatch_update ()
> +{
> + file=$1
> +
> + desc=$(echo $2 | cut -f1 -d: | sed 's/_/ /g')
> + types=$(echo $2 | cut -f2- -d:)
> +
> + echo "file: <$file> description: <$desc> types:<$types>"
> +
> + ./scripts/checkpatch.pl --file --fix-inplace --strict --types="$types" $file
> +
> + checkpatch_fixes=$file.diff
> + git diff --stat -p --exit-code $file > $checkpatch_fixes
> + if [ $? == 0 ] ; then
> + rm -f $checkpatch_fixes
> + return
> + fi
> +
> + basename=$(basename $file)
> + if [ "${basename##*.}" == "c" ] ; then
> +
> + git checkout $file
> + obj="$(echo $file | sed 's/\.c$/\.o/')"
> + if [ -e $obj ] ; then
> + rm -f $obj
> + fi
> +
> + echo "Compiling original version..."
> +
> + ${CROSS_COMPILE}make $obj
> +
> + ${CROSS_COMPILE}objdump -D $obj | \
> + sed "s/^[[:space:]]\+[0-9a-f]\+//" > $obj.old
> +
> + patch -p1 < $checkpatch_fixes
> +
> + echo "Compiling modified version..."
> +
> + ${CROSS_COMPILE}make $obj
> +
> + ${CROSS_COMPILE}objdump -D $obj | \
> + sed "s/^[[:space:]]\+[0-9a-f]\+//" > $obj.new
> +
> + echo "Comparing objects..."
> + diff -Nurd $obj.new $obj.old
> + if [ $? -ne 0 ] ; then
> + echo "Object differences exist! - Verify changes before commit!"
> + read -s -p "Press the 'enter' key to continue: "
> + else
> + echo "No object differences found"
> + fi
> + rm -f $obj.old
> + rm -f $obj.new
> + fi
> +
> + echo "running checkpatch on possible checkpatch fixes..."
> +
> + ./scripts/checkpatch.pl --no-summary --no-signoff $checkpatch_fixes
> + rm -f $checkpatch_fixes
> +
> + echo "Verify checkpatch output and make any necessary changes"
> + echo "Edit '$file' if appropriate"
> + read -s -p "Press the 'enter' key to continue: "
> +
> + commit_log_file=$(mktemp git_commit.XXXXXX)
> +
> + if [ -e $commit_log_file ] ; then
> + rm -f $commit_log_file
> + fi
> +
> + if [[ $file =~ ^drivers/staging/ ]] ; then
> + echo -n "staging: " >> $commit_log_file
> + fi
> + echo "$(basename $(dirname $file)): checkpatch cleanup: $desc" >> $commit_log_file
If I pick drivers/staging/lustre/include/linux/lnet/types.h, then I get:
staging: lnet: checkpatch cleanup: whitespace neatening
and no 'types.h' here, is that intentional? If so, why?
And this is fun, I'm going to let this rip on the lustre code...
thanks,
greg k-h
More information about the Kernelnewbies
mailing list