PRESUBMIT.py: Add formatting checks.
GN files are checked using the canned presubmit check but we cannot do the same for C/C++ files: the canned check uses git cl format which can only use clang-format 5.0 and requires formatting of all the source code. Instead we write our own clang-format check, reusing the script that checks formatting on Travis. To have a recent version of clang-format we import one from a helper repo. This also fix a formatting error in .gn and adds licenses to the clang-format linting scripts. Change-Id: I4d8208472a8a6bd32ae3ef41c3145abf270a4c37
This commit is contained in:
parent
1a0596d8ea
commit
4c35101b9c
1
.gn
1
.gn
|
@ -21,6 +21,7 @@ default_args = {
|
|||
check_targets = [
|
||||
# Everything in BUILD.gn
|
||||
"//:*",
|
||||
|
||||
# Everything in third_party/BUILD.gn
|
||||
"//third_party/:*",
|
||||
]
|
||||
|
|
7
DEPS
7
DEPS
|
@ -3,6 +3,7 @@ use_relative_hooks = True
|
|||
|
||||
vars = {
|
||||
'chromium_git': 'https://chromium.googlesource.com',
|
||||
'dawn_git': 'https://dawn.googlesource.com',
|
||||
'github_git': 'https://github.com',
|
||||
|
||||
'dawn_standalone': True,
|
||||
|
@ -86,6 +87,12 @@ deps = {
|
|||
'url': '{github_git}/g-truc/glm.git@06f084063fd6d9aa2ef6904517650700ae47b63d',
|
||||
'condition': 'dawn_standalone',
|
||||
},
|
||||
|
||||
# Our own pre-compiled Linux clang-format 7.0 for presubmit
|
||||
'third_party/clang-format': {
|
||||
'url': '{dawn_git}/clang-format@2451c56cd368676cdb230fd5ad11731ab859f1a3',
|
||||
'condition': 'dawn_standalone and checkout_linux',
|
||||
},
|
||||
}
|
||||
|
||||
hooks = [
|
||||
|
|
70
PRESUBMIT.py
70
PRESUBMIT.py
|
@ -1,9 +1,69 @@
|
|||
# Copyright (c) 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.
|
||||
# Copyright 2018 The Dawn Authors
|
||||
#
|
||||
# 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.
|
||||
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
|
||||
def _DoClangFormat(input_api, output_api):
|
||||
# Our binary clang-format is a linux binary compiled for x64
|
||||
if platform.system() != 'Linux' or platform.architecture()[0] != '64bit':
|
||||
return [output_api.PresubmitNotifyResult('Skipping clang-format')]
|
||||
|
||||
# We need to know which commit to diff against. It doesn't seem to be exposed anywhere
|
||||
# except in that private member of presubmit_support.Change. This is likely to break
|
||||
# but hopefully we have an updated clang-format in CPID/GS before it does.
|
||||
upstream_commit = input_api.change._upstream
|
||||
if upstream_commit == None:
|
||||
return []
|
||||
|
||||
lint_cmd = [
|
||||
'scripts/lint_clang_format.sh',
|
||||
'third_party/clang-format/clang-format',
|
||||
upstream_commit
|
||||
]
|
||||
|
||||
# Make clang-format use our linux x64 sysroot because it is compiled with a version of
|
||||
# stdlibc++ that's incompatible with the old libraries present on the bots.
|
||||
env = {
|
||||
'LD_LIBRARY_PATH': os.path.join(
|
||||
os.getcwd(),
|
||||
'build',
|
||||
'linux',
|
||||
'debian_sid_amd64-sysroot',
|
||||
'usr',
|
||||
'lib',
|
||||
'x86_64-linux-gnu'
|
||||
)
|
||||
}
|
||||
|
||||
# Call the linting script and forward the output as a notification or as an error
|
||||
try:
|
||||
output = subprocess.check_output(lint_cmd, env=env);
|
||||
return [output_api.PresubmitNotifyResult(output)]
|
||||
except subprocess.CalledProcessError as e:
|
||||
return [output_api.PresubmitError(e.output)]
|
||||
|
||||
def _DoCommonChecks(input_api, output_api):
|
||||
results = []
|
||||
results.extend(input_api.canned_checks.CheckChangedLUCIConfigs(input_api, output_api))
|
||||
results.extend(input_api.canned_checks.CheckGNFormatted(input_api, output_api))
|
||||
results.extend(_DoClangFormat(input_api, output_api))
|
||||
return results
|
||||
|
||||
def CheckChangeOnUpload(input_api, output_api):
|
||||
return input_api.canned_checks.CheckChangedLUCIConfigs(input_api, output_api)
|
||||
return _DoCommonChecks(input_api, output_api)
|
||||
|
||||
def CheckChangeOnCommit(input_api, output_api):
|
||||
return input_api.canned_checks.CheckChangedLUCIConfigs(input_api, output_api)
|
||||
return _DoCommonChecks(input_api, output_api)
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright 2018 The Dawn Authors
|
||||
#
|
||||
# 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.
|
||||
|
||||
clang_format=$1
|
||||
base_commit=$2
|
||||
|
||||
echo
|
||||
skipped_directories="(examples|generator|src/tests/(unittests|end2end)|third_party)"
|
||||
# Find the files modified that need formatting
|
||||
files_to_check=$(git diff --diff-filter=ACMR --name-only $base_commit | grep -E "*\.(c|cpp|mm|h)$" | grep -vE "^$skipped_directories/*")
|
||||
if [ -z "$files_to_check" ]; then
|
||||
echo "No modified files to format."
|
||||
exit 0
|
||||
fi
|
||||
echo "Checking formatting diff on these files:"
|
||||
echo "$files_to_check"
|
||||
echo
|
||||
files_to_check=$(echo $files_to_check | tr '\n' ' ')
|
||||
|
||||
# Run git-clang-format, check if it formatted anything
|
||||
format_output=$(scripts/git-clang-format --binary $clang_format --commit $base_commit --diff --style=file $files_to_check)
|
||||
if [ "$format_output" == "clang-format did not modify any files" ] || [ "$format_output" == "no modified files to format" ] ; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# clang-format made changes, print them and fail Travis
|
||||
echo "Following formatting changes needed:"
|
||||
echo
|
||||
echo "$format_output"
|
||||
echo
|
||||
exit 1
|
|
@ -1,5 +1,19 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright 2018 The Dawn Authors
|
||||
#
|
||||
# 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.
|
||||
|
||||
if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
|
||||
echo "Running outside of pull request isn't supported yet"
|
||||
exit 0
|
||||
|
@ -10,26 +24,4 @@ base_commit=$(git rev-parse $TRAVIS_BRANCH)
|
|||
echo "Formatting against $TRAVIS_BRANCH a.k.a. $base_commit..."
|
||||
echo
|
||||
|
||||
skipped_directories="(examples|generator|src/tests/(unittests|end2end)|third_party)"
|
||||
# Find the files modified that need formatting
|
||||
files_to_check=$(git diff --diff-filter=ACMR --name-only $base_commit | grep -E "*.(c|cpp|mm|h)$" | grep -vE "^$skipped_directories/*")
|
||||
if [ -z "$files_to_check" ]; then
|
||||
echo "No modified files to format."
|
||||
exit 0
|
||||
fi
|
||||
echo "Checking formatting diff on these files:"
|
||||
echo "$files_to_check"
|
||||
echo
|
||||
files_to_check=$(echo $files_to_check | tr '\n' ' ')
|
||||
|
||||
# Run git-clang-format, check if it formatted anything
|
||||
format_output=$(scripts/git-clang-format --binary $1 --commit $base_commit --diff --style=file $files_to_check)
|
||||
if [ "$format_output" == "clang-format did not modify any files" ] || [ "$format_output" == "no modified files to format" ] ; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# clang-format made changes, print them and fail Travis
|
||||
echo "Following formatting changes needed:"
|
||||
echo
|
||||
echo "$format_output"
|
||||
exit 1
|
||||
scripts/lint_clang_format.sh $1 $base_commit
|
||||
|
|
Loading…
Reference in New Issue