2

コミットする前にJavaScriptファイルをチェックするためにJavaScriptLintを使用するために、次のpre-commitフックがあります。

#!/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#番号はトランザクション番号です

しかし、 svncommitでは正しくエラーになりません。

私はすでに説明しました:

  • $ PATHがないので、すべてのコマンドパスを明示的に設定しました。
  • 終了用のjslコマンドから正しいエラーコードをキャッチしています。
  • jslコマンドのSTDOUTをSTDERRにプッシュしているので、コミット失敗時に表示されます。

私は何が欠けていますか?

あなたの、
トレバー

4

3 に答える 3

3

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

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

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

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

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

source /home/username/.bash_profile
于 2010-12-02T21:45:13.067 に答える
3

長く曲がりくねった道の後で答えを見つけました。基本的に、上記のスクリプトでは、svnコマンドで-rを使用していますpre-commitフックでは、-rではなく-tを使用する必要があります。完全なスクリプトは次のとおりです。

#!/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
于 2010-12-03T16:05:14.180 に答える
0

探しているエラーが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 ]
于 2010-12-02T23:45:59.527 に答える