| #!/bin/bash |
| # |
| # Copyright (C) 2018 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| function _log() |
| { |
| echo -e "$*" >&2 |
| } |
| |
| function _eval() |
| { |
| local label="$1" |
| local cmd="$2" |
| local red="\e[31m" |
| local green="\e[32m" |
| local reset="\e[0m" |
| local output |
| |
| _log "${green}[ RUN ]${reset} ${label}" |
| output="$(eval "$cmd" 2>&1)" |
| if [[ $? -eq 0 ]]; then |
| _log "${green}[ OK ]${reset} ${label}" |
| return 0 |
| else |
| echo "${output}" |
| _log "${red}[ FAILED ]${reset} ${label}" |
| errors=$((errors + 1)) |
| return 1 |
| fi |
| } |
| |
| function _clang_format() |
| { |
| local path |
| local errors=0 |
| |
| for path in $cpp_files; do |
| local output="$(clang-format -style=file "$path" | diff $path -)" |
| if [[ "$output" ]]; then |
| echo "$path" |
| echo "$output" |
| errors=1 |
| fi |
| done |
| return $errors |
| } |
| |
| function _bpfmt() |
| { |
| local output="$(bpfmt -d $bp_files)" |
| if [[ "$output" ]]; then |
| echo "$output" |
| return 1 |
| fi |
| return 0 |
| } |
| |
| function _cpplint() |
| { |
| local cpplint="${ANDROID_BUILD_TOP}/tools/repohooks/tools/cpplint.py" |
| local output="$($cpplint --quiet $cpp_files 2>&1 >/dev/null | grep -v \ |
| -e 'Found C system header after C++ system header.' \ |
| -e 'Unknown NOLINT error category: cert-dcl50-cpp' \ |
| -e 'Unknown NOLINT error category: misc-non-private-member-variables-in-classes' \ |
| -e 'Unknown NOLINT error category: performance-unnecessary-copy-initialization' \ |
| )" |
| if [[ "$output" ]]; then |
| echo "$output" |
| return 1 |
| fi |
| return 0 |
| } |
| |
| function _parse_args() |
| { |
| local opts |
| |
| opts="$(getopt -o cfh --long check,fix,help -- "$@")" |
| if [[ $? -ne 0 ]]; then |
| exit 1 |
| fi |
| eval set -- "$opts" |
| while true; do |
| case "$1" in |
| -c|--check) opt_mode="check"; shift ;; |
| -f|--fix) opt_mode="fix"; shift ;; |
| -h|--help) opt_mode="help"; shift ;; |
| *) break ;; |
| esac |
| done |
| } |
| |
| errors=0 |
| script="$(readlink -f "$BASH_SOURCE")" |
| prefix="$(dirname "$script")" |
| cpp_files="$(find "$prefix" -name '*.cpp' -or -name '*.h')" |
| bp_files="$(find "$prefix" -name 'Android.bp')" |
| opt_mode="check" |
| |
| _parse_args "$@" |
| if [[ $opt_mode == "check" ]]; then |
| _eval "clang-format" "_clang_format" |
| _eval "bpfmt" "_bpfmt" |
| _eval "cpplint" "_cpplint" |
| exit $errors |
| elif [[ $opt_mode == "fix" ]]; then |
| clang-format -style=file -i $cpp_files |
| bpfmt -w $bp_files |
| exit 0 |
| elif [[ $opt_mode == "help" ]]; then |
| echo "Run static analysis tools such as clang-format and cpplint on the idmap2" |
| echo "module. Optionally fix some of the issues found (--fix). Intended to be run" |
| echo "before merging any changes." |
| echo |
| echo "usage: $(basename $script) [--check|--fix|--help]" |
| exit 0 |
| else |
| exit 1 |
| fi |