用于checkstyle的Svn预提交钩子

时间:2012-04-25 12:48:22

标签: svn hook checkstyle pre-commit

这是我当前的checkstyle shell脚本。如果我在TRUNK上提交但在分支上没有,它可以正常工作。我真的不明白为什么它不起作用。有人可以帮助我吗?

#!/bin/sh

###################################################
#
# Verify Checkstyle
#
###################################################

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

SVNLOOK=/usr/bin/svnlook
JAVA=/opt/ibm/java2-i386-50/bin/java
CHECKSTYLE=/usr/local/checkstyle/checkstyle-all-5.1.jar
TMPDIR=/tmp/$TXN
REPORT=/tmp/$TXN/report
CHECKSTYLE_CONFIG=/usr/local/checkstyle/checkstyle.xml

CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | grep -v "^D" | awk '{print $2}'`
mkdir -p $TMPDIR
for LINE in $CHANGED ; do
    FILE=`echo $LINE | egrep -v Test\\.java$ | egrep -v \\/src\\/test\\/ | egrep -v \\/js\\/ext`
    if [ -n "$FILE" ] ; then
        DIRNAME=`dirname $FILE`
        mkdir -p $TMPDIR/$DIRNAME
        $SVNLOOK cat $REPOS --transaction $TXN $FILE > $TMPDIR/$FILE
    fi
done
$JAVA -jar $CHECKSTYLE -c $CHECKSTYLE_CONFIG -r $TMPDIR > $TMPDIR/tmpfile.checkstyle
X=$?
if [ $X -ne 0 ] ; then
    cat $TMPDIR/tmpfile.checkstyle > /dev/stderr
    rm -Rf $TMPDIR
    exit 1
fi
rm -Rf $TMPDIR

exit 0

谢谢!

2 个答案:

答案 0 :(得分:5)

建议:不要将此作为预提交脚本。

  • 任何预提交脚本都会阻止提交,直到完成为止。如果我签入了十几个文件,这个脚本运行需要多长时间?当我第一次进入计算时,第二秒的响应时间被认为是可以接受的。现在,如果你在几秒钟内没有得到答复,人们就会抱怨。
  • checkstyle捕获某些不存在问题的内容,或者开发人员编写它的方式实际上比checkstyle坚持它的内容更清晰,更容易理解的情况会发生什么?当您使用checkstylefindbugs之类的内容时,您必须了解自己会得到一些误报。

更好的方法是使用像Jenkins这样的连续构建引擎。 Jenkins可以设置为每次提交时自动启动构建。詹金斯可以:

  • 自动存储构建结果。然后,您可以直接从Jenkins发布代码以进行测试和为您的客户。毕竟,你知道你测试过的jar / ear / war文件与你的客户会得到的相同。
  • 自动运行各种测试,包括:
    • Checkstyle的
    • FindBugs的
    • Corbertura
    • PMD
    • DRY
    • JUnit的
    • 检查内置警告
    • 还有其他几十个人
  • Jenkins将整个构建输出,所有保存的工件以及所有测试保存在一个可供任何用户使用的简单易用的网页中。
  • Jenkins可以集成到各种问题跟踪工具中,因此您可以看到Jenkins构建特定问题的内容。

您不必使用Jenkins。哈德森还在那里。 CruiseControl也是如此,您可以使用TeamCity,Bamboo和其他许多连续构建系统。我喜欢Jenkins,因为开发非常活跃,设置起来很简单。我花了大约30分钟下载并在我第一次听到它的时候开始了我的第一份工作。

我知道你问过你的预提交钩子,我不想听起来像推销员(Jenkins是免费的开源软件,而且我与项目没有关系),但做了像checkstyle检查预提交挂钩是否有问题。使用连续构建服务器只是解决此问题的更好方法。

答案 1 :(得分:0)

提示。

尝试比较目录结构,暂时创建(删除“rm -Rf $ TMPDIR”)。

也许你在主干和分支之间有不同之处,如:

外线: /tmp/12/code/file.java

分支机构: /tmp/br1/12/code/file.java