JenkinsFile
にBOMが付いててこけることがあって、それの対処に使った内容。
TL;DR
- pre-commit フックで対象ファイルのチェック。
- コミット対象のファイルを編集して再度 add する。
hookスクリプト
nkf
とか file
とか awk
とかもっと使い勝手いいコマンドで簡単にする方法はあるけど、
WindowsでSourceTree使っていて MinGWにいろいろ入れるの面倒だったので ピュアな環境で使えるようにしたかったので。
pre-commit
# !/bin/bash
gitroot=$(git rev-parse --show-toplevel) # 1
pattern='jenkinsfile|\.gvy$' # 2
git diff --cached --name-only | egrep -i $pattern | while read file ; do # 3
target="$gitroot/$file"
if [ ! -f $target ] ; then : # 4
elif head -1 $target | grep $'\xef\xbb\xbf' > /dev/null ; then # 5
tmp=$target.tmp # 6
cp -p $target $tmp
cat $tmp | perl -ple 's/^\xef\xbb\xbf// if (! $count++)' > $target # 7
git add $target # 8
rm $tmp -f
fi
done
内容の説明
-
git diff
はリポジトリのルートからの相対パスが返るので、後でフルパス作れるように。 - 処理対象とするファイル名のパターン。今回はJenkinsFileと共有処理書いてるGroovyスクリプトだったのでこの内容で。
- コミット対象のファイル = インデックスされているファイル一覧を取得してファイル名フィルタを適用。
- ファイルチェック、既存ファイルを削除する変更の場合はこれがないと怒られるので注意。
- TF-8のBOMで始まるかチェック。
file
とかnkf
の2.1.3以降使えるならそれで代用できるはず。 - いじってそのまま更新かけるので一旦一時ファイル。
awk -i
使えれば(ry - 先頭行だけUTF-8を置換、他はそのままファイルに書き出す。
- ファイルの内容をインデックスし直す。
- ファイルの一部をインデックスしている場合も全部コミット対象になるので注意
感想
C#とかやってるとBOM付きも使うから、混在すると面倒だよね _(:3」∠)_
エンジニア全員がソースからのmakeとか抵抗なければ、nkfとかfileとかawkとか使ったほうが絶対きれいになるよねこれ _(:3」∠)_