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