swift-formatをpre-commitで動かしてフォーマットする
はじめに
今までフォーマットはSwiftFormatの方をpyhtonのpre-commitの方で入れてたんですが、新規プロジェクトでApple純正のswift-formatをgitのpre-commitで入れる必要があったので忘れないようにまとめようと思います。
名前が似ていてすごくややこしい😅
試してみる
swift-formatで全体にフォーマットを入れたい場合は swift-format -r . -i
を実行すればフォーマット走ります。
コミット直前に処理を入れたい場合は.git/hooks/
の下にpre-commitというファイルを作成する必要があります。
既存で⭕️⭕️.sampleというファイルが存在しますが.sampleの部分を消すとgitの操作の時にファイルを読み込んで中の処理が動くようになります。
pre-commitファイルの中身
#!/bin/sh
# ステージングされているファイル一覧を取得
staged_files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.swift$')
# ファイルがない場合は終了
if [ -z "$staged_files" ] ; then
exit 0
fi
# フォーマットを実行
for file in $staged_files; do
$(xcrun --find swift-format) -i "$file"
done
# ステージングされているファイルにdiffが存在しないかどうかを確認し、diffがなければ終了
all_staged=true
for file in $staged_files; do
if git diff --name-only -- "$file" | grep -q "$file"; then
all_staged=false
break
fi
done
if [ "$all_staged" = true ]; then
exit 0
fi
# フォーマットされた差分をステージングに追加
for file in $staged_files; do
git add "$file"
done
# フォーマットで差分があった場合はコミットを失敗させ差分を表示
if ! git diff --cached --exit-code; then
echo "フォーマットの変更を検知しました、commitを中断します😺"
exit 1
fi
exit 0
チームで使う
.git/hooks/
は個人のリポジトリに依存するのでチームで使うには ..githooks/pre-commit
に置く必要があります。(.git/hocks/pre-commitをそのまま移動すればOK)
実行権限を付与
chmod a+x .githooks/*
参照先の変更
デフォルトだと.git/hooksを向いているので.githooksを見るようにします
git config --local core.hooksPath .githooks