diff --git a/buf/BUILD.bazel b/buf/BUILD.bazel index 706f143..3f7fbc4 100644 --- a/buf/BUILD.bazel +++ b/buf/BUILD.bazel @@ -21,6 +21,7 @@ bzl_library( srcs = ["defs.bzl"], deps = [ "//buf/internal:breaking", + "//buf/internal:format", "//buf/internal:lint", "//buf/internal:repo", ], diff --git a/buf/defs.bzl b/buf/defs.bzl index 0de2348..e460945 100644 --- a/buf/defs.bzl +++ b/buf/defs.bzl @@ -29,7 +29,9 @@ Use [gazelle](/gazelle/buf) to auto generate all of these rules based on `buf.ya load("//buf/internal:breaking.bzl", _buf_breaking_test = "buf_breaking_test") load("//buf/internal:lint.bzl", _buf_lint_test = "buf_lint_test") load("//buf/internal:repo.bzl", _buf_dependencies = "buf_dependencies") +load("//buf/internal:format.bzl", _buf_format = "buf_format") +buf_format = _buf_format buf_dependencies = _buf_dependencies def buf_breaking_test(timeout = "short", **kwargs): diff --git a/buf/internal/BUILD.bazel b/buf/internal/BUILD.bazel index 5489205..8a69d31 100644 --- a/buf/internal/BUILD.bazel +++ b/buf/internal/BUILD.bazel @@ -16,6 +16,11 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") package(default_visibility = ["//:__subpackages__"]) +bzl_library( + name = "format", + srcs = ["format.bzl"], +) + bzl_library( name = "breaking", srcs = ["breaking.bzl"], diff --git a/buf/internal/format.bzl b/buf/internal/format.bzl new file mode 100644 index 0000000..198cbc3 --- /dev/null +++ b/buf/internal/format.bzl @@ -0,0 +1,38 @@ +_DOC = """ +buf_format rule formats Protobuf files. +""" + +_TEMPLATE = """ +buf=$(readlink "{}") +if ! cd "$BUILD_WORKSPACE_DIRECTORY"; then + echo "Unable to change to workspace (BUILD_WORKSPACE_DIRECTORY: $BUILD_WORKSPACE_DIRECTORY)" + exit 1 +fi + +$buf format {} . +""" + +_TOOLCHAIN = str(Label("//tools/buf:toolchain_type")) + +def _buf_format_impl(ctx): + ctx.actions.write( + output = ctx.outputs.executable, + is_executable = True, + content = _TEMPLATE.format(ctx.toolchains[_TOOLCHAIN].cli.short_path, "-w"), + ) + + return [ + DefaultInfo( + runfiles = ctx.runfiles( + files = [ctx.toolchains[_TOOLCHAIN].cli], + ), + ), + ] + +buf_format = rule( + implementation = _buf_format_impl, + doc = _DOC, + attrs = {}, + toolchains = [_TOOLCHAIN], + executable = True, +) diff --git a/examples/bzlmod/BUILD.bazel b/examples/bzlmod/BUILD.bazel index ea541bb..24e457c 100644 --- a/examples/bzlmod/BUILD.bazel +++ b/examples/bzlmod/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("@rules_buf//buf:defs.bzl", "buf_lint_test") +load("@rules_buf//buf:defs.bzl", "buf_format", "buf_lint_test") load("@rules_proto//proto:defs.bzl", "proto_library") load("@gazelle//:def.bzl", "gazelle", "gazelle_binary") @@ -51,3 +51,7 @@ buf_lint_test( config = "//:buf.yaml", targets = [":root_proto"], ) + +buf_format( + name = "buf_format", +) diff --git a/examples/bzlmod/unused.proto b/examples/bzlmod/unused.proto index b7666a6..49caaba 100644 --- a/examples/bzlmod/unused.proto +++ b/examples/bzlmod/unused.proto @@ -12,4 +12,4 @@ // See the License for the specific language governing permissions and // limitations under the License. -syntax = "proto3"; \ No newline at end of file +syntax = "proto3";