✏️

pre-commit でスペルチェック

やりたいこと

コミットする際に、スペルミスがないかどうかをチェックしたい。 そして、スペルミスがあったらコミットできないようにしたい。

なぜするのか

  • バグの原因になる (関数名や変数名が一致しないとバグを引き起こす)
  • コードを読むときに負担になる

どう実現するのか

変更したファイルを入力すると、スペルミスがあるかどうかをチェックしてくれるコマンドラインツール・misspell を使う。 pre-commit のなかで、差分のあるファイルだけを misspell に入力すればいい。

手順

1. misspell のインストール

今回は、misspell を go でインストールする。

$ go get -u github.com/client9/misspell/cmd/misspell
$ misspell --help

ちゃんとスペルミスを指摘してくれることを確認する。

$ touch test.txt
$ echo langauge > test.txt
$ misspell test.txt
test.txt:1:0: "langauge" is a misspelling of "language"

2. pre-commit の準備

git hooks はプロジェクトごとにしか設定できないので、グローバルに設定するには少し工夫が必要だけど、ここではそれに触れない。

$ cd path/to/project
$ cd .git/hooks
$ cp pre-commit.sample pre-commit

pre-commit の内容は次のようにする。

# ! /bin/bash
git diff --staged --name-only | xargs misspell -locale US -error
exit $?

git diff --staged --name-only でステージにあるファイル名を取得して、1 つずつ misspell に引数として渡している。

ここまでできたら、コミットする際にチェックされるかどうかをチェックする。

$ cd path/to/project
$ touch test.txt
$ echo langauge > test.txt
$ git status -s
A  test.txt
$ git commit
test.txt:1:0: "langauge" is a misspelling of "language"

気になるところ

プロジェクトごとに設定する必要がある

template などを使って工夫すればできなくはない。

キャメルに対応していない

次の間違いは指摘してくれた。

  • langauge;
  • langauge.
  • langauge()
  • is_langauge
  • $langauge
  • langauge "

しかし、次の間違いは指摘してくれなかった

  • 'langauge'
  • "langauge"
  • isLangauge()

文字列を指摘してくれないのは別にいいのだけど、キャメルを指摘してくれないのは困る。

US と UK

misspell では US か UK のどちらかを選ばないといけないので、コード内に US と UK が混在していたら、どちらかがスペルミスとして検出されることになる。 プロジェクト内で統一する必要がありそう。

GUI ツールだとなぜコミットできないのかわかりにくい

SourceTree や GitHub Desktop でコミットした場合、スペルミスのある単語や行数は表示されず、ただ xargs: misspell: No such file or directory とだけ表示されてコミットが失敗する。 これだとどこを直せばいいかわからないので、結局 CUI を使うことになる。