blob: bb2b5059371a35db5df8f62ebd73b222ea87727f [file] [log] [blame]
diff --git a/buildifier/buildifier.bzl b/buildifier/buildifier.bzl
index 42445e7..0957f94 100644
--- a/buildifier/buildifier.bzl
+++ b/buildifier/buildifier.bzl
@@ -34,8 +34,25 @@ def buildifier(**kwargs):
def _buildifier_test_impl(ctx):
return [buildifier_impl_factory(ctx, test_rule = True)]
-buildifier_test = rule(
+_buildifier_test = rule(
implementation = _buildifier_test_impl,
attrs = buildifier_attr_factory(True),
test = True,
)
+
+def buildifier_test(**kwargs):
+ """
+ Wrapper for the _buildifier_test rule. Optionally disables sandboxing and caching.
+
+ Args:
+ **kwargs: all parameters for _buildifier_test
+ """
+ if kwargs.get("no_sandbox", False):
+ tags = kwargs.get("tags", [])
+
+ # Note: the "external" tag is a workaround for bazelbuild#15516.
+ for t in ["no-sandbox", "no-cache", "external"]:
+ if t not in tags:
+ tags.append(t)
+ kwargs["tags"] = tags
+ _buildifier_test(**kwargs)
diff --git a/buildifier/internal/factory.bzl b/buildifier/internal/factory.bzl
index 779c789..34a4997 100644
--- a/buildifier/internal/factory.bzl
+++ b/buildifier/internal/factory.bzl
@@ -46,6 +46,10 @@ def buildifier_attr_factory(test_rule = False):
"verbose": attr.bool(
doc = "Print verbose information on standard error",
),
+ "exclude_patterns": attr.string_list(
+ allow_empty = True,
+ doc = "A list of glob patterns passed to the find command. E.g. './vendor/*' to exclude the Go vendor directory. In test rules, this attribute requires the use of the no_sandbox attribute.",
+ ),
"mode": attr.string(
default = "fix" if not test_rule else "diff",
doc = "Formatting mode",
@@ -80,7 +84,6 @@ def buildifier_attr_factory(test_rule = False):
if test_rule:
attrs.update({
"srcs": attr.label_list(
- allow_empty = False,
allow_files = [
".bazel",
".bzl",
@@ -91,12 +94,13 @@ def buildifier_attr_factory(test_rule = False):
],
doc = "A list of labels representing the starlark files to include in the test",
),
- })
- else:
- attrs.update({
- "exclude_patterns": attr.string_list(
- allow_empty = True,
- doc = "A list of glob patterns passed to the find command. E.g. './vendor/*' to exclude the Go vendor directory",
+ "no_sandbox": attr.bool(
+ default = False,
+ doc = "Set to True to enable running buildifier on all files on the workspace",
+ ),
+ "workspace": attr.label(
+ allow_single_file = True,
+ doc = "Label of the WORKSPACE file; required when the no-sandbox attribute is True",
),
})
@@ -147,15 +151,24 @@ def buildifier_impl_factory(ctx, test_rule = False):
args.append("-add_tables=%s" % ctx.file.add_tables.path)
exclude_patterns_str = ""
- if not test_rule and ctx.attr.exclude_patterns:
+ if ctx.attr.exclude_patterns:
+ if test_rule and not ctx.attr.no_sandbox:
+ fail("Cannot use 'exclude_patterns' in a test rule without 'no_sandbox'")
exclude_patterns = ["\\! -path %s" % shell.quote(pattern) for pattern in ctx.attr.exclude_patterns]
exclude_patterns_str = " ".join(exclude_patterns)
+ workspace = ""
+ if test_rule and ctx.attr.no_sandbox:
+ if not ctx.file.workspace:
+ fail("Cannot use 'no_sandbox' without a 'workspace'")
+ workspace = ctx.file.workspace.path
+
out_file = ctx.actions.declare_file(ctx.label.name + ".bash")
substitutions = {
"@@ARGS@@": shell.array_literal(args),
"@@BUILDIFIER_SHORT_PATH@@": shell.quote(ctx.executable.buildifier.short_path),
"@@EXCLUDE_PATTERNS@@": exclude_patterns_str,
+ "@@WORKSPACE@@": workspace,
}
ctx.actions.expand_template(
template = ctx.file._runner,
@@ -167,6 +180,8 @@ def buildifier_impl_factory(ctx, test_rule = False):
runfiles = [ctx.executable.buildifier]
if test_rule:
runfiles.extend(ctx.files.srcs)
+ if ctx.attr.no_sandbox:
+ runfiles.append(ctx.file.workspace)
return DefaultInfo(
files = depset([out_file]),
diff --git a/buildifier/runner.bash.template b/buildifier/runner.bash.template
index 17e6a4b..fbe3e75 100644
--- a/buildifier/runner.bash.template
+++ b/buildifier/runner.bash.template
@@ -2,6 +2,7 @@
BUILDIFIER_SHORT_PATH=@@BUILDIFIER_SHORT_PATH@@
ARGS=@@ARGS@@
+WORKSPACE="@@WORKSPACE@@"
# Get the absolute path to the buildifier executable
buildifier_short_path=$(readlink "$BUILDIFIER_SHORT_PATH")
@@ -9,6 +10,15 @@ buildifier_short_path=$(readlink "$BUILDIFIER_SHORT_PATH")
# Use TEST_WORKSPACE to determine if the script is being ran under a test
if [[ ! -z "${TEST_WORKSPACE+x}" && -z "${BUILD_WORKSPACE_DIRECTORY+x}" ]]; then
FIND_FILE_TYPE="l"
+ # If WORKSPACE was provided, then the script is being run under a test in no_sandbox mode
+ # cd to the directory contatining the WORKSPACE file
+ if [[ ! -z "${WORKSPACE+x}" ]]; then
+ FIND_FILE_TYPE="f"
+ WORKSPACE_PATH="$(dirname "$(realpath ${WORKSPACE})")"
+ if ! cd "$WORKSPACE_PATH" ; then
+ echo "Unable to change to workspace (WORKSPACE_PATH: ${WORKSPACE_PATH})"
+ fi
+ fi
else
# Change into the workspace directory if this is _not_ a test
if ! cd "$BUILD_WORKSPACE_DIRECTORY"; then