diff --git a/README.md b/README.md index bde48ea9fa..8c590d9849 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,11 @@ for each architecture. See `build_test -h` for more information. #### `rustfmt` -All code should be formatted with `rustfmt`. Run `cargo fmt --all` to autoformat -your code before checking in a change. +All code should be formatted with `rustfmt`. We have a script that applies +rustfmt to all Rust code in the crosvm repo: please run `bin/fmt` before +checking in a change. This is different from `cargo fmt --all` which formats +multiple crates but a single workspace only; crosvm consists of multiple +workspaces. #### Dependencies diff --git a/bin/fmt b/bin/fmt new file mode 100755 index 0000000000..37e60706dc --- /dev/null +++ b/bin/fmt @@ -0,0 +1,40 @@ +#!/bin/bash + +# Run `cargo fmt` on all Rust code contained in crosvm. This is different from +# `cargo fmt --all` which formats multiple crates but a single workspace only. +# Crosvm consists of multiple workspaces. +# +# Usage: +# +# $ bin/fmt +# +# To print a diff and exit 1 if code is not formatted, but without changing any +# files, use: +# +# $ bin/fmt --check +# + +set -euo pipefail + +# Change into directory of script, which is crosvm/bin. +cd "$(dirname "${BASH_SOURCE[0]}")" + +# Jump up to root directory of crosvm repo. +cd .. + +# Keep track of whether any cargo fmt invocation exited with error. +EXIT=0 + +FIND_CARGO_TOMLS="$(find "$PWD" -name Cargo.toml)" + +while read path_to_cargo_toml; do + cd "$(dirname "$path_to_cargo_toml")" + + if grep --quiet '\[workspace\]' Cargo.toml; then + if ! cargo fmt --all -- "$@"; then + EXIT=1 + fi + fi +done <<< "$FIND_CARGO_TOMLS" + +exit $EXIT diff --git a/kokoro/Dockerfile b/kokoro/Dockerfile index 68a910f833..cc0d95213f 100644 --- a/kokoro/Dockerfile +++ b/kokoro/Dockerfile @@ -131,4 +131,4 @@ CMD rustup default "$(cat rust-toolchain)" && \ cargo test --no-fail-fast --all-features --all --exclude aarch64 $TEST_FLAGS -- \ --test-threads=1 $TEST_RUNNER_FLAGS && \ echo "Running cargo fmt" && \ - cargo fmt --all -- --check + bin/fmt --check