You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

check_clang_format.sh 3.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/bin/bash
  2. # Copyright 2019 Huawei Technologies Co., Ltd
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. # ============================================================================
  16. set -e
  17. CLANG_FORMAT=$(which clang-format) || (echo "Please install 'clang-format' tool first"; exit 1)
  18. version=$("${CLANG_FORMAT}" --version | sed -n "s/.*\ \([0-9]*\)\.[0-9]*\.[0-9]*.*/\1/p")
  19. if [[ "${version}" -lt "8" ]]; then
  20. echo "clang-format's version must be at least 8.0.0"
  21. exit 1
  22. fi
  23. CURRENT_PATH=$(pwd)
  24. SCRIPTS_PATH=$(dirname "$0")
  25. echo "CURRENT_PATH=$CURRENT_PATH"
  26. echo "SCRIPTS_PATH=$SCRIPTS_PATH"
  27. # print usage message
  28. function usage()
  29. {
  30. echo "Check whether the specified source files were well formatted"
  31. echo "Usage:"
  32. echo "bash $0 [-a] [-c] [-l] [-h]"
  33. echo "e.g. $0 -a"
  34. echo ""
  35. echo "Options:"
  36. echo " -a Check code format of all files, default case"
  37. echo " -c Check code format of the files changed compared to last commit"
  38. echo " -l Check code format of the files changed in last commit"
  39. echo " -h Print usage"
  40. }
  41. # check and set options
  42. function checkopts()
  43. {
  44. # init variable
  45. mode="all" # default check all files
  46. # Process the options
  47. while getopts 'aclh' opt
  48. do
  49. case "${opt}" in
  50. a)
  51. mode="all"
  52. ;;
  53. c)
  54. mode="changed"
  55. ;;
  56. l)
  57. mode="lastcommit"
  58. ;;
  59. h)
  60. usage
  61. exit 0
  62. ;;
  63. *)
  64. echo "Unknown option ${opt}!"
  65. usage
  66. exit 1
  67. esac
  68. done
  69. }
  70. # init variable
  71. # check options
  72. checkopts "$@"
  73. # switch to project root path, which contains clang-format config file '.clang-format'
  74. cd "${SCRIPTS_PATH}/.." || exit 1
  75. CHECK_LIST_FILE='__checked_files_list__'
  76. if [ "X${mode}" == "Xall" ]; then
  77. find mindspore/{ccsrc,core,lite} -type f -name "*" | grep "\.h$\|\.cc$\|\.c$" > "${CHECK_LIST_FILE}" || true
  78. elif [ "X${mode}" == "Xchanged" ]; then
  79. # --diff-filter=ACMRTUXB will ignore deleted files in commit
  80. git diff --diff-filter=ACMRTUXB --name-only | grep "mindspore/ccsrc\|mindspore/core\|mindspore/lite" | grep "\.h$\|\.cc$\|\.c$" > "${CHECK_LIST_FILE}" || true
  81. else # "X${mode}" == "Xlastcommit"
  82. git diff --diff-filter=ACMRTUXB --name-only HEAD~ HEAD | grep "mindspore/ccsrc\|mindspore/core\|mindspore/lite" | grep "\.h$\|\.cc$\|\.c$" > "${CHECK_LIST_FILE}" || true
  83. fi
  84. CHECK_RESULT_FILE=__code_format_check_result__
  85. echo "0" > "$CHECK_RESULT_FILE"
  86. set +e
  87. # check format of files modified in the latest commit
  88. while read line; do
  89. if [ ! -e ${line} ]; then
  90. continue
  91. fi
  92. BASE_NAME=$(basename "${line}")
  93. TEMP_FILE="__TEMP__${BASE_NAME}"
  94. cp "${line}" "${TEMP_FILE}"
  95. ${CLANG_FORMAT} -i "${TEMP_FILE}"
  96. diff "${TEMP_FILE}" "${line}"
  97. ret=$?
  98. rm "${TEMP_FILE}"
  99. if [[ "${ret}" -ne 0 ]]; then
  100. echo "File ${line} is not formatted, please format it."
  101. echo "1" > "${CHECK_RESULT_FILE}"
  102. break
  103. fi
  104. done < "${CHECK_LIST_FILE}"
  105. set -e
  106. result=$(cat "${CHECK_RESULT_FILE}")
  107. rm "${CHECK_RESULT_FILE}"
  108. rm "${CHECK_LIST_FILE}"
  109. cd "${CURRENT_PATH}" || exit 1
  110. if [[ "X${result}" == "X0" ]]; then
  111. echo "Check PASS: specified files are well formatted!"
  112. fi
  113. exit "${result}"