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

参考文献

swift-formatとは

【GitHooks】GitHooksの設定内容をチームで共有する。

Swift

前の記事

DataDogでログを出す🐶