github.com/0xKiwi/rules_go@v0.24.3/tests/buildifier_test.bzl (about) 1 # Copyright 2020 The Bazel Authors. All rights reserved. 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http://www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 # See the License for the specific language governing permissions and 13 # limitations under the License. 14 15 """buildifier_tests.bzl provides the buildifier_test rule""" 16 17 load("@bazel_skylib//lib:shell.bzl", "shell") 18 19 def _check_file(f): 20 base = f.basename 21 return base in ("WORKSPACE", "BUILD", "BUILD.bazel") or base.endswith(".bzl") 22 23 def _buildifier_test_impl(ctx): 24 files = [f for f in ctx.files.data if _check_file(f)] 25 26 script = ctx.actions.declare_file(ctx.label.name + ".bash") 27 content = """#!/usr/bin/env bash 28 29 set -uo pipefail 30 31 files=( 32 {files} 33 ) 34 buildifier={buildifier} 35 36 # warnings is the default list of warnings with exclusions: 37 # bzl-visibility: we reference symbols in //go/private outside of //go. 38 # confusing-name: a good font makes these very clear. 39 # function-docstring: too verbose. Many functions don't need docs. 40 # function-docstring-header: too verbose for now. 41 # function-docstring-args: too verbose. 42 # function-docstring-return: too verbose. 43 # module-docstring: doesn't seem useful for many private modules. 44 # name-conventions: we have non-compliant providers. We might change them 45 # eventually, but we'll need to keep the old symbols for compatibility. 46 # print: used for warnings. 47 warnings=attr-cfg,attr-license,attr-non-empty,attr-output-default,attr-single-file,build-args-kwargs,constant-glob,ctx-actions,ctx-args,depset-iteration,depset-union,dict-concatenation,duplicated-name,filetype,git-repository,http-archive,integer-division,keyword-positional-params,load,load-on-top,native-android,native-build,native-cc,native-java,native-package,native-proto,native-py,no-effect,output-group,overly-nested-depset,package-name,package-on-top,positional-args,redefined-variable,repository-name,return-value,rule-impl-return,same-origin-load,string-iteration,uninitialized,unreachable,unused-variable 48 49 ok=0 50 for file in "${{files[@]}}"; do 51 "$buildifier" -mode=check -lint=warn -warnings="$warnings" "$file" 52 if [ $? -ne 0 ]; then 53 ok=1 54 fi 55 done 56 exit $ok 57 """.format( 58 buildifier = shell.quote(ctx.executable._buildifier.short_path), 59 files = "\n".join([shell.quote(f.path) for f in files]), 60 ) 61 ctx.actions.write(script, content, is_executable = True) 62 63 return [DefaultInfo( 64 executable = script, 65 default_runfiles = ctx.runfiles( 66 files = [script, ctx.executable._buildifier] + files, 67 ), 68 )] 69 70 buildifier_test = rule( 71 implementation = _buildifier_test_impl, 72 attrs = { 73 "data": attr.label_list( 74 allow_files = True, 75 ), 76 "_buildifier": attr.label( 77 default = "@com_github_bazelbuild_buildtools//buildifier", 78 executable = True, 79 cfg = "exec", 80 ), 81 }, 82 test = True, 83 )