99 lines
4.0 KiB
Bash
Executable File
99 lines
4.0 KiB
Bash
Executable File
#!/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}
|
||
elif [ ! -z "${PODS_ROOT}" ];
|
||
readonly SWIFTLINT_EXECUTABLE=${PODS_ROOT}/SwiftLint/swiftlint
|
||
else
|
||
readonly SWIFTLINT_EXECUTABLE=${SRCROOT}/Pods/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
|