xref: /linux/scripts/coccicheck (revision 1e9dea2a60b71ea7a9ac2936bed920d39f662e52)
174425eeeSNicolas Palix#!/bin/sh
274425eeeSNicolas Palix
374425eeeSNicolas PalixSPATCH="`which ${SPATCH:=spatch}`"
474425eeeSNicolas Palix
5*1e9dea2aSNicolas Palixif [ "$C" = "1" -o "$C" = "2" ]; then
6*1e9dea2aSNicolas Palix    ONLINE=1
7*1e9dea2aSNicolas Palix
8*1e9dea2aSNicolas Palix# This requires Coccinelle >= 0.2.3
9*1e9dea2aSNicolas Palix#    FLAGS="-ignore_unknown_options -very_quiet"
10*1e9dea2aSNicolas Palix#    OPTIONS=$*
11*1e9dea2aSNicolas Palix
12*1e9dea2aSNicolas Palix# Workaround for Coccinelle < 0.2.3
13*1e9dea2aSNicolas Palix    FLAGS="-I $srctree/include -very_quiet"
14*1e9dea2aSNicolas Palix    shift $(( $# - 1 ))
15*1e9dea2aSNicolas Palix    OPTIONS=$1
16*1e9dea2aSNicolas Palixelse
17*1e9dea2aSNicolas Palix    ONLINE=0
18*1e9dea2aSNicolas Palix    FLAGS="-very_quiet"
19*1e9dea2aSNicolas Palixfi
20*1e9dea2aSNicolas Palix
2174425eeeSNicolas Palixif [ ! -x "$SPATCH" ]; then
2274425eeeSNicolas Palix    echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
2374425eeeSNicolas Palix    exit 1
2474425eeeSNicolas Palixfi
2574425eeeSNicolas Palix
2674425eeeSNicolas Palixif [ "$MODE" = "" ] ; then
27*1e9dea2aSNicolas Palix    if [ "$ONLINE" = "0" ] ; then
2874425eeeSNicolas Palix	echo 'You have not explicitly specify the mode to use. Fallback to "report".'
2974425eeeSNicolas Palix	echo 'You can specify the mode with "make coccicheck MODE=<mode>"'
3074425eeeSNicolas Palix	echo 'Available modes are: report, patch, context, org'
31*1e9dea2aSNicolas Palix    fi
3274425eeeSNicolas Palix    MODE="report"
3374425eeeSNicolas Palixfi
3474425eeeSNicolas Palix
35*1e9dea2aSNicolas Palixif [ "$ONLINE" = "0" ] ; then
3674425eeeSNicolas Palix    echo ''
3774425eeeSNicolas Palix    echo 'Please check for false positives in the output before submitting a patch.'
3874425eeeSNicolas Palix    echo 'When using "patch" mode, carefully review the patch before submitting it.'
3974425eeeSNicolas Palix    echo ''
40*1e9dea2aSNicolas Palixfi
4174425eeeSNicolas Palix
42*1e9dea2aSNicolas Palixcoccinelle () {
4374425eeeSNicolas Palix    COCCI="$1"
4474425eeeSNicolas Palix
4574425eeeSNicolas Palix    OPT=`grep "Option" $COCCI | cut -d':' -f2`
46*1e9dea2aSNicolas Palix
47*1e9dea2aSNicolas Palix#   The option '-parse_cocci' can be used to syntaxically check the SmPL files.
48*1e9dea2aSNicolas Palix#
49*1e9dea2aSNicolas Palix#    $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null
50*1e9dea2aSNicolas Palix
51*1e9dea2aSNicolas Palix    if [ "$ONLINE" = "0" ] ; then
52*1e9dea2aSNicolas Palix
53*1e9dea2aSNicolas Palix	FILE=`echo $COCCI | sed "s|$srctree/||"`
5474425eeeSNicolas Palix
5574425eeeSNicolas Palix	echo "Processing `basename $COCCI` with option(s) \"$OPT\""
5674425eeeSNicolas Palix	echo 'Message example to submit a patch:'
5774425eeeSNicolas Palix
5874425eeeSNicolas Palix	sed -e '/\/\/\//!d' -e 's|^///||' $COCCI
5974425eeeSNicolas Palix
6074425eeeSNicolas Palix	echo ' The semantic patch that makes this change is available'
6174425eeeSNicolas Palix	echo " in $FILE."
6274425eeeSNicolas Palix	echo ''
6374425eeeSNicolas Palix	echo ' More information about semantic patching is available at'
6474425eeeSNicolas Palix	echo ' http://coccinelle.lip6.fr/'
6574425eeeSNicolas Palix	echo ''
6674425eeeSNicolas Palix
67*1e9dea2aSNicolas Palix	$SPATCH -D $MODE $FLAGS -sp_file $COCCI $OPT -dir $srctree || exit 1
68*1e9dea2aSNicolas Palix    else
69*1e9dea2aSNicolas Palix	$SPATCH -D $MODE $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
70*1e9dea2aSNicolas Palix    fi
7174425eeeSNicolas Palix
7274425eeeSNicolas Palix}
7374425eeeSNicolas Palix
7474425eeeSNicolas Palixif [ "$COCCI" = "" ] ; then
7574425eeeSNicolas Palix    for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
76*1e9dea2aSNicolas Palix	coccinelle $f
7774425eeeSNicolas Palix    done
7874425eeeSNicolas Palixelse
79*1e9dea2aSNicolas Palix    coccinelle $COCCI
8074425eeeSNicolas Palixfi
81