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 = [
|
check_targets = [
|
||||||
# Everything in BUILD.gn
|
# Everything in BUILD.gn
|
||||||
"//:*",
|
"//:*",
|
||||||
|
|
||||||
# Everything in third_party/BUILD.gn
|
# Everything in third_party/BUILD.gn
|
||||||
"//third_party/:*",
|
"//third_party/:*",
|
||||||
]
|
]
|
||||||
|
|
7
DEPS
7
DEPS
|
@ -3,6 +3,7 @@ use_relative_hooks = True
|
||||||
|
|
||||||
vars = {
|
vars = {
|
||||||
'chromium_git': 'https://chromium.googlesource.com',
|
'chromium_git': 'https://chromium.googlesource.com',
|
||||||
|
'dawn_git': 'https://dawn.googlesource.com',
|
||||||
'github_git': 'https://github.com',
|
'github_git': 'https://github.com',
|
||||||
|
|
||||||
'dawn_standalone': True,
|
'dawn_standalone': True,
|
||||||
|
@ -86,6 +87,12 @@ deps = {
|
||||||
'url': '{github_git}/g-truc/glm.git@06f084063fd6d9aa2ef6904517650700ae47b63d',
|
'url': '{github_git}/g-truc/glm.git@06f084063fd6d9aa2ef6904517650700ae47b63d',
|
||||||
'condition': 'dawn_standalone',
|
'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 = [
|
hooks = [
|
||||||
|
|
70
PRESUBMIT.py
70
PRESUBMIT.py
|
@ -1,9 +1,69 @@
|
||||||
# Copyright (c) 2018 The Chromium Authors. All rights reserved.#
|
# Copyright 2018 The Dawn Authors
|
||||||
# Use of this source code is governed by a BSD-style license that can be
|
#
|
||||||
# found in the LICENSE file.
|
# 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):
|
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):
|
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
|
#!/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
|
if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
|
||||||
echo "Running outside of pull request isn't supported yet"
|
echo "Running outside of pull request isn't supported yet"
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -10,26 +24,4 @@ base_commit=$(git rev-parse $TRAVIS_BRANCH)
|
||||||
echo "Formatting against $TRAVIS_BRANCH a.k.a. $base_commit..."
|
echo "Formatting against $TRAVIS_BRANCH a.k.a. $base_commit..."
|
||||||
echo
|
echo
|
||||||
|
|
||||||
skipped_directories="(examples|generator|src/tests/(unittests|end2end)|third_party)"
|
scripts/lint_clang_format.sh $1 $base_commit
|
||||||
# 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
|
|
||||||
|
|
Loading…
Reference in New Issue