check_header.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/bin/bash
  2. function usage {
  3. echo "$(basename $0) <file>"
  4. echo ""
  5. echo "Arguments:"
  6. echo " -h|--help Show this usage text."
  7. echo " -v|--verbose Print verbose output."
  8. echo " -d|--debug Print debug output."
  9. echo " -b|--base <sha> Git commit SHA of merge base."
  10. echo " <file> The file to check the header."
  11. echo ""
  12. }
  13. function echo-verbose {
  14. if [[ $VERBOSE != 0 ]]; then
  15. echo $1
  16. fi
  17. }
  18. function echo-debug {
  19. if [[ $DEBUG != 0 ]]; then
  20. echo $1
  21. fi
  22. }
  23. set -o pipefail
  24. VERBOSE=0
  25. DEBUG=0
  26. BASE_REV=""
  27. POSITIONAL=()
  28. while [[ $# -gt 0 ]]
  29. do
  30. key="$1"
  31. case $key in
  32. '-h'|'--help')
  33. usage
  34. exit 1
  35. ;;
  36. '-v'|'--verbose')
  37. VERBOSE=1
  38. ;;
  39. '-d'|'--debug')
  40. DEBUG=1
  41. ;;
  42. '-b'|'--base')
  43. shift
  44. if git rev-parse $1 2>/dev/null >/dev/null; then
  45. BASE_REV=$(git rev-parse $1)
  46. else
  47. echo "Unknown revision: $1" >&2
  48. fi
  49. ;;
  50. *) # unknown option
  51. POSITIONAL+=("$1") # save it in an array for later
  52. ;;
  53. esac
  54. shift # past argument
  55. done
  56. set -- "${POSITIONAL[@]}" # restore positional parameters
  57. if [[ -z "$1" ]] || [[ ! -f $1 ]]; then
  58. echo -e "No file given!\n"
  59. usage
  60. exit 1
  61. fi
  62. FILE=$1
  63. RESULT=0
  64. echo "Checking $1"
  65. echo-debug "grep -E '@date\s+([0-9]{2}\. \w+ [0-9]{4})' ${FILE} | sed -E 's/^.*@date\s+([0-9]{2}\. \w+ [0-9]{4}).*/\1/'"
  66. FILE_DATE=$(grep -E '@date\s+([0-9]{2}\. \w+ [0-9]{4})' ${FILE} | sed -E 's/^.*@date\s+([0-9]{2}\. \w+ [0-9]{4}).*/\1/')
  67. echo-verbose "File date: $FILE_DATE"
  68. if [[ ! -z $FILE_DATE ]]; then
  69. echo-debug "git log -1 --pretty="format:%ad" --date="format:%d. %B %Y" ${FILE}"
  70. HEAD_DATE=$(git log -1 --pretty="format:%ad" --date="format:%d. %B %Y" ${FILE})
  71. echo-verbose "Head date: $HEAD_DATE"
  72. if [[ $HEAD_DATE != $FILE_DATE ]]; then
  73. echo-debug "grep -En "@date.*${FILE_DATE}" ${FILE} | cut -f1 -d:"
  74. FILE_DATE_LINE=$(grep -En "@date.*${FILE_DATE}" ${FILE} | cut -f1 -d:)
  75. echo "${FILE}:${FILE_DATE_LINE}:Please update file date to '$HEAD_DATE'." >&2
  76. RESULT=1
  77. fi
  78. fi
  79. echo-debug "grep -E '@version\s+V?([0-9]+\.[0-9]+(\.[0-9]+)?)' ${FILE} | sed -E 's/^.*@version\s+V?([0-9]+\.[0-9]+(\.[0-9]+)?).*/\1/'"
  80. FILE_VERSION=$(grep -E '@version\s+V?([0-9]+\.[0-9]+(\.[0-9]+)?)' ${FILE} | sed -E 's/^.*@version\s+V?([0-9]+\.[0-9]+(\.[0-9]+)?).*/\1/')
  81. echo-verbose "File version: $FILE_VERSION"
  82. if [[ ! -z $FILE_VERSION ]]; then
  83. echo-debug "grep -En \"@version.*${FILE_VERSION}\" ${FILE} | cut -f1 -d:"
  84. FILE_VERSION_LINE=$(grep -En "@version.*${FILE_VERSION}" ${FILE} | cut -f1 -d:)
  85. echo-verbose "File version line: $FILE_VERSION_LINE"
  86. echo-debug "git log -1 --pretty=\"format:%H\" -- ${FILE}"
  87. HEAD_REV=$(git log -1 --pretty="format:%H" -- ${FILE})
  88. echo-verbose "Head revision : $HEAD_REV"
  89. if [[ -z "$BASE_REV" ]] || [[ $HEAD_REV =~ ^$BASE_REV ]]; then
  90. echo-debug "git log -1 --pretty=\"format:%P\" -- ${FILE}"
  91. BASE_REV=$(git log -1 --pretty="format:%P" -- ${FILE})
  92. fi
  93. echo-verbose "Base revision : $BASE_REV"
  94. echo-debug "git blame ${BASE_REV}..${HEAD_REV} -l -L ${FILE_VERSION_LINE},${FILE_VERSION_LINE} ${FILE}"
  95. BLAME=$(git blame ${BASE_REV}..${HEAD_REV} -l -L ${FILE_VERSION_LINE},${FILE_VERSION_LINE} ${FILE})
  96. echo-debug "git rev-parse $(sed -E 's/^[\^]?([[:alnum:]]+).*/\1/' <<<$BLAME)"
  97. BLAME_REV=$(git rev-parse $(sed -E 's/^[\^]?([[:alnum:]]+).*/\1/' <<<$BLAME))
  98. echo-verbose "Blame revision: $BLAME_REV"
  99. if [[ $BASE_REV == $BLAME_REV ]]; then
  100. echo "${FILE}:${FILE_VERSION_LINE}:Please increment file version." >&2
  101. RESULT=1
  102. fi
  103. fi
  104. exit $RESULT