From: Philippe Proulx Date: Mon, 30 Oct 2023 18:12:41 +0000 (-0400) Subject: tools/format-cpp: add `.sh` extension to identify it X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=ac4d5cf0acd3b2c10f82da788ddc0ab08f13c138 tools/format-cpp: add `.sh` extension to identify it Signed-off-by: Philippe Proulx Change-Id: Ifb57e0a26a4d7a2da99bd74fdf24d8aadcec4cf6 Reviewed-on: https://review.lttng.org/c/babeltrace/+/11173 --- diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index d5241ff4..268c4445 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -1680,20 +1680,20 @@ You need clang-format{nbsp}15 to use the project's `.clang-format` file. To automatically format all the project's {cpp} files, run: ---- -$ ./tools/format-cpp +$ ./tools/format-cpp.sh ---- Pass a directory path to only format the {cpp} files it contains: ---- -$ ./tools/format-cpp ./src/cli +$ ./tools/format-cpp.sh ./src/cli ---- Use the `FORMATTER` environment variable to override the default formatter (`clang-format{nbsp}-i`): ---- -$ FORMATTER='my-clang-format-15 -i' ./tools/format-cpp +$ FORMATTER='my-clang-format-15 -i' ./tools/format-cpp.sh ---- ==== Naming diff --git a/Makefile.am b/Makefile.am index 642466fa..b3a5f29c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -26,5 +26,5 @@ EXTRA_DIST = \ LICENSES/LGPL-2.1 \ LICENSES/MIT \ std-ext-lib.txt \ - tools/format-cpp \ + tools/format-cpp.sh \ version diff --git a/tools/format-cpp b/tools/format-cpp deleted file mode 100755 index 364dafe1..00000000 --- a/tools/format-cpp +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash -# -# SPDX-License-Identifier: GPL-2.0-only -# -# Copyright (C) 2020-2023 Philippe Proulx - -expected_formatter_major_version=15 - -# Runs the formatter, returning 1 if it's not the expected version. -# -# Argument 1: -# Starting directory. -# -# Remaining arguments: -# Formatter command. -format_cpp() { - local root_dir=$1 - - shift - - local formatter=("$@") - local version - - if ! version=$("${formatter[@]}" --version); then - echo "Cannot execute \`${formatter[*]} --version\`." >&2 - return 1 - fi - - if [[ "$version" != *"clang-format version $expected_formatter_major_version"* ]]; then - { - echo "Expecting clang-format $expected_formatter_major_version." - echo - echo Got: - echo - echo "$version" - } >& 2 - - return 1 - fi - - # Using xargs(1) to fail as soon as the formatter fails (`-exec` - # won't stop if its subprocess fails). - # - # We want an absolute starting directory because find(1) excludes - # files in specific subdirectories. - find "$(realpath "$root_dir")" \( -name '*.cpp' -o -name '*.hpp' \) \ - ! -path '*/src/cpp-common/optional.hpp' \ - ! -path '*/src/cpp-common/string_view.hpp' \ - ! -path '*/src/cpp-common/nlohmann/json.hpp' \ - ! -path '*/src/plugins/ctf/common/metadata/parser.*' \ - ! -path '*/src/plugins/ctf/common/metadata/lexer.*' \ - -print0 | xargs -P"$(nproc)" -n1 -t -0 "${formatter[@]}" -} - -# Choose formatter -if [[ -n "$FORMATTER" ]]; then - # Try using environment-provided formatter - read -ra formatter <<< "$FORMATTER" -elif command -v clang-format-$expected_formatter_major_version &> /dev/null; then - # Try using the expected version of clang-format - formatter=("clang-format-$expected_formatter_major_version" -i) -else - # Try using `clang-format` as is - formatter=(clang-format -i) -fi - -# Choose root directory -if (($# == 1)); then - root_dir=$1 - - if [[ ! -d "$root_dir" ]]; then - echo "\`$root_dir\`: expecting an existing directory." >& 2 - exit 1 - fi -else - # Default: root of the project, processing all C++ files - root_dir="$(dirname "${BASH_SOURCE[0]}")/.." -fi - -# Try to format files -format_cpp "$root_dir" "${formatter[@]}" diff --git a/tools/format-cpp.sh b/tools/format-cpp.sh new file mode 100755 index 00000000..364dafe1 --- /dev/null +++ b/tools/format-cpp.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2020-2023 Philippe Proulx + +expected_formatter_major_version=15 + +# Runs the formatter, returning 1 if it's not the expected version. +# +# Argument 1: +# Starting directory. +# +# Remaining arguments: +# Formatter command. +format_cpp() { + local root_dir=$1 + + shift + + local formatter=("$@") + local version + + if ! version=$("${formatter[@]}" --version); then + echo "Cannot execute \`${formatter[*]} --version\`." >&2 + return 1 + fi + + if [[ "$version" != *"clang-format version $expected_formatter_major_version"* ]]; then + { + echo "Expecting clang-format $expected_formatter_major_version." + echo + echo Got: + echo + echo "$version" + } >& 2 + + return 1 + fi + + # Using xargs(1) to fail as soon as the formatter fails (`-exec` + # won't stop if its subprocess fails). + # + # We want an absolute starting directory because find(1) excludes + # files in specific subdirectories. + find "$(realpath "$root_dir")" \( -name '*.cpp' -o -name '*.hpp' \) \ + ! -path '*/src/cpp-common/optional.hpp' \ + ! -path '*/src/cpp-common/string_view.hpp' \ + ! -path '*/src/cpp-common/nlohmann/json.hpp' \ + ! -path '*/src/plugins/ctf/common/metadata/parser.*' \ + ! -path '*/src/plugins/ctf/common/metadata/lexer.*' \ + -print0 | xargs -P"$(nproc)" -n1 -t -0 "${formatter[@]}" +} + +# Choose formatter +if [[ -n "$FORMATTER" ]]; then + # Try using environment-provided formatter + read -ra formatter <<< "$FORMATTER" +elif command -v clang-format-$expected_formatter_major_version &> /dev/null; then + # Try using the expected version of clang-format + formatter=("clang-format-$expected_formatter_major_version" -i) +else + # Try using `clang-format` as is + formatter=(clang-format -i) +fi + +# Choose root directory +if (($# == 1)); then + root_dir=$1 + + if [[ ! -d "$root_dir" ]]; then + echo "\`$root_dir\`: expecting an existing directory." >& 2 + exit 1 + fi +else + # Default: root of the project, processing all C++ files + root_dir="$(dirname "${BASH_SOURCE[0]}")/.." +fi + +# Try to format files +format_cpp "$root_dir" "${formatter[@]}"