行儀がよくないエディタがあるのを知った。
中身があるのに、最後の行が改行で終わってくれない。
調べると、POSIXのファイル仕様に違反するらしいがよくわからん。
動きはするが、とても気持ちが悪い。
そこで、レポジトリにこのようなファイルがあると、Github Actionsで怒られるようにした。
bashスクリプト
以下のbashスクリプトをレポジトリに入れておく。
動作としては、find
で対象ファイル一覧を作って、参考文献のカッコいい方法で各ファイルの末尾をチェックしていく。
違反ファイルがあると、ファイル一覧を出力してエラー終了する。
ファイル数は大したことない前提で見やすい書き方にしている。対象ファイルが多い場合は、エラーファイルを溜めないようにループするように書き換える必要があると思う。
コード
./scripts/check_endoffile_with_newline.sh
#!/bin/bash
# 対象ファイルのリスト
# 一部パスを除外している
# 対象は拡張子で指定している
files=$(find . \
-not -path "./node_modules/*" -not -path "./public/*" \
-not -path "./vendor/*" \
-type f -regex '.*\.\(rb\|erb\|css\|scss\|js\|yml\)')
error_files=""
for file in ${files}; do
# 改行で終わってないファイルを探し記録する
# 参考: https://qiita.com/BlackCat_617/items/c0d7f7378bc55b3e07d0
if [ `tail --lines=1 ${file} | wc --lines` == 0 ]; then
error_files="${error_files} ${file}"
fi
done
if [ "${error_files}" == "" ]; then
echo "Good."
exit 0
else
echo "[ERROR] There are some files without newline in end of file."
for file in ${error_files}; do
echo " ${file}"
done
exit 1
fi
追記:gitのls-filesを使えばGit管理下のファイルを対象にできる
files=$(git ls-files | \
grep --invert-match '\.keep$' | \
grep --invert-match '\.png$' | \
grep --invert-match '\.ico$' | \
grep --invert-match '\.yml\.enc$')
実行例
$ ./scripts/check_endoffile_with_newline.sh
[ERROR] There are some files without newline in end of file.
./config/locales/models/ja.yml
./app/views/users/new.html.erb
./app/views/users/show.html.erb
./app/views/layouts/_footer.html.erb
./app/views/layouts/_header.html.erb
./app/views/shared/_error_messages.html.erb
./app/assets/stylesheets/header.scss
./app/assets/stylesheets/footer.scss
Github Actionsの設定
以下のように、好きな名前をつけてスクリプトを実行する。
コード
# ~省略~
- name: End of File with Newline
run: ./scripts/check_endoffile_with_newline.sh
# ~省略~
実行例
所感
- 「人がコードの指摘をする」のは指摘するほうもされる方も消耗していく
- 機会的な指摘だと、指摘された方は消耗しづらい
- コードレビューはできる限り自動化していこう