код выхода из консольного приложения Windows недоступен в скрипте git hook

У меня есть следующий хук git pre-commit в Windows:

#!/bin/sh
./bin/Verification.exe
if [ $? -ne 0 ]
then 
    echo "Failed verfication: canceling commit"
    exit 1
fi
exit 0

Verification.exe — это консольное приложение .Net, которое я свел к этому для целей тестирования:

static int Main(string[] args)
{
    return -1;
}

Проблема в том, что скрипт bash, похоже, не делает код выхода из консольного приложения (т.е. -1) доступным в $? переменная. Исполняемый файл запускается, но в сценарии всегда выполняется условие if. Я попытался запустить Verification.exe из пакетного файла Windows с «echo %errorlevel%», и он, как и ожидалось, возвращает -1.

Как проверить код выхода внутри сценария предварительной фиксации?


person fredw    schedule 27.12.2013    source источник


Ответы (1)


Код возврата приложения обычно представляет собой беззнаковый байт. Обычно возврат -1 из приложения дает либо -1, либо 255 (двоичное представление -1 рассматривается как целое число без знака). В этом случае похоже, что по крайней мере версия оболочки, которая поставляется с git, неправильно обрабатывает отрицательное значение (это может быть связано с тем фактом, что коды выхода представлены как 32-битные целые числа без знака в Windows). Изменение примера кода для возврата 1 вместо -1 заставляет его работать в bash.

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

P.S.

Также проверьте награду "Бесполезное использование теста". Ваш хук лучше бы выглядел так:

#!/bin/sh

if ! ./bin/Verification.exe
then 
    echo "Failed verfication: canceling commit"
    exit 1
fi
exit 0
person xaizek    schedule 27.12.2013
comment
Спасибо, это сработало! Также спасибо за улучшенное условное предложение. - person fredw; 27.12.2013