背景
SwiftLintを利用していて、ドキュメントにあるとおり、 Build Phaseに以下のスクリプトを追加していました。
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
はじめは問題なかったのですが、Swiftのファイルが増えてきたことで、Lintに時間がかかるようになってきてしまいました。
$ swiftlint
では全ファイルを対象にしてしまうためです。
解決
基本的には変更分のファイルにのみLintを行いたいので、以下のスクリプトに変更しました。
swiftlint.sh
#!/bin/sh
if which swiftlint >/dev/null; then
swiftlint version
else
echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
exit
fi
parse_yaml() {
local prefix=$2
local s
local w
local fs
s='[[:space:]]*'
w='[a-zA-Z0-9_]*'
fs="$(echo @|tr @ '\034')"
sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
-e "s|^\($s\)\($w\)$s[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" "$1" |
awk -F"$fs" '{
indent = length($1)/2;
vname[indent] = $2;
for (i in vname) {if (i > indent) {delete vname[i]}}
if (length($3) > 0) {
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
printf("%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, $3);
}
}' | sed 's/_=/+=/g'
}
# Excluded pathes from .swiftlint.yml
EXCLUDEDS=`parse_yaml ./.swiftlint.yml | grep excluded | sed -e "s/^.*(\(".*"\)).*$/\1/" | tr -d "\""`
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
IFS=$'\n'
# Target the swift files that has been changed.
for FILE in `git diff-index --name-status $against -- | grep -E '^[AUM].*\.swift$'| cut -c3-`; do
# Skip if excluded
EXCLUDE_FLAG=0
for EXCLUDED in $EXCLUDEDS; do
if [[ $FILE =~ ^$EXCLUDED.* ]]; then
EXCLUDE_FLAG=1
break
fi
done
if [[ $EXCLUDE_FLAG == 0 ]]; then
# Lint
swiftlint lint --path "$FILE"
fi
done
(http://blog.manaten.net/entry/645 を参考にさせていただきました)
以上です。
お役に立てばと思います。m(_ _)m
追記
- 2016/03/04 pathにスペースが入っていた場合にビルドが通らなくなる不具合を修正しました。
- 2016/03/04 swiftlintでexcludedに含まれていた場合にビルドが通らなくなる不具合を修正しました。