为什么我的SVN预先承诺的挂钩在本地工作,但不能在提交上工作?
-
30-09-2019 - |
题
我有以下使用预先承诺的挂钩 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提交上没有正确错误。
我已经考虑了:
- 没有$路径,我明确设置了所有命令路径。
- 我正在从JSL命令中捕获正确的错误代码以进行退出。
- 我将STDOUT推向stderr for jsl命令,以便将其显示在提交失败中。
我想念什么?
你的,
特雷弗
解决方案 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
其他提示
您正在运行的程序之一可能期望设置某些环境变量。
从 存储库的创建和配置:
出于安全原因,Subversion存储库用空的环境执行挂钩脚本 - 也就是说,根本没有设置环境变量,甚至不是$ PATH或%路径%。因此,当他们的挂钩脚本手工运行正常时,许多管理员都会感到困惑,但是在颠覆运行时不起作用。确保在钩子中明确设置环境变量和/或使用程序的绝对路径。
尝试在没有设置任何环境变量的情况下在本地执行它们,并查看是否有效。
我通常最终会在挂钩脚本的第一行中导入所有环境:
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 ]
不隶属于 StackOverflow