#!/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