xref: /aosp_15_r20/frameworks/base/cmds/idmap2/static-checks.sh (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker#!/bin/bash
2*d57664e9SAndroid Build Coastguard Worker#
3*d57664e9SAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project
4*d57664e9SAndroid Build Coastguard Worker#
5*d57664e9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*d57664e9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*d57664e9SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*d57664e9SAndroid Build Coastguard Worker#
9*d57664e9SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*d57664e9SAndroid Build Coastguard Worker#
11*d57664e9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*d57664e9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*d57664e9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*d57664e9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*d57664e9SAndroid Build Coastguard Worker# limitations under the License.
16*d57664e9SAndroid Build Coastguard Worker#
17*d57664e9SAndroid Build Coastguard Worker
18*d57664e9SAndroid Build Coastguard Workerfunction _log()
19*d57664e9SAndroid Build Coastguard Worker{
20*d57664e9SAndroid Build Coastguard Worker    echo -e "$*" >&2
21*d57664e9SAndroid Build Coastguard Worker}
22*d57664e9SAndroid Build Coastguard Worker
23*d57664e9SAndroid Build Coastguard Workerfunction _eval()
24*d57664e9SAndroid Build Coastguard Worker{
25*d57664e9SAndroid Build Coastguard Worker    local label="$1"
26*d57664e9SAndroid Build Coastguard Worker    local cmd="$2"
27*d57664e9SAndroid Build Coastguard Worker    local red="\e[31m"
28*d57664e9SAndroid Build Coastguard Worker    local green="\e[32m"
29*d57664e9SAndroid Build Coastguard Worker    local reset="\e[0m"
30*d57664e9SAndroid Build Coastguard Worker    local output
31*d57664e9SAndroid Build Coastguard Worker
32*d57664e9SAndroid Build Coastguard Worker    _log "${green}[ RUN      ]${reset} ${label}"
33*d57664e9SAndroid Build Coastguard Worker    output="$(eval "$cmd" 2>&1)"
34*d57664e9SAndroid Build Coastguard Worker    if [[ $? -eq 0 ]]; then
35*d57664e9SAndroid Build Coastguard Worker        _log "${green}[       OK ]${reset} ${label}"
36*d57664e9SAndroid Build Coastguard Worker        return 0
37*d57664e9SAndroid Build Coastguard Worker    else
38*d57664e9SAndroid Build Coastguard Worker        echo "${output}"
39*d57664e9SAndroid Build Coastguard Worker        _log "${red}[  FAILED  ]${reset} ${label}"
40*d57664e9SAndroid Build Coastguard Worker        errors=$((errors + 1))
41*d57664e9SAndroid Build Coastguard Worker        return 1
42*d57664e9SAndroid Build Coastguard Worker    fi
43*d57664e9SAndroid Build Coastguard Worker}
44*d57664e9SAndroid Build Coastguard Worker
45*d57664e9SAndroid Build Coastguard Workerfunction _clang_format()
46*d57664e9SAndroid Build Coastguard Worker{
47*d57664e9SAndroid Build Coastguard Worker    local path
48*d57664e9SAndroid Build Coastguard Worker    local errors=0
49*d57664e9SAndroid Build Coastguard Worker
50*d57664e9SAndroid Build Coastguard Worker    for path in $cpp_files; do
51*d57664e9SAndroid Build Coastguard Worker        local output="$(clang-format -style=file "$path" | diff $path -)"
52*d57664e9SAndroid Build Coastguard Worker        if [[ "$output" ]]; then
53*d57664e9SAndroid Build Coastguard Worker            echo "$path"
54*d57664e9SAndroid Build Coastguard Worker            echo "$output"
55*d57664e9SAndroid Build Coastguard Worker            errors=1
56*d57664e9SAndroid Build Coastguard Worker        fi
57*d57664e9SAndroid Build Coastguard Worker    done
58*d57664e9SAndroid Build Coastguard Worker    return $errors
59*d57664e9SAndroid Build Coastguard Worker}
60*d57664e9SAndroid Build Coastguard Worker
61*d57664e9SAndroid Build Coastguard Workerfunction _bpfmt()
62*d57664e9SAndroid Build Coastguard Worker{
63*d57664e9SAndroid Build Coastguard Worker    local output="$(bpfmt -d $bp_files)"
64*d57664e9SAndroid Build Coastguard Worker    if [[ "$output" ]]; then
65*d57664e9SAndroid Build Coastguard Worker        echo "$output"
66*d57664e9SAndroid Build Coastguard Worker        return 1
67*d57664e9SAndroid Build Coastguard Worker    fi
68*d57664e9SAndroid Build Coastguard Worker    return 0
69*d57664e9SAndroid Build Coastguard Worker}
70*d57664e9SAndroid Build Coastguard Worker
71*d57664e9SAndroid Build Coastguard Workerfunction _cpplint()
72*d57664e9SAndroid Build Coastguard Worker{
73*d57664e9SAndroid Build Coastguard Worker    local cpplint="${ANDROID_BUILD_TOP}/tools/repohooks/tools/cpplint.py"
74*d57664e9SAndroid Build Coastguard Worker    local output="$($cpplint --quiet $cpp_files 2>&1 >/dev/null | grep -v \
75*d57664e9SAndroid Build Coastguard Worker        -e 'Found C system header after C++ system header.' \
76*d57664e9SAndroid Build Coastguard Worker        -e 'Unknown NOLINT error category: cert-dcl50-cpp' \
77*d57664e9SAndroid Build Coastguard Worker        -e 'Unknown NOLINT error category: misc-non-private-member-variables-in-classes' \
78*d57664e9SAndroid Build Coastguard Worker        -e 'Unknown NOLINT error category: performance-unnecessary-copy-initialization' \
79*d57664e9SAndroid Build Coastguard Worker    )"
80*d57664e9SAndroid Build Coastguard Worker    if [[ "$output" ]]; then
81*d57664e9SAndroid Build Coastguard Worker        echo "$output"
82*d57664e9SAndroid Build Coastguard Worker        return 1
83*d57664e9SAndroid Build Coastguard Worker    fi
84*d57664e9SAndroid Build Coastguard Worker    return 0
85*d57664e9SAndroid Build Coastguard Worker}
86*d57664e9SAndroid Build Coastguard Worker
87*d57664e9SAndroid Build Coastguard Workerfunction _parse_args()
88*d57664e9SAndroid Build Coastguard Worker{
89*d57664e9SAndroid Build Coastguard Worker    local opts
90*d57664e9SAndroid Build Coastguard Worker
91*d57664e9SAndroid Build Coastguard Worker    opts="$(getopt -o cfh --long check,fix,help -- "$@")"
92*d57664e9SAndroid Build Coastguard Worker    if [[ $? -ne 0 ]]; then
93*d57664e9SAndroid Build Coastguard Worker        exit 1
94*d57664e9SAndroid Build Coastguard Worker    fi
95*d57664e9SAndroid Build Coastguard Worker    eval set -- "$opts"
96*d57664e9SAndroid Build Coastguard Worker    while true; do
97*d57664e9SAndroid Build Coastguard Worker        case "$1" in
98*d57664e9SAndroid Build Coastguard Worker            -c|--check) opt_mode="check"; shift ;;
99*d57664e9SAndroid Build Coastguard Worker            -f|--fix) opt_mode="fix"; shift ;;
100*d57664e9SAndroid Build Coastguard Worker            -h|--help) opt_mode="help"; shift ;;
101*d57664e9SAndroid Build Coastguard Worker            *) break ;;
102*d57664e9SAndroid Build Coastguard Worker        esac
103*d57664e9SAndroid Build Coastguard Worker    done
104*d57664e9SAndroid Build Coastguard Worker}
105*d57664e9SAndroid Build Coastguard Worker
106*d57664e9SAndroid Build Coastguard Workererrors=0
107*d57664e9SAndroid Build Coastguard Workerscript="$(readlink -f "$BASH_SOURCE")"
108*d57664e9SAndroid Build Coastguard Workerprefix="$(dirname "$script")"
109*d57664e9SAndroid Build Coastguard Workercpp_files="$(find "$prefix" -name '*.cpp' -or -name '*.h')"
110*d57664e9SAndroid Build Coastguard Workerbp_files="$(find "$prefix" -name 'Android.bp')"
111*d57664e9SAndroid Build Coastguard Workeropt_mode="check"
112*d57664e9SAndroid Build Coastguard Worker
113*d57664e9SAndroid Build Coastguard Worker_parse_args "$@"
114*d57664e9SAndroid Build Coastguard Workerif [[ $opt_mode == "check" ]]; then
115*d57664e9SAndroid Build Coastguard Worker    _eval "clang-format" "_clang_format"
116*d57664e9SAndroid Build Coastguard Worker    _eval "bpfmt" "_bpfmt"
117*d57664e9SAndroid Build Coastguard Worker    _eval "cpplint" "_cpplint"
118*d57664e9SAndroid Build Coastguard Worker    exit $errors
119*d57664e9SAndroid Build Coastguard Workerelif [[ $opt_mode == "fix" ]]; then
120*d57664e9SAndroid Build Coastguard Worker    clang-format -style=file -i $cpp_files
121*d57664e9SAndroid Build Coastguard Worker    bpfmt -w $bp_files
122*d57664e9SAndroid Build Coastguard Worker    exit 0
123*d57664e9SAndroid Build Coastguard Workerelif [[ $opt_mode == "help" ]]; then
124*d57664e9SAndroid Build Coastguard Worker    echo "Run static analysis tools such as clang-format and cpplint on the idmap2"
125*d57664e9SAndroid Build Coastguard Worker    echo "module. Optionally fix some of the issues found (--fix). Intended to be run"
126*d57664e9SAndroid Build Coastguard Worker    echo "before merging any changes."
127*d57664e9SAndroid Build Coastguard Worker    echo
128*d57664e9SAndroid Build Coastguard Worker    echo "usage: $(basename $script) [--check|--fix|--help]"
129*d57664e9SAndroid Build Coastguard Worker    exit 0
130*d57664e9SAndroid Build Coastguard Workerelse
131*d57664e9SAndroid Build Coastguard Worker    exit 1
132*d57664e9SAndroid Build Coastguard Workerfi
133