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