| #!/bin/bash |
| |
| # Runs Bazel build commands over rustfmt rules, where some are expected |
| # to fail. |
| # |
| # Can be run from anywhere within the rules_rust workspace. |
| |
| set -euo pipefail |
| |
| if [[ -z "${BUILD_WORKSPACE_DIRECTORY:-}" ]]; then |
| echo "This script should be run under Bazel" |
| exit 1 |
| fi |
| |
| cd "${BUILD_WORKSPACE_DIRECTORY}" |
| |
| # Executes a bazel build command and handles the return value, exiting |
| # upon seeing an error. |
| # |
| # Takes two arguments: |
| # ${1}: The expected return code. |
| # ${2}: The target within "//test/rustfmt" to be tested. |
| function check_build_result() { |
| local ret=0 |
| echo -n "Testing ${2}... " |
| (bazel test //test/rustfmt:"${2}") || ret="$?" && true |
| if [[ "${ret}" -ne "${1}" ]]; then |
| >&2 echo "FAIL: Unexpected return code [saw: ${ret}, want: ${1}] building target //test/rustfmt:${2}" |
| >&2 echo " Run \"bazel test //test/rustfmt:${2}\" to see the output" |
| exit 1 |
| else |
| echo "OK" |
| fi |
| } |
| |
| function test_all_and_apply() { |
| local -r TEST_OK=0 |
| local -r TEST_FAILED=3 |
| local -r VARIANTS=(rust_binary rust_library rust_shared_library rust_static_library) |
| |
| temp_dir="$(mktemp -d -t ci-XXXXXXXXXX)" |
| new_workspace="${temp_dir}/rules_rust_test_rustfmt" |
| |
| mkdir -p "${new_workspace}/test/rustfmt" && \ |
| cp -r test/rustfmt/* "${new_workspace}/test/rustfmt/" && \ |
| cat << EOF > "${new_workspace}/WORKSPACE.bazel" |
| workspace(name = "rules_rust_test_rustfmt") |
| local_repository( |
| name = "rules_rust", |
| path = "${BUILD_WORKSPACE_DIRECTORY}", |
| ) |
| load("@rules_rust//rust:repositories.bzl", "rust_repositories") |
| rust_repositories() |
| EOF |
| # See github.com/bazelbuild/rules_rust/issues/2317. |
| echo "build --noincompatible_sandbox_hermetic_tmp" > "${new_workspace}/.bazelrc" |
| |
| # Drop the 'norustfmt' tags |
| if [ "$(uname)" == "Darwin" ]; then |
| SEDOPTS=(-i '' -e) |
| else |
| SEDOPTS=(-i) |
| fi |
| sed ${SEDOPTS[@]} 's/"norustfmt"//' "${new_workspace}/test/rustfmt/rustfmt_integration_test_suite.bzl" |
| sed ${SEDOPTS[@]} 's/"manual"//' "${new_workspace}/test/rustfmt/rustfmt_integration_test_suite.bzl" |
| |
| pushd "${new_workspace}" |
| |
| for variant in ${VARIANTS[@]}; do |
| check_build_result $TEST_FAILED ${variant}_unformatted_2015_test |
| check_build_result $TEST_FAILED ${variant}_unformatted_2018_test |
| check_build_result $TEST_OK ${variant}_formatted_2015_test |
| check_build_result $TEST_OK ${variant}_formatted_2018_test |
| check_build_result $TEST_OK ${variant}_generated_test |
| done |
| |
| # Format a specific target |
| for variant in ${VARIANTS[@]}; do |
| bazel run @rules_rust//tools/rustfmt -- //test/rustfmt:${variant}_unformatted_2018 |
| done |
| |
| for variant in ${VARIANTS[@]}; do |
| check_build_result $TEST_FAILED ${variant}_unformatted_2015_test |
| check_build_result $TEST_OK ${variant}_unformatted_2018_test |
| check_build_result $TEST_OK ${variant}_formatted_2015_test |
| check_build_result $TEST_OK ${variant}_formatted_2018_test |
| check_build_result $TEST_OK ${variant}_generated_test |
| done |
| |
| # Format all targets |
| bazel run @rules_rust//tools/rustfmt --@rules_rust//:rustfmt.toml=//test/rustfmt:test_rustfmt.toml |
| |
| # Ensure all tests pass |
| check_build_result $TEST_OK "*" |
| |
| popd |
| |
| rm -rf "${temp_dir}" |
| } |
| |
| test_all_and_apply |