Mårten Kongstad | 0275123 | 2018-04-27 13:16:32 +0200 | [diff] [blame] | 1 | #!/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 | |
| 18 | function _log() |
| 19 | { |
| 20 | echo -e "$*" >&2 |
| 21 | } |
| 22 | |
| 23 | function _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 Kongstad | dd63e5d | 2019-09-27 10:00:18 +0200 | [diff] [blame] | 30 | local output |
Mårten Kongstad | 0275123 | 2018-04-27 13:16:32 +0200 | [diff] [blame] | 31 | |
| 32 | _log "${green}[ RUN ]${reset} ${label}" |
Mårten Kongstad | dd63e5d | 2019-09-27 10:00:18 +0200 | [diff] [blame] | 33 | output="$(eval "$cmd" 2>&1)" |
| 34 | if [[ $? -eq 0 ]]; then |
Mårten Kongstad | 0275123 | 2018-04-27 13:16:32 +0200 | [diff] [blame] | 35 | _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 | |
| 45 | function _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 | |
| 61 | function _bpfmt() |
| 62 | { |
Mårten Kongstad | aabca6c | 2019-01-21 13:44:36 +0100 | [diff] [blame] | 63 | local output="$(bpfmt -d $bp_files)" |
Mårten Kongstad | 0275123 | 2018-04-27 13:16:32 +0200 | [diff] [blame] | 64 | if [[ "$output" ]]; then |
| 65 | echo "$output" |
| 66 | return 1 |
| 67 | fi |
| 68 | return 0 |
| 69 | } |
| 70 | |
| 71 | function _cpplint() |
| 72 | { |
| 73 | local cpplint="${ANDROID_BUILD_TOP}/tools/repohooks/tools/cpplint.py" |
Ryan Mitchell | ebc0b6a | 2018-12-18 17:54:36 -0800 | [diff] [blame] | 74 | local output="$($cpplint --quiet $cpp_files 2>&1 >/dev/null | grep -v \ |
| 75 | -e 'Found C system header after C++ system header.' \ |
Mårten Kongstad | aabca6c | 2019-01-21 13:44:36 +0100 | [diff] [blame] | 76 | -e 'Unknown NOLINT error category: cert-dcl50-cpp' \ |
Ryan Mitchell | ebc0b6a | 2018-12-18 17:54:36 -0800 | [diff] [blame] | 77 | -e 'Unknown NOLINT error category: misc-non-private-member-variables-in-classes' \ |
Mårten Kongstad | 1e99b17 | 2019-01-28 08:49:12 +0100 | [diff] [blame] | 78 | -e 'Unknown NOLINT error category: performance-unnecessary-copy-initialization' \ |
Ryan Mitchell | ebc0b6a | 2018-12-18 17:54:36 -0800 | [diff] [blame] | 79 | )" |
| 80 | if [[ "$output" ]]; then |
| 81 | echo "$output" |
| 82 | return 1 |
| 83 | fi |
| 84 | return 0 |
Mårten Kongstad | 0275123 | 2018-04-27 13:16:32 +0200 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | function _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 | |
| 106 | errors=0 |
| 107 | script="$(readlink -f "$BASH_SOURCE")" |
| 108 | prefix="$(dirname "$script")" |
| 109 | cpp_files="$(find "$prefix" -name '*.cpp' -or -name '*.h')" |
| 110 | bp_files="$(find "$prefix" -name 'Android.bp')" |
| 111 | opt_mode="check" |
| 112 | |
| 113 | _parse_args "$@" |
| 114 | if [[ $opt_mode == "check" ]]; then |
| 115 | _eval "clang-format" "_clang_format" |
| 116 | _eval "bpfmt" "_bpfmt" |
| 117 | _eval "cpplint" "_cpplint" |
| 118 | exit $errors |
| 119 | elif [[ $opt_mode == "fix" ]]; then |
| 120 | clang-format -style=file -i $cpp_files |
Mårten Kongstad | aabca6c | 2019-01-21 13:44:36 +0100 | [diff] [blame] | 121 | bpfmt -w $bp_files |
Mårten Kongstad | 0275123 | 2018-04-27 13:16:32 +0200 | [diff] [blame] | 122 | exit 0 |
| 123 | elif [[ $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 |
| 130 | else |
| 131 | exit 1 |
| 132 | fi |