1

リポジトリにコミットすると、次のエラーが発生します。

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:\svn\logs\mysite\post_commit.log

set MANTIS_PATH="D:\home\mantis"

"C:\Program Files\SlikSvn\bin\svnlook" author %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt
"C:\Program Files\SlikSvn\bin\svnlook" date %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt
"C:\Program Files\SlikSvn\bin\svnlook" changed %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt
echo revision:[%REV%] >> %TEMPFILE% 2>>C:\TEMP\err.txt
"C:\Program Files\SlikSvn\bin\svnlook" log %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt

date /T >> %LOGFILE% 2>>C:\TEMP\err.txt
time /T >> %LOGFILE% 2>>C:\TEMP\err.txt
D:\wamp\bin\php\php5.3.0\php.exe %MANTIS_PATH%\scripts\checkin.php < %TEMPFILE% >> %LOGFILE% 2>>C:\TEMP\err.txt
  • ご覧のとおり、広範なエラーログがありますが、エラーログにデータが入力されることはありません(パスがないなどの明らかなエラーを入力しない限り)
  • 開発環境とライブ環境はどちらもWindowsです
  • エラーの原因と思われる行が最後の行です。PHPが呼び出されます。これを取り出すと、コミットは問題なく機能します
  • これをコマンドラインで手動で実行すると、機能し、(明らかな)エラーは表示されません。Afaik svnは、デフォルトのユーザーでSYSTEMの下で実行されます。これは、心配する必要がないほど十分に高い特権です。

おそらくお気づきかもしれませんが、これは私のSVNチェックインをMantisバグトラッカーに接続しています。興味深いのは、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 ) && ( 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 login\n";
    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 );
4

2 に答える 2

1

私は通常、Subversionフックにバッチスクリプトを使用しないことをお勧めします。より強力で操作が簡単な、無料のオープンソースのスクリプト言語がたくさんあります。ちなみに、フックスクリプトにはBASHも使用していません。

フックスクリプトはサーバー上でのみ実行する必要があり、他の場所では実行する必要がないため、これは特に当てはまります。つまり、単一のプラットフォームで動作させるだけで済みます。


そうは言っても、デバッグを行う必要があります。フックスクリプトはsvn commitコマンドラインから失敗します。つまり、亀に関連する問題ではないということです。これはフックスクリプトの問題です。これはポストフックスクリプトであるため、コマンドラインからスクリプト自体を実行し、コマンドラインからリポジトリとリビジョンを渡してみてください。

C> post-commit C:\repos\my_repo 2323

それは動作しますか?

問題は、に何も印刷していSTDERRないため、Subversionが印刷するものがないことです。STDERRをファイルにキャプチャしています。を削除して2>>C:\TEMP\err.txt、エラー出力を確認できるようにします。Python、BASH、Perlでは、STDERRをキャプチャして印刷することはできましたが、バッチスクリプトでこれを行う方法がわかりません。

これにより、エラー出力を確認でき、スクリプトが失敗している場所を特定するのに役立つ場合があります。PHPスクリプトを呼び出す前に失敗していませんか?PHPスクリプトで何かが起こっていますか?必ずしも有効ではない仮定を立てていますか?

echoまた、 PHPフックに単に詰め込むだけではいけません。SubversionはSTDOUT、フックが成功したか失敗したかに関係なく、何も出力しません。またはfputs(STDERR, 'My Error Message');の代わりに使用します。これにより、エラーメッセージがSTDERRに送信され、フックスクリプトが失敗した場合、Subversionはエラーメッセージを出力します。echoprint

お役に立てれば。

于 2011-05-09T12:37:36.467 に答える
0

私もこれにぶつかっていました。スクリプトファイルのアクセス許可が実行可能に設定されていることを確認してください。

于 2013-11-01T17:12:19.610 に答える