1つのリポジトリで複数のサービスやパッケージを作っているときに、ディレクトリごとの環境でリントとかしたいですよね
探したら
https://blog.physalis.net/2021/git-hooks-dispatch
とかあったんですけど、余計な依存無しに、 git や シェルスクリプトだけで完結したかったので、雑に作りました
#!/bin/sh
files_changed=$(git diff --cached --name-only)
dirs_changed=()
for file in ${files_changed[@]}; do
_dir=$(echo $file | sed 's/\/.*//')
dirs_changed+=($_dir)
done
dirs_unique=($(echo "${dirs_changed[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
if [ ${#dirs_unique[@]} -eq 0 ]; then
echo "No directories to lint"
exit 0
fi
base=$(pwd)
echo ${dirs_unique[@]}
for _dir in ${dirs_unique[@]}; do
echo "cd $_dir, and run linting"
cd $base/$_dir
pwd
poetry run black . --check
poetry run isort . --check-only
poetry run flake8 .
done
ただし、リポジトリ直下のディレクトリのみに対応しています
もちろん sed
をいじればどうとでもなりますが