繁体   English   中英

SVN预提交钩子检查样式

[英]Svn pre-commit hook for checkstyle

这是我当前的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

谢谢!

忠告:不要将此作为预先提交的脚本。

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

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

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

您不必使用詹金斯。 哈德森仍然在那里。 CruiseControl也是如此,您可以在那里使用TeamCity,Bamboo和许多其他连续构建系统。 我喜欢Jenkins,因为开发非常活跃,而且设置非常简单。 我花了30分钟左右的时间下载并开始我的第一份工作。

我知道您问过您的预提交钩子,但我不想听起来像个推销员(詹金斯是自由开放的源代码,并且我与项目没有任何联系),但是像检查checkstyle一样复杂。提交前的钩子正在请求麻烦。 使用连续构建服务器只是解决此问题的更好方法。

一个提示。

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

也许您在主干和分支之间有区别,例如:

中继线:/tmp/12/code/file.java

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM