#!/bin/sh # Description: # Runs swiftlint with selected or default config file. # By default it runs only for modified files. # # Parameters: # $1 - path to swiftlint executable. # $2 - path to swiftlint config. # # Required environment variables: # SCRIPT_DIR - directory of current script. # SRCROOT - project directory. # # Optional environment variables: # SWIFTLINT_EXECUTABLE - path to swiftlint executable. # SWIFTLINT_CONFIG_PATH - path to swiftlint config. # PODS_ROOT - cocoapods installation directory (eg. ${SRCROOT}/Pods) if SWIFTLINT_EXECUTABLE or ${1} is missing # SCRIPT_INPUT_FILE_COUNT - number of files listed in "Input files" of build phase. # SCRIPT_INPUT_FILE_{N} - file path to directory that should be checked. # FORCE_LINT - don't exclude not modified files. # AUTOCORRECT - format and fix code before lint. # # Example of usage: # swiftlint.sh # FORCE_LINT=true; swiftlint.sh # swiftlint.sh Pods/Swiftlint/swiftlint build-scripts/xcode/.swiftlint.yml # readonly SOURCES_DIRS=`. ${SCRIPT_DIR}/common/read_input_file_names.sh "\n" ${SRCROOT}` if [ -z "${SWIFTLINT_EXECUTABLE}" ]; then if [ ! -z "${1}" ]; then readonly SWIFTLINT_EXECUTABLE=${1} else readonly SWIFTLINT_EXECUTABLE=${PODS_ROOT}/SwiftLint/swiftlint fi fi if [ -z "${SWIFTLINT_CONFIG_PATH}" ]; then if [ ! -z "${2}" ]; then readonly SWIFTLINT_CONFIG_PATH=${2} else readonly SWIFTLINT_CONFIG_PATH=${SCRIPT_DIR}/../.swiftlint.yml fi fi if [ ! -z "${FORCE_LINT}" ]; then # Если задана переменная FORCE_LINT, то проверяем все файлы проекта for SOURCE_DIR in ${SOURCES_DIRS}; do if [ ! -z "${AUTOCORRECT}" ]; then ${SWIFTLINT_EXECUTABLE} lint --config ${SWIFTLINT_CONFIG_PATH} --fix --format "${SRCROOT}/${SOURCE_DIR}" fi ${SWIFTLINT_EXECUTABLE} lint --config ${SWIFTLINT_CONFIG_PATH} "${SRCROOT}/${SOURCE_DIR}" done else # Xcode упадет, если будем использовать большое количество Script Input Files, # так как просто переполнится стек - https://unix.stackexchange.com/questions/357843/setting-a-long-environment-variable-breaks-a-lot-of-commands # Поэтому воспользуемся "скрытым" параметром Swiflint - https://github.com/realm/SwiftLint/pull/3313 # Создадим временный файл swiftlint_files с префиксом @ и в нем уже определим список файлов # необходимых для линтовки :) lint_files_path=`mktemp` # Проходимся по папкам, которые требуют линтовки for SOURCE_DIR in ${SOURCES_DIRS}; do LINE_PREFIX="${SRCROOT}/" pushd . cd ${SRCROOT} # in case of runing script outside project folder (SPM) # Отбираем файлы, которые были изменены или созданы source_unstaged_files=$(git diff --diff-filter=d --name-only --line-prefix=${LINE_PREFIX} ${SOURCE_DIR} | grep "\.swift$") source_staged_files=$(git diff --diff-filter=d --name-only --line-prefix=${LINE_PREFIX} --cached ${SOURCE_DIR} | grep "\.swift$") popd if [ ! -z "${source_unstaged_files}" ]; then echo "${source_unstaged_files}" >> ${lint_files_path} fi if [ ! -z "${source_staged_files}" ]; then echo "${source_staged_files}" >> ${lint_files_path} fi done swiftlint_files_path="@${lint_files_path}" if [ ! -z "${AUTOCORRECT}" ]; then ${SWIFTLINT_EXECUTABLE} lint --config ${SWIFTLINT_CONFIG_PATH} --fix --format --force-exclude --use-alternative-excluding ${swiftlint_files_path} fi ${SWIFTLINT_EXECUTABLE} lint --config ${SWIFTLINT_CONFIG_PATH} --force-exclude --use-alternative-excluding ${swiftlint_files_path} fi