buildifier: decouple runner scripts from binaries (#1398)

This change aims at making `buildtools/buildifier` more modular and
easier to consume by enabling use of prebuilt binaries without pulling
in unnecessary dependencies - while strengthening upstream as the
authoritative home for runner script templates.

Today, `buildifier/BUILD.bazel` exposes two different sets of rules:
- exports for runner script templates (`runner.bash.template`,
  `runner.bat.template`) as well as `README.md`,
- `go` build & `sh` test rules which require external repos (`rules_go`,
  `rules_shell`) even for consumers who don't need to build the
  `buildifier` binary.

It is worth noticing there are two distinct community efforts on runner
scripts, the present/upstream `bazelbuild/buildtools` and the derived
`keith/buildifier-prebuilt` (Bazel Central Registry module).
These drift apart over time, leading to unsynchronized contents
(`factory.bzl`, `runner.bash.template`) and efforts, e.g. on Windows
support:
- https://github.com/bazelbuild/buildtools/pull/1230
- https://github.com/keith/buildifier-prebuilt/pull/89 (open for a year)

Intended benefits of this change:
- decoupling: by moving `go_binary` and `sh_test` targets into
  `buildifier/cmd`, the top-level `buildifier/BUILD.bazel` no longer
  requires `rules_go` nor `rules_shell`,
- flexibility: users can either build binaries from source (via
  `//buildifier/cmd`) or configure rules to use prebuilt binaries (e.g.
  via `multitool`) while still consuming the same upstream runner script
  templates,
- backward compatibility: aliases keep `//buildifier:buildifier*`
  working by delegating to `//buildifier/cmd:buildifier*`.
diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml
index d92f478..77bd379 100644
--- a/.bazelci/presubmit.yml
+++ b/.bazelci/presubmit.yml
@@ -23,4 +23,4 @@
     - "//:tests"
     - "-//warn/docs:docs_test"
     - "-//build:build_test"
-    - "-//buildifier:buildifier_integration_test"
+    - "-//buildifier/cmd:buildifier_integration_test"
diff --git a/BUILD.bazel b/BUILD.bazel
index bc2fc5a..80bb532 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -23,7 +23,7 @@
         "//api_proto:api.gen.pb.go_checkshtest",
         "//build:build_test",
         "//build_proto:build.gen.pb.go_checkshtest",
-        "//buildifier:buildifier_integration_test",
+        "//buildifier/cmd:buildifier_integration_test",
         "//deps_proto:deps.gen.pb.go_checkshtest",
         "//edit:edit_test",
         "//extra_actions_base_proto:extra_actions_base.gen.pb.go_checkshtest",
diff --git a/buildifier/BUILD.bazel b/buildifier/BUILD.bazel
index 5bf6338..3a282f2 100644
--- a/buildifier/BUILD.bazel
+++ b/buildifier/BUILD.bazel
@@ -1,123 +1,19 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
-load("@rules_shell//shell:sh_test.bzl", "sh_test")
-
-go_binary(
-    name = "buildifier",
-    embed = [":buildifier_lib"],
+# Keep earlier public labels working by pointing to the new `cmd` subpackage
+[alias(
+    name = name,
+    actual = "//buildifier/cmd:{}".format(name),
     visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-darwin-amd64",
-    out = "buildifier-darwin_amd64",
-    embed = [":buildifier_lib"],
-    goarch = "amd64",
-    goos = "darwin",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-linux-amd64",
-    out = "buildifier-linux_amd64",
-    embed = [":buildifier_lib"],
-    goarch = "amd64",
-    goos = "linux",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-windows-amd64",
-    out = "buildifier-windows_amd64.exe",
-    embed = [":buildifier_lib"],
-    goarch = "amd64",
-    goos = "windows",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-darwin-arm64",
-    out = "buildifier-darwin_arm64",
-    embed = [":buildifier_lib"],
-    goarch = "arm64",
-    goos = "darwin",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-linux-arm64",
-    out = "buildifier-linux_arm64",
-    embed = [":buildifier_lib"],
-    goarch = "arm64",
-    goos = "linux",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-windows-arm64",
-    out = "buildifier-windows_arm64.exe",
-    embed = [":buildifier_lib"],
-    goarch = "arm64",
-    goos = "windows",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-linux-riscv64",
-    out = "buildifier-linux_riscv64",
-    embed = [":buildifier_lib"],
-    goarch = "riscv64",
-    goos = "linux",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-go_binary(
-    name = "buildifier-linux-s390x",
-    out = "buildifier-linux_s390x",
-    embed = [":buildifier_lib"],
-    goarch = "s390x",
-    goos = "linux",
-    pure = "on",
-    visibility = ["//visibility:public"],
-)
-
-# Test that the buildifier binary works
-sh_test(
-    name = "buildifier_integration_test",
-    size = "small",
-    srcs = ["integration_test.sh"],
-    args = [
-        "$(location :buildifier)",
-    ],
-    data = [
-        ":buildifier",
-    ],
-    deps = ["@bazel_tools//tools/bash/runfiles"],
-)
-
-go_library(
-    name = "buildifier_lib",
-    srcs = ["buildifier.go"],
-    importpath = "github.com/bazelbuild/buildtools/buildifier",
-    visibility = ["//visibility:private"],
-    x_defs = {
-        "main.buildVersion": "{STABLE_buildVersion}",
-        "main.buildScmRevision": "{STABLE_buildScmRevision}",
-    },
-    deps = [
-        "//build",
-        "//buildifier/config",
-        "//buildifier/utils",
-        "//differ",
-        "//wspace",
-    ],
-)
+) for name in (
+    "buildifier",
+    "buildifier-darwin-amd64",
+    "buildifier-darwin-arm64",
+    "buildifier-linux-amd64",
+    "buildifier-linux-arm64",
+    "buildifier-linux-riscv64",
+    "buildifier-linux-s390x",
+    "buildifier-windows-amd64",
+    "buildifier-windows-arm64",
+)]
 
 exports_files(
     [
diff --git a/buildifier/cmd/BUILD.bazel b/buildifier/cmd/BUILD.bazel
new file mode 100644
index 0000000..6b303e2
--- /dev/null
+++ b/buildifier/cmd/BUILD.bazel
@@ -0,0 +1,120 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
+load("@rules_shell//shell:sh_test.bzl", "sh_test")
+
+go_binary(
+    name = "buildifier",
+    embed = [":buildifier_lib"],
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-darwin-amd64",
+    out = "buildifier-darwin_amd64",
+    embed = [":buildifier_lib"],
+    goarch = "amd64",
+    goos = "darwin",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-linux-amd64",
+    out = "buildifier-linux_amd64",
+    embed = [":buildifier_lib"],
+    goarch = "amd64",
+    goos = "linux",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-windows-amd64",
+    out = "buildifier-windows_amd64.exe",
+    embed = [":buildifier_lib"],
+    goarch = "amd64",
+    goos = "windows",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-darwin-arm64",
+    out = "buildifier-darwin_arm64",
+    embed = [":buildifier_lib"],
+    goarch = "arm64",
+    goos = "darwin",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-linux-arm64",
+    out = "buildifier-linux_arm64",
+    embed = [":buildifier_lib"],
+    goarch = "arm64",
+    goos = "linux",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-windows-arm64",
+    out = "buildifier-windows_arm64.exe",
+    embed = [":buildifier_lib"],
+    goarch = "arm64",
+    goos = "windows",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-linux-riscv64",
+    out = "buildifier-linux_riscv64",
+    embed = [":buildifier_lib"],
+    goarch = "riscv64",
+    goos = "linux",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+go_binary(
+    name = "buildifier-linux-s390x",
+    out = "buildifier-linux_s390x",
+    embed = [":buildifier_lib"],
+    goarch = "s390x",
+    goos = "linux",
+    pure = "on",
+    visibility = ["//visibility:public"],
+)
+
+# Test that the buildifier binary works
+sh_test(
+    name = "buildifier_integration_test",
+    size = "small",
+    srcs = ["integration_test.sh"],
+    args = [
+        "$(location :buildifier)",
+    ],
+    data = [
+        ":buildifier",
+    ],
+    deps = ["@bazel_tools//tools/bash/runfiles"],
+)
+
+go_library(
+    name = "buildifier_lib",
+    srcs = ["buildifier.go"],
+    importpath = "github.com/bazelbuild/buildtools/buildifier",
+    visibility = ["//visibility:private"],
+    x_defs = {
+        "main.buildVersion": "{STABLE_buildVersion}",
+        "main.buildScmRevision": "{STABLE_buildScmRevision}",
+    },
+    deps = [
+        "//build",
+        "//buildifier/config",
+        "//buildifier/utils",
+        "//differ",
+        "//wspace",
+    ],
+)
diff --git a/buildifier/buildifier.go b/buildifier/cmd/buildifier.go
similarity index 100%
rename from buildifier/buildifier.go
rename to buildifier/cmd/buildifier.go
diff --git a/buildifier/integration_test.sh b/buildifier/cmd/integration_test.sh
similarity index 100%
rename from buildifier/integration_test.sh
rename to buildifier/cmd/integration_test.sh
diff --git a/buildifier/config/BUILD.bazel b/buildifier/config/BUILD.bazel
index 070d756..9254f83 100644
--- a/buildifier/config/BUILD.bazel
+++ b/buildifier/config/BUILD.bazel
@@ -7,7 +7,7 @@
         "validation.go",
     ],
     importpath = "github.com/bazelbuild/buildtools/buildifier/config",
-    visibility = ["//buildifier:__pkg__"],
+    visibility = ["//buildifier/cmd:__pkg__"],
     deps = [
         "//tables",
         "//warn",