#!/usr/bin/env bash # This program source code file is part of KICAD, a free EDA CAD application. # # Copyright (C) 2019 Kicad Developers, see AUTHORS.txt for contributors. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, you may find one here: # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # or you may search the http://www.gnu.org website for the version 2 license, # or you may write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # Simple program to check and fix formatting in KiCad source files, # while ignoring violations in "uncontrolled" files, such as generated files # or 3rd party sources. usage='usage: check_coding.sh [] [--] --help Print usage plus more detailed help. --diff Only show proposed changes, do not format files --cached Re-format changes currently staged for commit (default) --amend Re-format changes made in the previous commit --commit Re-format changes made since commit-rev --ci Run in CI mode to return non-zero when there are formatting errors ' help="$usage"' Example to format cached files: check_coding.sh To show what would be done: check_coding.sh --diff ' die() { echo "$@" 1>&2; exit 1 } # Parse command-line arguments. ci=false diff=false mode='cached' while test "$#" != 0; do case "$1" in --diff) diff=true ;; --amend) mode='amend' ;; --cached) mode='cached' ;; --commit) mode='commit' format_ref_commit="$2" shift ;; --ci) ci=true ;; --) shift ; break ;; -*) die "$usage" ;; *) break ;; esac shift done test "$#" = 0 || die "$usage" # This is the main KiCad formatting attribute # used by .gitattributes to mark KiCad source files format_attribute="format.clang-format-kicad" format_commit='HEAD' # Select the git file list command and the commit to check case "${mode}" in '') echo "$usage"; exit 0 ;; commit) # Files changed since listed commit git_list_files="git diff-tree --diff-filter=ACM --name-only HEAD ${format_ref_commit} -r --no-commit-id" format_commit=${format_ref_commit} ;; amend) # Files changed by the last commit git_list_files='git diff-tree --diff-filter=ACM --name-only HEAD -r --no-commit-id' format_commit='HEAD^' ;; cached) # Currently staged files git_list_files='git diff-index --diff-filter=ACM --name-only HEAD --cached' ;; *) die "Invalid mode: $mode" ;; esac if [ "${diff}" = true ]; then # Only show the proposed changes format_command="git clang-format --diff ${format_commit}" else # Actually make the changes format_command="git clang-format ${format_commit}" fi if [ "${ci}" = true ]; then # In CI mode we want to set the return value based on modifications (1 = modifications # needed, 0 = no modifications). We must capture the output to do this (since git clang-format # will always return 0). By capturing the output, we break the terminal coloring, so we hide # this inside a special CI mode. format_results="$( \ ${git_list_files} | # Filter sources with the formatting attribute set git check-attr ${format_attribute} --stdin | # output only the file names grep ": set$" | cut -d: -f1 | # Apply the formatting command xargs ${format_command} )" echo "$format_results" # Read the results to see if modifications have been requested if [[ $format_results == "no modified files to format" ]] \ || [[ $format_results == "clang-format did not modify any files" ]]; then true else false fi else ${git_list_files} | # Filter sources with the formatting attribute set git check-attr ${format_attribute} --stdin | # output only the file names grep ": set$" | cut -d: -f1 | # Apply the formatting command xargs ${format_command} fi