diff --git a/.gn b/.gn index e288994a06..038d50ee8e 100644 --- a/.gn +++ b/.gn @@ -21,6 +21,7 @@ default_args = { check_targets = [ # Everything in BUILD.gn "//:*", + # Everything in third_party/BUILD.gn "//third_party/:*", ] diff --git a/DEPS b/DEPS index 41495cb9e7..79b353ffad 100644 --- a/DEPS +++ b/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 = [ diff --git a/PRESUBMIT.py b/PRESUBMIT.py index 8fb81fd2a8..ae10063e7d 100644 --- a/PRESUBMIT.py +++ b/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) diff --git a/scripts/lint_clang_format.sh b/scripts/lint_clang_format.sh new file mode 100755 index 0000000000..82b572c23c --- /dev/null +++ b/scripts/lint_clang_format.sh @@ -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 diff --git a/scripts/travis_lint_format.sh b/scripts/travis_lint_format.sh index 730c4e5c10..3515d606f6 100755 --- a/scripts/travis_lint_format.sh +++ b/scripts/travis_lint_format.sh @@ -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