From fd1b7ba52901179c19f5997b650518993d919f52 Mon Sep 17 00:00:00 2001 From: Kurtis Rader Date: Fri, 1 Apr 2016 20:48:11 -0700 Subject: support making fish code match the style guide This changes implements two new make targets: `style` and `style-all`. These make it easy to ensure that a change conforms to the project style guides for C++ and fish code. Fixes #571 --- build_tools/lint.fish | 21 +++++------- build_tools/style.fish | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 13 deletions(-) mode change 100755 => 100644 build_tools/lint.fish create mode 100755 build_tools/style.fish (limited to 'build_tools') diff --git a/build_tools/lint.fish b/build_tools/lint.fish old mode 100755 new mode 100644 index 09ab6f46..ef66d207 --- a/build_tools/lint.fish +++ b/build_tools/lint.fish @@ -13,7 +13,6 @@ set -e argv[1] if test "$argv[1]" = "--all" set all yes - set c_files src/ set cppchecks "$cppchecks,unusedFunction" set -e argv[1] end @@ -30,7 +29,9 @@ if test (uname -m) = "x86_64" set cppcheck_args -D__x86_64__ -D__LP64__ $cppcheck_args end -if test $all = no +if test $all = yes + set c_files src/*.cpp +else # We haven't been asked to lint all the source. If there are uncommitted # changes lint those, else lint the files in the most recent commit. set pending (git status --porcelain --short --untracked-files=all | sed -e 's/^ *//') @@ -44,10 +45,8 @@ if test $all = no set files (git show --porcelain --name-only --pretty=oneline head | tail --lines=+2) end - # Filter out the non-C/C++ files. + # Extract just the C/C++ files. set c_files (string match -r '.*\.c(?:pp)?$' -- $files) -else - set c_files src/*.cpp end # We now have a list of files to check so run the linters. @@ -61,10 +60,7 @@ if set -q c_files[1] # IMHO, writes its diagnostic messages to stderr. Anyone running # this who wants to capture its output will expect those messages to be # written to stdout. - cppcheck -q --verbose --std=posix --std=c11 --language=c++ \ - --template "[{file}:{line}]: {severity} ({id}): {message}" \ - --suppress=missingIncludeSystem \ - --inline-suppr --enable=$cppchecks $cppcheck_args $c_files 2>&1 + cppcheck -q --verbose --std=posix --std=c11 --language=c++ --template "[{file}:{line}]: {severity} ({id}): {message}" --suppress=missingIncludeSystem --inline-suppr --enable=$cppchecks $cppcheck_args $c_files 2>& 1 end if type -q oclint @@ -82,20 +78,19 @@ if set -q c_files[1] oclint-xcodebuild xcodebuild.log > /dev/null end if test $all = yes - oclint-json-compilation-database -e '/pcre2-10.20/' \ - -- -enable-global-analysis 2>&1 + oclint-json-compilation-database -e '/pcre2-10.20/' -- -enable-global-analysis 2>& 1 else set i_files for f in $c_files set i_files $i_files -i $f end echo oclint-json-compilation-database -e '/pcre2-10.20/' $i_files - oclint-json-compilation-database -e '/pcre2-10.20/' $i_files 2>&1 + oclint-json-compilation-database -e '/pcre2-10.20/' $i_files 2>& 1 end else # Presumably we're on Linux or other platform not requiring special # handling for oclint to work. - oclint $c_files -- $argv 2>&1 + oclint $c_files -- $argv 2>& 1 end end else diff --git a/build_tools/style.fish b/build_tools/style.fish new file mode 100755 index 00000000..76cf920d --- /dev/null +++ b/build_tools/style.fish @@ -0,0 +1,90 @@ +#!/usr/bin/env fish +# +# This is meant to be run by "make style" or "make style-all". It is not meant to +# be run directly from a shell prompt although it can be. +# +# This runs C++ files and fish scripts (*.fish) through their respective code +# formatting programs. +# +set c_files +set f_files +set all no + +if test "$argv[1]" = "--all" + set all yes + set -e argv[1] +end + +if set -q argv[1] + echo "Unexpected arguments: '$argv'" + exit 1 +end + +if test $all = yes + set c_files src/*.h src/*.cpp + set f_files ***.fish +else + # We haven't been asked to reformat all the source. If there are uncommitted + # changes reformat those, else reformat the files in the most recent commit. + set pending (git status --porcelain --short --untracked-files=all | sed -e 's/^ *//') + if count $pending > /dev/null + # There are pending changes so lint those files. + for arg in $pending + set files $files (string split -m 1 ' ' $arg)[2] + end + else + # No pending changes so lint the files in the most recent commit. + set files (git show --name-only --pretty=oneline head | tail --lines=+2) + end + + # Extract just the C/C++ files. + set c_files (string match -r '^.*\.(?:c|cpp|h)$' -- $files) + # Extract just the fish files. + set f_files (string match -r '^.*\.fish$' -- $files) +end + +# Run the C++ reformatter if we have any C++ files. +if set -q c_files[1] + if type -q clang-format + echo + echo ======================================== + echo Running clang-format + echo ======================================== + for file in $c_files + clang-format $file > $file.new + if cmp --quiet $file $file.new + echo $file was correctly formatted + rm $file.new + else + echo $file was NOT correctly formatted + mv $file.new $file + end + end + else + echo + echo 'WARNING: Cannot find clang-format command' + echo + end +end + +# Run the fish reformatter if we have any fish files. +if set -q f_files[1] + if not type -q fish_indent + make fish_indent + set PATH . $PATH + end + echo + echo ======================================== + echo Running fish_indent + echo ======================================== + for file in $f_files + fish_indent < $file > $file.new + if cmp --quiet $file $file.new + echo $file was correctly formatted + rm $file.new + else + echo $file was NOT correctly formatted + mv $file.new $file + end + end +end -- cgit v1.2.3