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.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 formated"
  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 -type f -name "*" | grep "\.h$\|\.cc$" > "${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" | grep "\.h$\|\.cc$" > "${CHECK_LIST_FILE}" || true
  81. else # "X${mode}" == "Xlastcommit"
  82. git diff --diff-filter=ACMRTUXB --name-only HEAD~ HEAD | grep "mindspore/ccsrc" | grep "\.h$\|\.cc$" > "${CHECK_LIST_FILE}" || true
  83. fi
  84. CHECK_RESULT_FILE=__code_format_check_result__
  85. echo "0" > "$CHECK_RESULT_FILE"
  86. # check format of files modified in the lastest commit
  87. while read line; do
  88. BASE_NAME=$(basename "${line}")
  89. TEMP_FILE="__TEMP__${BASE_NAME}"
  90. cp "${line}" "${TEMP_FILE}"
  91. ${CLANG_FORMAT} -i "${TEMP_FILE}"
  92. diff "${TEMP_FILE}" "${line}"
  93. ret=$?
  94. rm "${TEMP_FILE}"
  95. if [[ "${ret}" -ne 0 ]]; then
  96. echo "File ${line} is not formated, please format it."
  97. echo "1" > "${CHECK_RESULT_FILE}"
  98. break
  99. fi
  100. done < "${CHECK_LIST_FILE}"
  101. result=$(cat "${CHECK_RESULT_FILE}")
  102. rm "${CHECK_RESULT_FILE}"
  103. rm "${CHECK_LIST_FILE}"
  104. cd "${CURRENT_PATH}" || exit 1
  105. if [[ "X${result}" == "X0" ]]; then
  106. echo "Check PASS: specified files are well formated!"
  107. fi
  108. exit "${result}"