おじゃまぷよ系エンジニアメモ

主にスマホネイティブ関連Tips。たまにWebも書きたい。お腹はぷよぷよ

ktlintをpre-commitに引っ掛けてコードフォーマットする

元々php書いてて、php-cs-fixerをpre-commitでフックして整形してたなぁ…と思って最近Androidをkotlinでソース書いてるときに、同じようなやつkotlin版ないのかなぁと調べたらちゃんとありましたね。

github.com

ということでphp-cs-fixerのパターンと同様にktlintでフォーマットかけます pre-commitのscriptはこちらを参考にしました

blog.manaten.net

結果以下のようなpre-commitにしました

#!/bin/sh

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Redirect output to stderr.
exec 1>&2


IS_ERROR=0
# コミットされるファイルのうち、.ktで終わるもの
for FILE in `git diff-index --name-status $against -- | grep -E '^[AUM].*\.kt$'| cut -c3-`; do
    MESSAGES=(`/usr/local/bin/ktlint -F $FILE `)
    if [ "${#MESSAGES[@]}" -gt 0 ]
    then
       IS_ERROR=1
       echo ${MESSAGES[@]}
    fi
done
exit $IS_ERROR

普通に「ktlint」でlint違反があるものに関してはexitProcess(1)で終わるのですが、「ktlint -F」でフォーマットかけるとexitProcess(0)で終了しちゃうのでシンプルに

if /usr/local/bin/ktlint -F $FILE; then
     git add $FILE
else
     IS_ERROR=1
fi

こんな感じで書けなかったので、ktlint -Fが何かlint違反の文字列を出力していたらコミットしないというような感じに変えました。