我提交了以下预提交钩子,以便在提交之前使用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上没有正确错误。
我已经考虑过了:
我错过了什么?
此致,
特雷弗
答案 0 :(得分:3)
您正在运行的某个程序可能需要设置一些环境变量。
来自Repository Creation and Configuration:
出于安全原因,Subversion存储库执行具有空环境的钩子脚本 - 也就是说,根本没有设置环境变量,甚至不是$ PATH或%PATH%。因此,许多管理员在他们的钩子脚本手动运行时感到困惑,但是在Subversion运行时不起作用。确保在钩子中显式设置环境变量和/或使用程序的绝对路径。
尝试在没有设置任何环境变量的情况下在本地执行它们,看看是否有效。
我通常最终会在我的钩子脚本的第一行导入我的所有环境:
source /home/username/.bash_profile
答案 1 :(得分:3)
经过漫长而曲折的道路,我发现了答案。基本上,在上面的脚本中,我在我的svn命令中使用 -r ,在预提交钩子you must use -t, not -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
答案 2 :(得分: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 ]