#!/usr/bin/env bash . "$(dirname -- "$0")/_/husky.sh" # get the list of modified files files=$(git diff --cached --name-only) # check if api or web directory is modified api_modified=false web_modified=false for file in $files do if [[ $file == "api/"* && $file == *.py ]]; then # set api_modified flag to true api_modified=true elif [[ $file == "web/"* ]]; then # set web_modified flag to true web_modified=true fi done # run linters based on the modified modules if $api_modified; then echo "Running Ruff linter on api module" # python style checks rely on `ruff` in path if ! command -v ruff &> /dev/null; then echo "Installing linting tools (Ruff, dotenv-linter ...) ..." poetry install -C api --only lint fi # run Ruff linter auto-fixing ruff check --fix ./api # run Ruff linter checks ruff check --preview ./api || status=$? status=${status:-0} if [ $status -ne 0 ]; then echo "Ruff linter on api module error, exit code: $status" echo "Please run 'dev/reformat' to fix the fixable linting errors." exit 1 fi fi if $web_modified; then echo "Running ESLint on web module" cd ./web || exit 1 npx lint-staged echo "Running unit tests check" modified_files=$(git diff --cached --name-only -- utils | grep -v '\.spec\.ts$' || true) if [ -n "$modified_files" ]; then for file in $modified_files; do test_file="${file%.*}.spec.ts" echo "Checking for test file: $test_file" # check if the test file exists if [ -f "../$test_file" ]; then echo "Detected changes in $file, running corresponding unit tests..." npm run test "../$test_file" if [ $? -ne 0 ]; then echo "Unit tests failed. Please fix the errors before committing." exit 1 fi echo "Unit tests for $file passed." else echo "Warning: $file does not have a corresponding test file." fi done echo "All unit tests for modified web/utils files have passed." fi cd ../ fi