lint.sh 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/env bash
  2. set -e
  3. RED='\033[0;31m'
  4. GREEN='\033[0;32m'
  5. UNDERLINE='\033[4m'
  6. BOLD='\033[1m'
  7. NC='\033[0m'
  8. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
  9. ROOT="$DIR/../../"
  10. cd $ROOT
  11. FAILED=0
  12. IGNORED_FILES="uv\.lock|docs\/CARS.md"
  13. IGNORED_DIRS="^third_party.*|^msgq.*|^msgq_repo.*|^opendbc.*|^opendbc_repo.*|^cereal.*|^panda.*|^rednose.*|^rednose_repo.*|^tinygrad.*|^tinygrad_repo.*|^teleoprtc.*|^teleoprtc_repo.*"
  14. function run() {
  15. shopt -s extglob
  16. case $1 in
  17. $SKIP | $RUN ) return 0 ;;
  18. esac
  19. echo -en "$1"
  20. for ((i=0; i<$((50 - ${#1})); i++)); do
  21. echo -n "."
  22. done
  23. shift 1;
  24. CMD="$@"
  25. set +e
  26. log="$((eval "$CMD" ) 2>&1)"
  27. if [[ $? -eq 0 ]]; then
  28. echo -e "[${GREEN}✔${NC}]"
  29. else
  30. echo -e "[${RED}✗${NC}]"
  31. echo "$log"
  32. FAILED=1
  33. fi
  34. set -e
  35. }
  36. function run_tests() {
  37. ALL_FILES=$1
  38. PYTHON_FILES=$2
  39. run "ruff" ruff check $ROOT --quiet
  40. run "check_added_large_files" python3 -m pre_commit_hooks.check_added_large_files --enforce-all $ALL_FILES --maxkb=120
  41. run "check_shebang_scripts_are_executable" python3 -m pre_commit_hooks.check_shebang_scripts_are_executable $ALL_FILES
  42. run "check_shebang_format" $DIR/check_shebang_format.sh $ALL_FILES
  43. if [[ -z "$FAST" ]]; then
  44. run "mypy" mypy $PYTHON_FILES
  45. run "codespell" codespell $ALL_FILES
  46. fi
  47. return $FAILED
  48. }
  49. function help() {
  50. echo "A fast linter"
  51. echo ""
  52. echo -e "${BOLD}${UNDERLINE}Usage:${NC} op lint [TESTS] [OPTIONS]"
  53. echo ""
  54. echo -e "${BOLD}${UNDERLINE}Tests:${NC}"
  55. echo -e " ${BOLD}ruff${NC}"
  56. echo -e " ${BOLD}mypy${NC}"
  57. echo -e " ${BOLD}codespell${NC}"
  58. echo -e " ${BOLD}check_added_large_files${NC}"
  59. echo -e " ${BOLD}check_shebang_scripts_are_executable${NC}"
  60. echo ""
  61. echo -e "${BOLD}${UNDERLINE}Options:${NC}"
  62. echo -e " ${BOLD}-f, --fast${NC}"
  63. echo " Skip slow tests"
  64. echo -e " ${BOLD}-s, --skip${NC}"
  65. echo " Specify tests to skip separated by spaces"
  66. echo ""
  67. echo -e "${BOLD}${UNDERLINE}Examples:${NC}"
  68. echo " op lint mypy ruff"
  69. echo " Only run the mypy and ruff tests"
  70. echo ""
  71. echo " op lint --skip mypy ruff"
  72. echo " Skip the mypy and ruff tests"
  73. echo ""
  74. echo " op lint"
  75. echo " Run all the tests"
  76. }
  77. SKIP=""
  78. RUN=""
  79. while [[ $# -gt 0 ]]; do
  80. case $1 in
  81. -f | --fast ) shift 1; FAST="1" ;;
  82. -s | --skip ) shift 1; SKIP=" " ;;
  83. -h | --help | -help | --h ) help; exit 0 ;;
  84. * ) if [[ -n $SKIP ]]; then SKIP+="$1 "; else RUN+="$1 "; fi; shift 1 ;;
  85. esac
  86. done
  87. RUN=$([ -z "$RUN" ] && echo "" || echo "!($(echo $RUN | sed 's/ /|/g'))")
  88. SKIP="@($(echo $SKIP | sed 's/ /|/g'))"
  89. GIT_FILES="$(git ls-files | sed -E "s/$IGNORED_FILES|$IGNORED_DIRS//g")"
  90. ALL_FILES=""
  91. for f in $GIT_FILES; do
  92. if [[ -f $f ]]; then
  93. ALL_FILES+="$f"$'\n'
  94. fi
  95. done
  96. PYTHON_FILES=$(echo "$ALL_FILES" | grep --color=never '.py$' || true)
  97. run_tests "$ALL_FILES" "$PYTHON_FILES"