Почему я получаю эту ошибку: сбой перехвата после фиксации (код выхода 255) без вывода

#php #svn #mantis #post-commit-hook

#php #svn #mantis #перехват после фиксации

Вопрос:

Я получаю следующую ошибку при фиксации в репозитории:

 post-commit hook failed (exit code 255) with no output.
  

Код после фиксации выглядит следующим образом:

 @echo off

setlocal enableextensions

set REPOS=%1
set REV=%2
set TEMPFILE=C:TEMP%REV%.txt
set LOGFILE=D:svnlogsmysitepost_commit.log

set MANTIS_PATH="D:homemantis"

"C:Program FilesSlikSvnbinsvnlook" author %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt
"C:Program FilesSlikSvnbinsvnlook" date %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt
"C:Program FilesSlikSvnbinsvnlook" changed %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt
echo revision:[%REV%] >> %TEMPFILE% 2>>C:TEMPerr.txt
"C:Program FilesSlikSvnbinsvnlook" log %REPOS% -r %REV% >> %TEMPFILE% 2>>C:TEMPerr.txt

date /T >> %LOGFILE% 2>>C:TEMPerr.txt
time /T >> %LOGFILE% 2>>C:TEMPerr.txt
D:wampbinphpphp5.3.0php.exe %MANTIS_PATH%scriptscheckin.php < %TEMPFILE% >> %LOGFILE% 2>>C:TEMPerr.txt
  
  • Как вы можете видеть, ведется обширное протоколирование ошибок, но журнал ошибок никогда не заполняется (если я не ввожу очевидную ошибку, такую как отсутствующий путь)
  • Обе среды разработки и Live — это Windows
  • Строка, которая, похоже, указывает на ошибку, является последней — где вызывается PHP. Когда я извлекаю это, фиксация работает без проблем
  • Когда я запускаю это вручную в командной строке, это работает и не показывает никаких (очевидных) ошибок. Afaik svn запускается в СИСТЕМЕ пользователем по умолчанию, который имеет достаточно высокие привилегии, чтобы не беспокоиться

Как вы, вероятно, поняли, это подключение моих проверок SVN к Mantis bug tracker. Интересно то, что PHP-скрипт выполняется, т. Е. Примечания добавляются к ошибкам и автоматическое закрытие проблем работает. По какой-то причине это просто кажется ошибкой.

Я использую TortoiseSVN для фиксации, но использую командную строку (SlikSVN) Я получаю тот же вывод:

 svn ci -m "this is a test" test.txt
Sending        test.txt
Transmitting file data .
Committed revision 1337.

Warning: post-commit hook failed (exit code 255) with no output.
  

Mantis’ checkin.php выглядит следующим образом (некоторые общие комментарии удалены для удобства чтения):

 #!/usr/bin/php -q
<?php

global $g_bypass_headers;
$g_bypass_headers = 1;
require_once( dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'core.php' );

# Make sure this script doesn't run via the webserver
if( php_sapi_name() != 'cli' ) {
    echo "checkin.php is not allowed to run through the webserver.n";
    exit( 1 );
}

# Check that the username is set and exists
$t_username = config_get( 'source_control_account' );
if( is_blank( $t_username ) || ( user_get_id_by_name( $t_username ) === false ) ) {
    echo "Invalid source control account ('$t_username').n";
    exit( 1 );
}

if( !defined( "STDIN" ) ) {
    define( "STDIN", fopen( 'php://stdin', 'r' ) );
}

# Detect references to issues   concat all lines to have the comment log.
$t_commit_regexp = config_get( 'source_control_regexp' );
$t_commit_fixed_regexp = config_get( 'source_control_fixed_regexp' );

$t_comment = '';
$t_issues = array();
$t_fixed_issues = array();
while(( $t_line = fgets( STDIN, 1024 ) ) ) {
    $t_comment .= $t_line;
    if( preg_match_all( $t_commit_regexp, $t_line, $t_matches ) ) {
        $t_count = count( $t_matches[0] );
        for( $i = 0;$i < $t_count;  $i ) {
            $t_issues[] = $t_matches[1][$i];
        }
    }

    if( preg_match_all( $t_commit_fixed_regexp, $t_line, $t_matches ) ) {
        $t_count = count( $t_matches[0] );
        for( $i = 0;$i < $t_count;  $i ) {
            $t_fixed_issues[] = $t_matches[1][$i];
        }
    }
}

# If no issues found, then no work to do.
if(( count( $t_issues ) == 0 ) amp;amp; ( count( $t_fixed_issues ) == 0 ) ) {
    echo "Comment does not reference any issues.n";
    exit( 0 );
}

# Login as source control user
if( !auth_attempt_script_login( $t_username ) ) {
    echo "Unable to loginn";
    exit( 1 );
}

# history parameters are reserved for future use.
$t_history_old_value = '';
$t_history_new_value = '';

# add note to each bug only once
$t_issues = array_unique( $t_issues );
$t_fixed_issues = array_unique( $t_fixed_issues );

# Call the custom function to register the checkin on each issue.

foreach( $t_issues as $t_issue_id ) {
    if( !in_array( $t_issue_id, $t_fixed_issues ) ) {
        helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, false ) );
    }
}

foreach( $t_fixed_issues as $t_issue_id ) {
    helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, true ) );
}

exit( 0 );
  

Ответ №1:

Обычно я рекомендую не использовать пакетные скрипты для перехватов Subversion. Существует множество бесплатных языков сценариев с открытым исходным кодом, которые являются более мощными и с которыми проще работать. Черт возьми, я даже не использую BASH для сценариев перехвата.

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


При этом вам нужно будет выполнить некоторую отладку. Ваш скрипт перехвата завершается с ошибкой через svn commit командную строку. Это означает, что это не проблема, связанная с Tortoise. Это проблема со скриптом перехвата. Поскольку это сценарий перехвата после, попробуйте запустить сам скрипт из командной строки и передать ему репозиторий и ревизию из командной строки:

 C> post-commit C:reposmy_repo 2323
  

Это работает?

Проблема в том, что вы ничего не печатаете на STDERR , поэтому Subversion нечего печатать. Вы записываете STDERR в файл. Удалите 2>>C:TEMPerr.txt , чтобы вы могли видеть вывод ошибки. В Python, BASH и Perl я мог бы захватить STDERR и все равно распечатать его, но я не уверен, как это сделать в пакетном скрипте.

Это позволило бы вам увидеть вывод ошибки и, возможно, помогло бы вам определить, где происходит сбой вашего скрипта. Происходит ли сбой перед вызовом вашего PHP-скрипта? Что-то происходит в вашем PHP-скрипте? Есть ли сделанные вами предположения, которые не обязательно верны?

Кроме того, не просто echo вставляйте в свой PHP-перехват. Subversion ничего не печатает на STDOUT , независимо от того, выполняется ли перехват успешно или с ошибкой. Используйте fputs(STDERR, 'My Error Message'); вместо echo или print . Это отправит ваше сообщение об ошибке в STDERR, и Subversion распечатает его, если ваш скрипт перехвата завершится с ошибкой.

Надеюсь, это поможет.

Комментарии:

1. » — Строка, которая, по-видимому, указывает на ошибку, является последней — где вызывается PHP. Когда я удаляю это, фиксация работает без проблем — когда я запускаю это вручную в командной строке, это работает и не показывает никаких (очевидных) ошибок. Afaik svn запускается в СИСТЕМЕ пользователем по умолчанию, который имеет достаточно высокие привилегии, чтобы не беспокоиться » вышесказанное взято из пунктов моего вопроса. Да, я попробовал это вручную, и это работает нормально. Кроме того, последняя строка, PHP, определенно является причиной проблемы. Я удалил это, и это работает нормально, повторное включение прерывает его. Спасибо за другие советы!

Ответ №2:

Я также сталкивался с этим. Убедитесь, что для вашего скриптового файла установлены права на исполняемый файл.