#!/usr/bin/env bash # Copyright 2018 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # Check that: # - all C++ and header files conform to clang-format style. # - all header files have appropriate include guards. # - all GN files are formatted with `gn format`. fail=0 function check_clang_format() { if ! which clang-format &>/dev/null; then echo "Please add clang-format to your PATH or manually check $1 for format errors." elif ! cmp -s <(clang-format -style=file "$1") "$1"; then echo "Needs format: $1" fail=1 fi } function check_include_guard() { # Replace all folder slashes with underscores, and add "_" suffix. guard_name=${1//[\/\.\-]/_}_ # This to-uppercase syntax is available in bash 4.0+ guard_name=${guard_name^^} ifndef_count=$(grep -E "^#ifndef $guard_name\$" "$1" | wc -l) define_count=$(grep -E "^#define $guard_name\$" "$1" | wc -l) endif_count=$(grep -E "^#endif // $guard_name\$" "$1" | wc -l) if [ $ifndef_count -ne 1 -o $define_count -ne 1 -o \ $endif_count -ne 1 ]; then echo "Include guard missing/incorrect: $1" fail=1 fi } function check_gn_format() { if ! which gn &>/dev/null; then echo "Please add gn to your PATH or manually check $1 for format errors." else if ! cmp -s <(cat "$1" | gn format --stdin) "$1"; then echo "Needs format: $1" fail=1 fi fi } if [[ "${BASH_VERSION:0:1}" -lt 4 ]]; then echo "This script requires at least bash version 4.0, please upgrade!" echo "Your version: " $BASH_VERSION exit 1 fi ppid=$(ps -o pid,ppid | awk -F ' ' "{ if (\$1 == $$) print \$2 }") invoker=$(ps -o pid,comm | awk -F ' ' "{ if (\$1 == $ppid) print \$2 }") if [[ "$invoker" != 'python' ]]; then echo "This shouldn't be invoked directly, please use \`git cl presubmit\`." fi # TODO(jophba): check in a better fix for the build bots. if command -v clang-format &> /dev/null; then tools/install-build-tools.sh &> /dev/null fi for f in $(git diff --name-only --diff-filter=d origin/master); do # Skip third party files, except our custom BUILD.gns if [[ $f =~ third_party/[^\/]*/src ]]; then continue; fi # Skip statically copied Chromium QUIC build files. if [[ $f =~ third_party/chromium_quic/build ]]; then continue; fi if [[ $f =~ \.(cc|h)$ ]]; then # clang-format check. check_clang_format "$f" # Include guard check. if [[ $f =~ \.h$ ]]; then check_include_guard "$f" fi elif [[ $f =~ \.gn(i)?$ ]]; then check_gn_format "$f" fi done exit $fail