Сохранять зафиксированные файлы через неудачный хук предварительной фиксации - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть ловушка предварительной фиксации, которая запускает некоторые линтинги так:

./gradlew app:ktlint --daemon

status=$?

if [ "$status" = 0 ]
then
    echo "${green}Linting found no problems.${reset}"
    exit 0
else
    echo 1>&2 "${red}Linting found issues.${reset}"
    echo "${yellow}Attempting to fix automatically...${reset}"
    ./gradlew app:ktlintFormat --daemon
    if [ $? = 0 ]
    then
        echo "${green}Fixed all issues automatically. Committing automagically...! :)${reset}"
        git add .
        git commit -m "Automatic commit of linted files" --no-verify
        exit 0
    else
        echo "${red}Could not fix all issues automatically, please review. :( ${reset}"
        exit 1
    fi  
fi

Проблема здесь в том, что если задача ktlint завершается неудачно, но автоматический формат решает все проблемы, я не могу повторно добавить только те файлы, которые были включены в первоначальный коммит.

Возможно, это лучше всего объяснить на примере:

  • У меня есть 3 файла, A, B, C
  • Я совершаю A & B, , но не C
  • ktlint сбой фиксации из-за форматирования
  • ktlintFormat удается решить проблемы
  • Текущее поведение: отформатированные файлы A & B, а также C добавляются и фиксируются автоматически
  • Требуемое поведение: Только Отформатированные файлы A & B добавляются и фиксируются автоматически

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Решением было заранее отследить, какие файлы были зафиксированы, а затем добавить их вручную после автоматического форматирования ворса.

echo "${yellow}Running linting...${reset}"

#store the result of the commit in a variable and split into array items with newline
committedFiles=$(git diff --name-only --cached)
files=$(echo $committedFiles | tr ";" "\\n")

[...]

#after ktlintFormat runs and succeeds
echo "${green}Fixed all issues automatically. Committing..! :)${reset}"

#replay items in the commits array and add only those files
for file in $files
do
    git add $file
done
git commit -m "Automatic commit of linted files" --no-verify
exit 0

[...]
0 голосов
/ 15 ноября 2018

Предварительная фиксация запускается на кодовой базе непосредственно перед выполнением фиксации.Я бы предложил удалить строки git add/commit после того, как автоматические исправления пройдут, поэтому сценарий завершается с нулевым (успешным) состоянием.

Вы теряете возможность добавлять сообщения, но предварительная фиксация будетдействуйте точно так, как следует.

Для сравнения с вашим примером:

  • 3 файла, A, B, C
  • Фиксация A & B, но не C
  • ktlint не может выполнить фиксацию из-за форматирования
  • ktlintFormat удается исправить проблемы
  • Коммит продолжается, с A & B.

✌️

...