あるプロジェクトで多言語化対応する必要があったのですが、日本語がベタ書きされている箇所もちらほらありつつ「これからコーディングする際はマルチバイトを含んでいたらcommit時に弾こう!」となりました。
そのときに行った処理を記載します。
使用するライブラリ
- husky
この記事で説明しないこと
- huskyがなんなのか
- huskyのinstallから設定方法
参考にした記事
Git でコミット前に禁止ワードが入っていないかチェックする
実際のコード
#!/bin/sh
rootPath=$(git rev-parse --show-toplevel)
diffArray=()
show_message () {
cat <<EOL
[WORD CHECK ERROR]
Cannot commit multibyte characters
[RESULT]
$1
[HINT]
If you want to force commit, please append prefix 'NO_WORD_CHECK=1' to command.
EOL
}
for file in $(git diff --cached --name-only)
do
extention=${file##*.}
if [ $extention = 'ts' ] || [ $extention = 'js' ] || [ $extention = 'vue' ]; then
result=$(less "${rootPath}"/"${file}" | grep -A5 -B5 -i [0-9A-z、-◯ぁ-んァ-ヶ亜-腕弌-熙])
if [ $? -eq 0 ]; then
diffArray+=("\n$result\n\n")
fi
fi
done
if [ ${#diffArray[@]} -gt 0 ] && [ -z $NO_WORD_CHECK ]; then
joinedStr="$(IFS=; echo "${diffArray[*]}")"
show_message "$joinedStr"
exit 1
else
exit 0
fi
説明
git diff --cached --name-only
まずは、これでaddしたファイル名を取得しforでブン回します。
extention=${file##*.}
if [ $extention = 'ts' ] || [ $extention = 'js' ] || [ $extention = 'vue' ]; then
次に、ts js vueのファイルだけに絞り込みます。
result=$(less "${rootPath}"/"${file}" | grep -A5 -B5 -i [0-9A-z、-◯ぁ-んァ-ヶ亜-腕弌-熙])
lessでファイル開いて、マルチバイトや記号でgrepかけます。
if [ $? -eq 0 ]; then
$?には直前の結果が格納されています。
それをarrayに追加しまして。
if [ ${#diffArray[@]} -gt 0 ] && [ -z $NO_WORD_CHECK ]; then
joinedStr="$(IFS=; echo "${diffArray[*]}")"
show_message "$joinedStr"
exit 1
else
exit 0
fi
最後に表示させます。
このチェックを回避する場合は、commit時にNO_WORD_CHECK=1のパラメーターを指定するとそのままコミットできます。
NO_WORD_CHECK=1 git commit