xref: /aosp_15_r20/external/ltp/scripts/coccinelle/run-spatch.sh (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker#!/bin/sh -eu
2*49cdfc7eSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0-or-later
3*49cdfc7eSAndroid Build Coastguard Worker# Copyright (c) 2021 SUSE LLC  <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker
5*49cdfc7eSAndroid Build Coastguard Worker# Helper for running spatch Coccinelle scripts on the LTP source tree
6*49cdfc7eSAndroid Build Coastguard Worker
7*49cdfc7eSAndroid Build Coastguard Workerif [ ! -d lib ] || [ ! -d scripts/coccinelle ]; then
8*49cdfc7eSAndroid Build Coastguard Worker    echo "$0: Can't find lib or scripts directories. Run me from top src dir"
9*49cdfc7eSAndroid Build Coastguard Worker    exit 1
10*49cdfc7eSAndroid Build Coastguard Workerfi
11*49cdfc7eSAndroid Build Coastguard Worker
12*49cdfc7eSAndroid Build Coastguard Workerdo_fix=no
13*49cdfc7eSAndroid Build Coastguard Worker
14*49cdfc7eSAndroid Build Coastguard Worker# Run a script on the lib dir
15*49cdfc7eSAndroid Build Coastguard Workerlibltp_spatch() {
16*49cdfc7eSAndroid Build Coastguard Worker    echo libltp_spatch $*
17*49cdfc7eSAndroid Build Coastguard Worker
18*49cdfc7eSAndroid Build Coastguard Worker    if [ $do_fix = yes ]; then
19*49cdfc7eSAndroid Build Coastguard Worker	spatch --dir lib \
20*49cdfc7eSAndroid Build Coastguard Worker	       --ignore lib/parse_opts.c \
21*49cdfc7eSAndroid Build Coastguard Worker	       --ignore lib/newlib_tests \
22*49cdfc7eSAndroid Build Coastguard Worker	       --ignore lib/tests \
23*49cdfc7eSAndroid Build Coastguard Worker	       --use-gitgrep \
24*49cdfc7eSAndroid Build Coastguard Worker	       --in-place \
25*49cdfc7eSAndroid Build Coastguard Worker	       -D fix \
26*49cdfc7eSAndroid Build Coastguard Worker	       --include-headers \
27*49cdfc7eSAndroid Build Coastguard Worker	       $*
28*49cdfc7eSAndroid Build Coastguard Worker	spatch --dir include \
29*49cdfc7eSAndroid Build Coastguard Worker	       --use-gitgrep \
30*49cdfc7eSAndroid Build Coastguard Worker	       --in-place \
31*49cdfc7eSAndroid Build Coastguard Worker	       -D fix \
32*49cdfc7eSAndroid Build Coastguard Worker	       --include-headers \
33*49cdfc7eSAndroid Build Coastguard Worker	       $*
34*49cdfc7eSAndroid Build Coastguard Worker    else
35*49cdfc7eSAndroid Build Coastguard Worker	spatch --dir lib \
36*49cdfc7eSAndroid Build Coastguard Worker	       --ignore lib/parse_opts.c \
37*49cdfc7eSAndroid Build Coastguard Worker	       --ignore lib/newlib_tests \
38*49cdfc7eSAndroid Build Coastguard Worker	       --ignore lib/tests \
39*49cdfc7eSAndroid Build Coastguard Worker	       --use-gitgrep \
40*49cdfc7eSAndroid Build Coastguard Worker	       --include-headers \
41*49cdfc7eSAndroid Build Coastguard Worker	       $*
42*49cdfc7eSAndroid Build Coastguard Worker	spatch --dir include \
43*49cdfc7eSAndroid Build Coastguard Worker	       --use-gitgrep \
44*49cdfc7eSAndroid Build Coastguard Worker	       --include-headers \
45*49cdfc7eSAndroid Build Coastguard Worker	       $*
46*49cdfc7eSAndroid Build Coastguard Worker    fi
47*49cdfc7eSAndroid Build Coastguard Worker}
48*49cdfc7eSAndroid Build Coastguard Worker
49*49cdfc7eSAndroid Build Coastguard Workertests_spatch() {
50*49cdfc7eSAndroid Build Coastguard Worker        echo tests_spatch $*
51*49cdfc7eSAndroid Build Coastguard Worker
52*49cdfc7eSAndroid Build Coastguard Worker        if [ $do_fix = yes ]; then
53*49cdfc7eSAndroid Build Coastguard Worker	    spatch --dir testcases \
54*49cdfc7eSAndroid Build Coastguard Worker		   --dir lib/newlib_tests \
55*49cdfc7eSAndroid Build Coastguard Worker		   --use-gitgrep \
56*49cdfc7eSAndroid Build Coastguard Worker		   --in-place \
57*49cdfc7eSAndroid Build Coastguard Worker		   -D fix \
58*49cdfc7eSAndroid Build Coastguard Worker		   --include-headers \
59*49cdfc7eSAndroid Build Coastguard Worker		   $*
60*49cdfc7eSAndroid Build Coastguard Worker	else
61*49cdfc7eSAndroid Build Coastguard Worker	    spatch --dir testcases \
62*49cdfc7eSAndroid Build Coastguard Worker		   --dir lib/newlib_tests \
63*49cdfc7eSAndroid Build Coastguard Worker		   --use-gitgrep \
64*49cdfc7eSAndroid Build Coastguard Worker		   --include-headers \
65*49cdfc7eSAndroid Build Coastguard Worker		   $*
66*49cdfc7eSAndroid Build Coastguard Worker	fi
67*49cdfc7eSAndroid Build Coastguard Worker}
68*49cdfc7eSAndroid Build Coastguard Worker
69*49cdfc7eSAndroid Build Coastguard Workerusage()
70*49cdfc7eSAndroid Build Coastguard Worker{
71*49cdfc7eSAndroid Build Coastguard Worker    cat <<EOF
72*49cdfc7eSAndroid Build Coastguard WorkerUsage:
73*49cdfc7eSAndroid Build Coastguard Worker$0 [ -f ] <patch basename> [ <patch basename> [...] ]
74*49cdfc7eSAndroid Build Coastguard Worker$0 -h
75*49cdfc7eSAndroid Build Coastguard Worker
76*49cdfc7eSAndroid Build Coastguard WorkerOptions:
77*49cdfc7eSAndroid Build Coastguard Worker-f	Apply the semantic patch in-place to fix the code
78*49cdfc7eSAndroid Build Coastguard Worker-h	You are reading it
79*49cdfc7eSAndroid Build Coastguard Worker
80*49cdfc7eSAndroid Build Coastguard WorkerIf run without -f then the semantic patch will only print locations
81*49cdfc7eSAndroid Build Coastguard Workerwhere it matches or show a diff.
82*49cdfc7eSAndroid Build Coastguard Worker
83*49cdfc7eSAndroid Build Coastguard WorkerEOF
84*49cdfc7eSAndroid Build Coastguard Worker}
85*49cdfc7eSAndroid Build Coastguard Worker
86*49cdfc7eSAndroid Build Coastguard Workerwhile getopts "fh" opt; do
87*49cdfc7eSAndroid Build Coastguard Worker    case $opt in
88*49cdfc7eSAndroid Build Coastguard Worker	f) do_fix=yes;;
89*49cdfc7eSAndroid Build Coastguard Worker	h|?) usage; exit $([ $opt = h ]);;
90*49cdfc7eSAndroid Build Coastguard Worker    esac
91*49cdfc7eSAndroid Build Coastguard Workerdone
92*49cdfc7eSAndroid Build Coastguard Worker
93*49cdfc7eSAndroid Build Coastguard Workershift $(($OPTIND - 1))
94*49cdfc7eSAndroid Build Coastguard Worker
95*49cdfc7eSAndroid Build Coastguard Workerif [ $# -eq 0 ]; then
96*49cdfc7eSAndroid Build Coastguard Worker    echo -e "Missing semantic patch name \n"
97*49cdfc7eSAndroid Build Coastguard Worker    usage; exit 1
98*49cdfc7eSAndroid Build Coastguard Workerfi
99*49cdfc7eSAndroid Build Coastguard Worker
100*49cdfc7eSAndroid Build Coastguard Workerif [ $do_fix = yes ] && [ -n "$(git ls-files -m -d)" ]; then
101*49cdfc7eSAndroid Build Coastguard Worker    echo "At least stage your current changes!"
102*49cdfc7eSAndroid Build Coastguard Worker    exit 1
103*49cdfc7eSAndroid Build Coastguard Workerfi
104*49cdfc7eSAndroid Build Coastguard Worker
105*49cdfc7eSAndroid Build Coastguard Workerfor spatch_file in $*; do
106*49cdfc7eSAndroid Build Coastguard Worker    case $spatch_file in
107*49cdfc7eSAndroid Build Coastguard Worker	libltp-test-macro)
108*49cdfc7eSAndroid Build Coastguard Worker	    libltp_spatch --sp-file scripts/coccinelle/libltp-test-macro.cocci;;
109*49cdfc7eSAndroid Build Coastguard Worker	libltp-test-macro-vars)
110*49cdfc7eSAndroid Build Coastguard Worker	    libltp_spatch --sp-file scripts/coccinelle/libltp-test-macro-vars.cocci \
111*49cdfc7eSAndroid Build Coastguard Worker			  --ignore lib/tst_test.c;;
112*49cdfc7eSAndroid Build Coastguard Worker	*)
113*49cdfc7eSAndroid Build Coastguard Worker	    tests_spatch --sp-file scripts/coccinelle/$spatch_file.cocci;;
114*49cdfc7eSAndroid Build Coastguard Worker    esac
115*49cdfc7eSAndroid Build Coastguard Workerdone
116*49cdfc7eSAndroid Build Coastguard Worker
117*49cdfc7eSAndroid Build Coastguard Worker
118*49cdfc7eSAndroid Build Coastguard Worker
119