LoginSignup
0
0

More than 1 year has passed since last update.

pre-commitするときにマルチバイトを含んでいたらrijectする。

Posted at

あるプロジェクトで多言語化対応する必要があったのですが、日本語がベタ書きされている箇所もちらほらありつつ「これからコーディングする際はマルチバイトを含んでいたら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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0