1#!/bin/bash
2
3# This script reformats source files using the clang-format utility.
4#
5# Files are changed in-place, so make sure you don't have anything open in an
6# editor, and you may want to commit before formatting in case of awryness.
7#
8# This must be run on a clean repository to succeed
9#
10# Input parmameter must be full path to git repo to scan
11
12DIR=$1
13cd ${DIR}
14
15set -e
16
17echo "Formatting code under $DIR/"
18
19if [[ -f "setup.cfg" ]]; then
20  pycodestyle --show-source .
21  rc=$?
22  if [[ ${rc} -ne 0 ]]; then
23    exit ${rc}
24  fi
25fi
26
27# Allow called scripts to know which clang format we are using
28export CLANG_FORMAT="clang-format-8"
29IGNORE_FILE=".clang-ignore"
30declare -a IGNORE_LIST
31
32if [[ -f "${IGNORE_FILE}" ]]; then
33  readarray -t IGNORE_LIST < "${IGNORE_FILE}"
34fi
35
36ignorepaths=""
37ignorefiles=""
38
39for path in "${IGNORE_LIST[@]}"; do
40  # Check for comment, line starting with space, or zero-length string.
41  # Checking for [[:space:]] checks all options.
42  if [[ -z "${path}" ]] || [[ "${path}" =~ ^(#|[[:space:]]).*$ ]]; then
43    continue
44  fi
45
46  # All paths must start with ./ for find's path prune expectation.
47  if [[ "${path}" =~ ^\.\/.+$ ]]; then
48    ignorepaths+=" ${path}"
49  else
50    ignorefiles+=" ${path}"
51  fi
52done
53
54searchfiles=""
55while read path; do
56  # skip ignorefiles
57  if [[ $ignorefiles == *"$(basename "${path}")"* ]]; then
58    continue
59  fi
60
61  skip=false
62  #skip paths in ingorepaths
63  for pathname in $ignorepaths; do
64    if [[ "./${path}" == "${pathname}"* ]]; then
65       skip=true
66       break
67    fi
68  done
69
70  if [ "$skip" = true ]; then
71   continue
72  fi
73  searchfiles+="\"./${path}\" "
74
75# Get C and C++ files managed by git and skip the mako files
76done <<<$(git ls-files | grep -e '\.[ch]pp$' -e '\.[ch]$' | grep -v '\.mako\.')
77
78if [[ -f ".clang-format" ]]; then
79  echo ${searchfiles} | xargs "${CLANG_FORMAT}" -i
80  git --no-pager diff --exit-code
81fi
82
83# Sometimes your situation is terrible enough that you need the flexibility.
84# For example, phosphor-mboxd.
85if [[ -f "format-code.sh" ]]; then
86  ./format-code.sh
87  git --no-pager diff --exit-code
88fi
89