Крючки Git Pre-push не отменяют толчок в случае более чем одной проверки - PullRequest
0 голосов
/ 23 мая 2018

в git hooks - я хотел проверить на наличие ошибок jshint и целостности пряжи, прежде чем нажимать, поэтому я добавил ниже в pre-push.так что это что-то вроде этого -

    # Pre-push hooks
    # Lint stuff before committing
    grunt jshint eslint tslint
    # Verifies that versions and hashed value of the package contents 
      in the project’s package.json matches that of yarn’s lock file.
    yarn check --integrity
  • Здесь, если jshint выдает ошибку, но если проверка целостности пряжи проходит, все равно он позволяет нажать.Он прервет работу, если не получится пряжа.
  • Если я переверну порядок, тогда, если проверка пряжи не пройдена и если jshint пройден, то также он выталкивает.Он прервет работу, если jshint завершится неудачей.

Таким образом, он не может выполнить push-уведомление только в случае неудачной последней проверки, в то время как в других случаях он сообщает об ошибке, но все равно ее выдвигает

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Самореклама здесь: Если вы хотите быть очень модным, вы можете использовать вспомогательные функции, которые я написал некоторое время назад (для ловушки фиксации).

Вы запускаете это так:

set -e

run_check 'flake8' . flake8
run_check 'ESLint' . ./node_modules/eslint/bin/eslint.js frontend/js
exit_test

И получите вывод, подобный следующему:

flake8 OK
ESLint OK

Или, если вам повезет меньше:

./frontend/tests.py:8:83: E999 SyntaxError: invalid syntax
flake8 FAILED

/home/frax/Programowanie/organizer/organizer2/frontend/js/utils.js
  11:18  error  Parsing error: Unexpected token ;

✖ 1 problem (1 error, 0 warnings)

ESLint FAILED
Some check(s) failed.

Код выхода exit_test - это код выхода последнего сбойногопроверять.При использовании set -e он становится кодом завершения всего сценария.

Код:

# Use run_check to run groups of independent tests, that should all be run even
# if some of them fail (but you still want to know about failure).

# testing_exit_code variable stores last non-zero exit code of the check, or 0,
# if no check failed so far.

# Important note: using trap prevents set -e from intercepting check failures,
# so it's safe (and recommended) to use -e in testing script.

# Example:

#
#    run_check 'Foo check' . echo Foo
#    run_check 'Bar check' . echo Bar
#    exit_test  # fail if any test failed
#

testing_exit_code=0

function run_check () {
    # Usage: run_check <check name> <working directory> <command> [args...]
    local cmd="$1"
    trap 'testing_exit_code=$?; echo "$cmd FAILED"; return 0' ERR
    local cmd_wd="$2"
    shift 2
    ( cd "$cmd_wd" && "$@" )  # run the command
    echo "$cmd OK"
}

function exit_test () {
    if (( testing_exit_code != 0 )); then
        echo "Some check(s) failed."
    fi
    exit $testing_exit_code
}

Вывод выглядит лучше, если вы добавите немного раскраски.На самом деле они есть в моем оригинальном сценарии, но для краткости и мобильности опущены.Я могу поделиться версией с цветами отдельно, если вам интересно.

0 голосов
/ 23 мая 2018

Это действительно вопрос о написании скриптов.

В скриптах sh / bash ряд команд просто запускает серию команд:

cmd1
cmd2
cmd3

Не имеет значения, если таковые имеютсяодна команда «терпит неудачу» (возвращает ненулевой статус выхода);скрипт продолжит выполнение следующего.

Конечным статусом завершения скрипта является статус завершения последней команды, которая выполнила , если только вы не указали конкретный статус:

exit 0

(ноль означает успех).

Если вы хотите выйти сразу при сбое любой команды, вы можете установить опцию -e:

set -e
cmd1
cmd2
cmd3

Это довольногрубая и не всегда правильная вещь.Обратите внимание, что если cmd2 завершается с ошибкой (выходит из нуля), cmd3 даже не запускается, но оболочка завершает работу с ошибочным состоянием выхода cmd2.

Для особой фантазии вы можете save статус выхода каждой команды:

cmd1; cmd1_status=$?
cmd2; cmd2_status=$?
cmd3; cmd3_status=$?

Переменная $? расширяется до статуса выхода команды, которая только что была выполнена.

Конечно, теперь у вас естьчтобы выяснить, что делать с тремя состояниями, так как вы можете выйти только с одним из них, но теперь вы можете выйти с любым из них первым, если таковой имеется:

test $cmd1_status != 0 && exit $cmd1_status
test $cmd2_status != 0 && exit $cmd2_status
exit $cmd3_status

Теперь ваш скрипт безоговорочно выполняет все три команды, но возвращает состояние первой ненулевой ошибки.Если cmd1 и cmd2 оба вернули нулевое состояние, сценарий завершает работу с любым статусом из cmd3.

...