Add a gofmt check to CI
If we're going to start having folks writing Go code, it'll be good to
make sure that all the code is formatted. It means that folks should
never have formatting changes in their patch that's unrelated to what
they're actually trying to do.
Change-Id: I6cb657327dd4a238356b7ef38b9fb94446723ee5
Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
diff --git a/build_tests/hello.go b/build_tests/hello.go
index 4cc584b..d2c4e91 100644
--- a/build_tests/hello.go
+++ b/build_tests/hello.go
@@ -3,5 +3,5 @@
import "fmt"
func main() {
- fmt.Println("Hello world")
+ fmt.Println("Hello world")
}
diff --git a/tools/ci/buildkite.yaml b/tools/ci/buildkite.yaml
index 6792591..55288f9 100644
--- a/tools/ci/buildkite.yaml
+++ b/tools/ci/buildkite.yaml
@@ -8,6 +8,11 @@
ROBORIO_TARGETS: ${TARGETS} //y2020:download_stripped
steps:
+ - label: "lint"
+ commands:
+ - tools/ci/clean-disk.sh
+ - tools/bazel ${STARTUP} --output_base=../lint_output_base run ${COMMON} --config=k8 //tools/lint:run-ci
+
- label: "x86_64"
commands:
- tools/ci/clean-disk.sh
diff --git a/tools/lint/BUILD b/tools/lint/BUILD
new file mode 100644
index 0000000..30fc7c9
--- /dev/null
+++ b/tools/lint/BUILD
@@ -0,0 +1,23 @@
+sh_binary(
+ name = "gofmt",
+ srcs = ["gofmt.sh"],
+ data = [
+ "@go_sdk//:bin/gofmt",
+ ],
+ deps = [
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+)
+
+sh_binary(
+ name = "run-ci",
+ srcs = [
+ "run-ci.sh",
+ ],
+ data = [
+ ":gofmt",
+ ],
+ deps = [
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+)
diff --git a/tools/lint/gofmt.sh b/tools/lint/gofmt.sh
new file mode 100755
index 0000000..b040d35
--- /dev/null
+++ b/tools/lint/gofmt.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+readonly GOFMT="$(rlocation go_sdk/bin/gofmt)"
+
+# Run everything from the root of the tree.
+cd "${BUILD_WORKSPACE_DIRECTORY}"
+
+# Find all the Go files in the repo.
+go_files=($(git ls-tree --name-only --full-tree -r @ \
+ | grep -v '^third_party/' \
+ | (grep '\.go$' || :)))
+
+# If we have any Go files, format them.
+if ((${#go_files[@]} > 0)); then
+ exec "${GOFMT}" -w "${go_files[@]}"
+fi
diff --git a/tools/lint/run-ci.sh b/tools/lint/run-ci.sh
new file mode 100755
index 0000000..a1bc07c
--- /dev/null
+++ b/tools/lint/run-ci.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# Perform runfile initialization here so that child processes have a proper
+# RUNFILES_DIR variable set.
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+gofmt() {
+ ./tools/lint/gofmt
+}
+
+git_status_is_clean() {
+ cd "${BUILD_WORKSPACE_DIRECTORY}"
+ if ! git diff --quiet; then
+ echo "One or more linters appear to have made changes to your code!" >&2
+ return 1
+ fi
+}
+
+# All the linters that we are going to run.
+readonly -a LINTERS=(
+ gofmt
+ git_status_is_clean # This must the last linter.
+)
+
+failure=0
+for linter in "${LINTERS[@]}"; do
+ if ! (eval "${linter}"); then
+ failure=1
+ fi
+done
+
+if ((failure != 0)); then
+ echo "One or more linters failed." >&2
+ cd "${BUILD_WORKSPACE_DIRECTORY}"
+ git --no-pager diff || :
+ exit "${failure}"
+fi
+
+exit 0