なぜ私のSVNプレコミットフックはローカルで動作するのですが、コミットでは機能しませんか?

StackOverflow https://stackoverflow.com/questions/4340215

質問

使用する以下の事前コミットフックがあります JavaScript Lint コミットする前にJavaScriptファイルをチェックするために:

#!/bin/env bash

REPOS="$1"
TXN="$2"

ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed

SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -r$TXN $REPOS | $SED -e "s/^....//g"`

JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.conf

for FILE in $FILES_CHANGED
do
        if $ECHO $FILE | $GREP "\.js$"
        then
                $SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
                JSL_ERROR_CODE=$?
                if [ $JSL_ERROR_CODE != 0 ]
                then
                        exit $JSL_ERROR_CODE
                fi
        fi
done

# If we got here, nothing is wrong.
exit 0

このコード 地元で動作します 次のように:./pre-commit/my/svn/repo/location 6781#番号はトランザクション番号です

しかし SVNコミットでは正しくエラーではありません。

私はすでに説明しています:

  • $パスはありません。すべてのコマンドパスを明示的に設定します。
  • ExitのJSLコマンドから正しいエラーコードをキャッチしています。
  • JSLコマンドのStdoutをStderrにプッシュしているので、Commit Failで表示されます。

何が足りないの?

あなた、
トレバー

役に立ちましたか?

解決 2

長く曲がりくねった道の後に答えを発見しました。基本的に、上記の私のスクリプトで私は使用しています -R 私のSVNコマンドでは、 しかし事前コミット使用する必要があります -t, 、-Rではありません. 。完全なスクリプトは以下にあります:

#!/bin/sh

REPOS="$1"
TXN="$2"

ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed

SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -t$TXN $REPOS | $SED -e "s/^....//g"`

JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.default.conf

for FILE in $FILES_CHANGED
do
    if $ECHO $FILE | $GREP "\.js$"
    then
        $SVNLOOK cat -t$TXN $REPOS $FILE | $JSL -conf $JSL_CONF -stdin -nologo 1>&2
        JSL_ERROR_CODE=$?
        if [ $JSL_ERROR_CODE != 0 ]
        then
            exit $JSL_ERROR_CODE
        fi
    fi
done

# If we got here, nothing is wrong.
exit 0

他のヒント

実行しているプログラムの1つが、いくつかの環境変数が設定されることを期待する可能性があります。

から リポジトリの作成と構成:

セキュリティ上の理由から、Subversionリポジトリは空の環境を持つフックスクリプトを実行します。つまり、環境変数はまったく設定されておらず、$ PATHまたは%パス%でもありません。このため、フックスクリプトが手で正常に実行されると、多くの管理者が困惑していますが、Subversionによって実行されても動作しません。フック内の環境変数を明示的に設定したり、プログラムに絶対パスを使用したりしてください。

環境変数を設定せずにローカルに実行して、それが機能するかどうかを確認してください。

私は通常、フックスクリプトの最初の行ですべての環境をインポートすることになります。

source /home/username/.bash_profile

あなたが探しているエラーが来ている場合 svn パイプラインではむしろ jsl, 、 それから $? 返品コードが含まれていません。使用する ${PIPESTATUS[@]} 代わりは。これは、パイプラインの各メンバーの返品コードを含む配列です。不特定の障害を確認するための簡単な方法は、次のとおりです。

$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ! ${PIPESTATUS[@]} =~ 1 ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]

また

$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ${PIPESTATUS[@]} != *1* ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top