Gnu Сделать другой статус выхода из скрипта и оболочки

Основной код:

def make_check(local, master, old_revno, old_revid, future_revno, future_revid,
    tree_delta, future_tree):
    try:
        check_call('make check', shell=True)
    except CalledProcessError as e:
        raise BzrError(e)

Результат: bzr: ERROR: команда 'make check' вернула ненулевой статус выхода 2

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

Если я бегу make check из консоли он существует со статусом 0.

Если я бегу make check из ловушки предварительной фиксации в Bazaar он существует со статусом 2.

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

В обоих случаях выходные данные из сценариев одинаковы, но в случае ловушки precommit состояние выхода равно 2 без каких-либо объяснений, которые я могу различить, поскольку последний вызванный им процесс имел состояние выхода ноль и никаких других внешних системные вызовы. Есть ли что-то, что я пропускаю, или, возможно, есть какой-то шанс внутренней ошибки в make?

Приставка

16436 execve("/usr/bin/make", ["make", "check"], [/* 22 vars */]) = 0
#Big snip
16947 execve("/bin/sh", ["/bin/sh", "-c", "find archive/rpm/6 -name '*.rpm' -printf '%f\\n' | rev | cut -d- -f3- | rev | sort | uniq -c | grep -v '^ *1 ' &&  \\\n{ echo \"ERROR: Found duplicate RPMs in archive.\"; exit 1; } || true"], [/* 35 vars */]) = 0
#Big snip
16948 exit_group(0)                     = ?
16947 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16949
16947 --- SIGCHLD (Child exited) @ 0 (0) ---
16947 rt_sigreturn(0x11)                = 16949
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16948
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16950
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16951
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16952
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16953
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 16954
16947 exit_group(0)                     = ?
16436 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16947
16436 --- SIGCHLD (Child exited) @ 0 (0) ---
16436 rt_sigreturn(0xffffffff)          = 16947
16436 rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM XCPU XFSZ], NULL, 8) = 0
16436 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
16436 chdir("/code/n/branches/jeff")    = 0
16436 close(1)                          = 0
16436 munmap(0x7f7ed780e000, 4096)      = 0
16436 exit_group(0)

скрипт

14001 execve("/usr/bin/make", ["make", "check"], [/* 21 vars */]) = 0
#Big snip
14525 execve("/bin/sh", ["/bin/sh", "-c", "find archive/rpm/6 -name '*.rpm' -printf '%f\\n' | rev | cut -d- -f3- | rev | sort | uniq -c | grep -v '^ *1 ' &&  \\\n{ echo \"ERROR: Found duplicate RPMs in archive.\"; exit 1; } || true"], [/* 34 vars */]) = 0
#Big snip
14526 exit_group(0)                     = ?
14525 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14527
14525 --- SIGCHLD (Child exited) @ 0 (0) ---
14525 rt_sigreturn(0x11)                = 14527
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14526
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14528
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14529
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14530
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14531
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 14532
14525 exit_group(0)                     = ?
14001 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14525
14001 --- SIGCHLD (Child exited) @ 0 (0) ---
14001 rt_sigreturn(0xffffffff)          = 14525
14001 rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM XCPU], NULL, 8) = 0
14001 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
14001 chdir("/code/n/branches/jeff")    = 0
14001 close(1)                          = 0
14001 munmap(0x7f064aa7b000, 4096)      = 0
14001 exit_group(2)                     = ?

Обновить

Я добавил следующие цели в мой Makefile:

.PHONY: foobar

foobar:
        echo "Testing foobar"

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

1 ответ

Решение

По сути, это была проблема создания Makefile. bzr запущенный make который включал в себя множество файлов Makefile, некоторые из которых были построены, один из которых зависел от bzr команда, которая не смогла получить блокировку, потому что другой процесс bzr удерживал ее. Так как он был запущен из включения и имел настройку FORCE, он всегда вызывал бы сбой для любой цели при запуске из bzr, но не было очевидно, потому что это не остановило make команда, как и большинство ошибок.

Другие вопросы по тегам