2

我有以下预提交钩子,可以在提交之前使用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 commit 上没有正确错误。

我已经说明了:

  • 没有 $PATH,我明确设置了所有命令路径。
  • 我从 jsl 命令中捕获了正确的错误代码以退出。
  • 我正在将 jsl 命令的 STDOUT 推送到 STDERR,因此它将显示在提交失败中。

我错过了什么?

你的,
特雷弗

4

3 回答 3

3

经过漫长而曲折的道路,我找到了答案。基本上,在我上面的脚本中,我在我的 svn 命令中使用-r ,预提交钩子中,你必须使用-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
于 2010-12-03T16:05:14.180 回答
3

您正在运行的程序之一可能需要设置一些环境变量。

存储库创建和配置

出于安全原因,Subversion 存储库使用空环境执行挂钩脚本——也就是说,根本没有设置任何环境变量,甚至没有设置 $PATH 或 %PATH%。正因为如此,当他们的钩子脚本手动运行良好时,许多管理员感到困惑,但在 Subversion 运行时却无法正常工作。请务必在您的钩子中明确设置环境变量和/或使用程序的绝对路径。

尝试在不设置任何环境变量的情况下在本地执行它们,看看是否有效。

我通常会在我的钩子脚本的第一行导入我所有的环境:

source /home/username/.bash_profile
于 2010-12-02T21:45:13.067 回答
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 回答