LoginSignup
24
24

More than 5 years have passed since last update.

変更ファイルにだけSwiftLintを適用する

Last updated at Posted at 2016-03-02

背景

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に含まれていた場合にビルドが通らなくなる不具合を修正しました。
24
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
24