copyright-format.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #!/usr/bin/env bash
  2. set -e
  3. ROOT_DIR=$(cd "$(dirname "$0")/$(dirname "$(test -L "$0" && readlink "$0" || echo "/")")"; pwd)
  4. function usage()
  5. {
  6. echo "Usage: copyright-format.sh [<args>]"
  7. echo
  8. echo "Options:"
  9. echo " -h|--help print the help info"
  10. echo " -c|--check check whether there are format issues in C++ files"
  11. echo " -f|--fix fix all the format issue directly"
  12. echo
  13. }
  14. pushd "$ROOT_DIR"/../..
  15. COPYRIGHT_FILE="$ROOT_DIR"/default-copyright.txt
  16. COPYRIGHT=$(cat "$COPYRIGHT_FILE")
  17. LINES_NUM=$(echo "$COPYRIGHT" | wc -l)
  18. DEFAULT_YEAR="2017"
  19. # The key words that must included in copyright description.
  20. KEYWORDS=(
  21. "Copyright"
  22. "Ray Authors"
  23. "License"
  24. )
  25. RUN_TYPE="diff"
  26. FILE_LIST_TMP_FILE="/tmp/.cr_file_list_tmp"
  27. TMP_FILE="/tmp/.cr_tmp"
  28. # The cpp files that will be checked and formatted.
  29. INCLUDES_CPP_DIRS=(
  30. src
  31. cpp
  32. )
  33. # The files that should be skipped.
  34. EXCLUDES_DIRS=(
  35. src/ray/object_manager/plasma/
  36. src/ray/thirdparty
  37. cpp/example
  38. )
  39. ERROR_FILES=()
  40. # Parse options
  41. while [ $# -gt 0 ]; do
  42. key="$1"
  43. case $key in
  44. -h|--help)
  45. usage
  46. exit 0
  47. ;;
  48. -c|--check)
  49. RUN_TYPE="diff"
  50. ;;
  51. -f|--fix)
  52. RUN_TYPE="fix"
  53. ;;
  54. *)
  55. echo "ERROR: unknown option \"$key\""
  56. echo
  57. usage
  58. exit 1
  59. ;;
  60. esac
  61. shift
  62. done
  63. for directory in "${INCLUDES_CPP_DIRS[@]}"; do
  64. cmd_args="find $directory -type f"
  65. for excluded in "${EXCLUDES_DIRS[@]}"; do
  66. cmd_args="${cmd_args} ! -path "
  67. cmd_args="${cmd_args} '${excluded}"
  68. if [[ "${excluded: -1}" != "/" ]];then
  69. cmd_args="${cmd_args}/"
  70. fi
  71. cmd_args="${cmd_args}*'"
  72. done
  73. cmd_args="${cmd_args} \( -name '*.cc' -or -name '*.h' -or -name '*.proto' \)"
  74. eval "${cmd_args}" > "$FILE_LIST_TMP_FILE"
  75. while IFS=$'\n' read -r f
  76. do
  77. head_content=$(sed -n "1,${LINES_NUM}p" "$f")
  78. match="true"
  79. for key_word in "${KEYWORDS[@]}"; do
  80. if [[ $head_content != *$key_word* ]];then
  81. match="false"
  82. break
  83. fi
  84. done
  85. if [[ "$match" == "false" ]]; then
  86. ERROR_FILES+=("$f")
  87. if [[ "$RUN_TYPE" == "fix" ]];then
  88. first_added_year=$(git log --pretty=format:%ad --date=short "$f" | awk -F- '{print $1}' | tail -1)
  89. last_modified_year=$(git log --pretty=format:%ad --date=short "$f" | awk -F- '{print $1}' | head -1)
  90. years=""
  91. if [[ "$first_added_year" == "$last_modified_year" ]];then
  92. years=$first_added_year
  93. else
  94. years="${first_added_year}-${last_modified_year}"
  95. fi
  96. sed '1s/^/\n/' "$f" > $TMP_FILE
  97. mv $TMP_FILE "$f"
  98. cat "$COPYRIGHT_FILE" "$f" > $TMP_FILE
  99. mv $TMP_FILE "$f"
  100. sed "s/${DEFAULT_YEAR}/${years}/" "$f" > $TMP_FILE
  101. mv $TMP_FILE "$f"
  102. fi
  103. fi
  104. done < $"$FILE_LIST_TMP_FILE"
  105. rm -f "$FILE_LIST_TMP_FILE"
  106. done
  107. if [[ ${#ERROR_FILES[*]} -gt 0 ]];then
  108. if [[ "$RUN_TYPE" == "fix" ]];then
  109. echo "Copyright has been added to the files below:"
  110. printf '%s\n' "${ERROR_FILES[@]}"
  111. exit 0
  112. else
  113. echo "Missing copyright info at the beginning of below files. Please run 'sh ci/lint/copyright-format.sh -f' to fix them:"
  114. printf '%s\n' "${ERROR_FILES[@]}"
  115. exit 1
  116. fi
  117. else
  118. echo 'Copyright check succeeded.'
  119. exit 0
  120. fi