概要
開発をしていると、個人的なデバッグのためにログ出力用のコードを埋め込むことがあります。
しかし、最終的な成果物としてそれらのコードは入れるべきではありません。
注意深く消し忘れを確認しているつもりでも、人間のチェックでは見落としが発生してしまいます。
そこで、プログラムを書いて自動的にチェックしてもらうことでミスを減らそう!というのが今回の記事の内容です。
やりたいこと
-
gc “コメント”
でデバッグ用コードチェック
とgit commit "コメント"
を実行する。 - 変更箇所の中にデバッグ用コードがあった場合、そのファイルパスを出力する。
- 変更箇所の中にデバッグ用コードがあった場合、コミットを実行するかどうかユーザー入力を待ち受ける。(y or n)
失敗した実装例
この方法では、3のユーザー入力の待受が実現できませんでした。待受が必要ない場合は、この実装方法で問題ありません。
VScodeの場合、.gitディレクトリは非表示になっているので設定を変更して表示させます。
https://techblog.hubbit.io/2020/10/05/visual-studio-code-show-git-folder/
/project-root/.git/hooks/pre-commitに実装(プログラムは後述のものと同様のため割愛します)
実行権限を付与
$ chmod +x .git/hooks/pre-push
うまく実行されない場合は、Gitが古いままのフックスクリプトをキャッシュしている可能性があるので以下のようにキャッシュクリアします。
$ git config --unset core.hooksPath
ただし、これらの方法ではユーザー入力の待受ができないため、他のアプローチを試してみました。
最終的な実現方法
1. ~/script/git-commitファイルを作成する(ファイル名やディレクトリはなんでも可)
#!/bin/sh
comment="$1"
project_root=$(git rev-parse --show-toplevel)
cd $project_root
files_with_log_info=$(git diff --cached --name-only | xargs grep -lE "(log\.Info\(|console\.log\(|litter\.Dump\()" -- $project_root)
if [ -n "$files_with_log_info" ]; then
echo "Found log.Info() or console.log() or litter.Dump() in the following files:"
echo "$files_with_log_info"
read -p "Do you want to continue? (y/n): " response
case $response in
[yY])
git commit -m $comment
exit 0
;;
*)
echo "Commit aborted."
exit 1
;;
esac
fi
echo "Not found log.Info() or console.log(), exec git commit!:"
git commit -m $comment
exit 0
2. 実行権限を付与
$ chmod +x ~/script/git-commit
3. エイリアスを定義
.zshrcに以下を追加(環境によって.bash_profileの場合などもあります)
alias gc='~/script/git-commit'
4. 実行!
デバッグ用コードのチェックができていますね。
今回はyを入力したので、そのままコミットしています。
$ gc "test"
grep: /path/to/project: Is a directory
Found log.Info() or console.log() or litter.Dump() in the following files:
project/src/components/organisms/HogeHoge.vue
project/src/usecase/FugaFuge.go
Do you want to continue? (y/n): y
[pre-push-test 5ab3a0edd] test
2 files changed, 6 insertions(+), 5 deletions(-)
まとめ
今回は、git commit時にデバッグ用コードの消し忘れをチェックする方法についてまとめました。
ユーザー入力(y or n)の待受が必要ない場合は、git hooksを使うこともできます。
毎度のチェックはプログラムに任せて見落としを防ぎましょう!