From b843196f3c9d9eda4ec8eeba29bf5cc859f55f18 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 19 May 2023 16:41:19 +0300 Subject: [PATCH 1/2] Disable autocorrection by default, make script more independent of environment --- .../common/read_input_file_names.sh | 15 ++++----- xcode/build_phases/swiftlint.sh | 33 +++++++++++++------ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/xcode/build_phases/common/read_input_file_names.sh b/xcode/build_phases/common/read_input_file_names.sh index 8d3f543..7de9439 100644 --- a/xcode/build_phases/common/read_input_file_names.sh +++ b/xcode/build_phases/common/read_input_file_names.sh @@ -62,16 +62,13 @@ if has_input_files && \ SHELL_VARIABLE="\${${SCRIPT_INPUT_FILE_VARIABLE_NAME}}" RESOLVED_FILE_NAME=`envsubst <<< ${SHELL_VARIABLE}` INPUT_FILE_NAMES=${INPUT_FILE_NAMES}${FILE_NAMES_SEPARATOR}${RESOLVED_FILE_NAME} + + if [ ! -z ${INPUT_FILE_NAMES} ]; then + INPUT_FILE_NAMES=${INPUT_FILE_NAMES}${FILE_NAMES_SEPARATOR} + fi + + INPUT_FILE_NAMES=${INPUT_FILE_NAMES}${RESOLVED_FILE_NAME} done - - FILE_NAMES_SEPARATOR_LENGTH=`awk '{ print length; }' <<< "${FILE_NAMES_SEPARATOR}"` - - if [ ${FILE_NAMES_SEPARATOR_LENGTH} -gt 0 ] && \ - [ ! -z "${INPUT_FILE_NAMES}" ]; then - - # remove separator prefix - INPUT_FILE_NAMES=`cut -c${FILE_NAMES_SEPARATOR_LENGTH}- <<< ${INPUT_FILE_NAMES}` - fi elif has_input_file_lists; then for i in `seq 0 $((${SCRIPT_INPUT_FILE_LIST_COUNT}-1))` do diff --git a/xcode/build_phases/swiftlint.sh b/xcode/build_phases/swiftlint.sh index 16abdc1..8f1e5cd 100755 --- a/xcode/build_phases/swiftlint.sh +++ b/xcode/build_phases/swiftlint.sh @@ -2,6 +2,7 @@ # Description: # Runs swiftlint with selected or default config file. +# By default it runs only for modified files. # # Parameters: # $1 - path to swiftlint executable. @@ -10,14 +11,15 @@ # Required environment variables: # SCRIPT_DIR - directory of current script. # SRCROOT - project directory. -# PODS_ROOT - cocoapods installation directory (eg. ${SRCROOT}/Pods). # # 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 - lint all project. +# FORCE_LINT - don't exclude not modified files. +# AUTOCORRECT - format and fix code before lint. # # Example of usage: # swiftlint.sh @@ -46,8 +48,11 @@ fi if [ ! -z "${FORCE_LINT}" ]; then # Если задана переменная FORCE_LINT, то проверяем все файлы проекта for SOURCE_DIR in ${SOURCES_DIRS}; do - ${SWIFTLINT_EXECUTABLE} lint --config ${SWIFTLINT_CONFIG_PATH} --fix --format ${SOURCE_DIR} - ${SWIFTLINT_EXECUTABLE} lint --config ${SWIFTLINT_CONFIG_PATH} ${SOURCE_DIR} + 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, @@ -56,19 +61,24 @@ else # Создадим временный файл swiftlint_files с префиксом @ и в нем уже определим список файлов # необходимых для линтовки :) - lint_files_path="${SRCROOT}/build_phases/swiftlint_files" + lint_files_path="`mktemp -d`/swiftlint_files" # Если файл существует, то просто его очистим, если нет - создадим > ${lint_files_path} # Проходимся по папкам, которые требуют линтовки for SOURCE_DIR in ${SOURCES_DIRS}; do - # Путь к папке репозитория - path_prefix="`git rev-parse --show-toplevel`/" + 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=${path_prefix} ${SOURCE_DIR} | grep "\.swift$") - source_staged_files=$(git diff --diff-filter=d --name-only --line-prefix=${path_prefix} --cached ${SOURCE_DIR} | grep "\.swift$") + 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} @@ -81,6 +91,9 @@ else swiftlint_files_path="@${lint_files_path}" - ${SWIFTLINT_EXECUTABLE} lint --config ${SWIFTLINT_CONFIG_PATH} --fix --format --force-exclude --use-alternative-excluding ${swiftlint_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 -- 2.40.1 From 7d3f2794bcdbf03c592f864950c1e6ff24e423b5 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Mon, 22 May 2023 11:59:45 +0300 Subject: [PATCH 2/2] simplify temp file creation --- xcode/build_phases/swiftlint.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/xcode/build_phases/swiftlint.sh b/xcode/build_phases/swiftlint.sh index 8f1e5cd..966dec9 100755 --- a/xcode/build_phases/swiftlint.sh +++ b/xcode/build_phases/swiftlint.sh @@ -61,10 +61,7 @@ else # Создадим временный файл swiftlint_files с префиксом @ и в нем уже определим список файлов # необходимых для линтовки :) - lint_files_path="`mktemp -d`/swiftlint_files" - - # Если файл существует, то просто его очистим, если нет - создадим - > ${lint_files_path} + lint_files_path=`mktemp` # Проходимся по папкам, которые требуют линтовки for SOURCE_DIR in ${SOURCES_DIRS}; do -- 2.40.1