diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2024-10-26 10:06:46 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-26 10:06:46 +0800 |
| commit | 311413d382625613ef09036336fb89dbd4d3c7e7 (patch) | |
| tree | 66777f033b984071f8f573007eaffcf91349d143 /extras | |
| parent | d8969d87dcc9eea3f186a0c93c5e48d3d1659e05 (diff) | |
Actions workflow to format code on command (#5400)
* Add script to perform or check formatting
* Actions workflow to format code on command
Comment on a PR with /format
Diffstat (limited to 'extras')
| -rwxr-xr-x | extras/formatting.sh | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/extras/formatting.sh b/extras/formatting.sh new file mode 100755 index 000000000..dc3bbc7ca --- /dev/null +++ b/extras/formatting.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd "$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel)" || exit 1 + +check_only=0 + +while [[ "$#" -gt 0 ]]; do + case $1 in + -h | --help) help=1 ;; + --check-only) check_only=1 ;; + esac + shift +done + +if [ "$help" ]; then + me=$(basename "$0") + cat <<EOF +$me: Format or check formatting of files in this repo + +Usage: $me [--check-only] + +Options: + --check-only Check formatting without modifying files +EOF + exit 0 +fi + +require_bin() { + local name="$1" + local required="$2" + local version + + if ! command -v "$name" &>/dev/null; then + echo "This script needs $name, but it isn't in \$PATH" + missing_bin=1 + return + fi + + version=$("$name" --version | grep -oP "$name(?:\s+version)?\s+\K\d+\.\d+\.?\d*") + if ! printf '%s\n%s\n' "$required" "$version" | sort -V -C; then + echo "$name version $version is too old. Version $required or newer is required." + missing_bin=1 + fi +} + +require_bin "git" "1.8" +require_bin "gersemi" "0.16.2" + +if [ "${missing_bin:-}" = "1" ]; then + exit 1 +fi + +if [ "$missing_bin" ]; then + exit 1 +fi + +exit_code=0 + +cmake_formatting() { + readarray -t files < <(git ls-files '*.cmake' 'CMakeLists.txt' '**/CMakeLists.txt') + + common_args=( + # turn on warning when this is fixed https://github.com/BlankSpruce/gersemi/issues/39 + --no-warn-about-unknown-commands + --definitions "${files[@]}" + ) + + if [ "$check_only" -eq 1 ]; then + gersemi "${common_args[@]}" --diff --color "${files[@]}" + gersemi "${common_args[@]}" --check "${files[@]}" || exit_code=1 + else + gersemi "${common_args[@]}" --in-place "${files[@]}" + fi +} + +cmake_formatting + +exit $exit_code |
