2

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

#!/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

谢谢!

4

2 回答 2

5

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

  • 任何预提交脚本都会阻止提交直到完成。如果我签入十几个文件,该脚本运行需要多长时间?当我第一次接触计算时,第二秒的响应时间被认为是可以接受的。现在,如果你在几秒钟内没有得到回应,人们就会抱怨。
  • 在那些checkstyle没有问题的情况下,或者开发人员编写它的方式实际上比checkstyle坚持应该的更清晰和更容易理解的情况下会发生什么?当你使用类似checkstyleor的东西时findbugs,你必须明白你会得到一些误报。

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

  • 自动存储构建结果。然后,您实际上可以直接从 Jenkins 发布代码以供测试和为您的客户使用。毕竟,您知道您测试过的相同 jar/ear/war 文件与您的客户将获得的相同。
  • 自动运行各种测试,包括:
    • 格纹风格
    • 查找错误
    • 科尔贝图拉
    • PMD
    • 干燥
    • JUnit
    • 检查内置警告
    • 和其他几十个
  • Jenkins 将整个构建输出、所有保存的工件和所有测试保存在一个美观且易于查看的网页中,任何用户都可以使用该网页。
  • Jenkins 可以集成到各种问题跟踪工具中,因此您可以查看 Jenkins 构建特定问题所涉及的内容。

您不必使用 Jenkins。哈德森还在。CruiseControl 也是如此,您可以使用 TeamCity、Bamboo 和其他数十种持续构建系统。我喜欢 Jenkins,因为开发非常活跃,而且设置起来非常简单。第一次听说它时,我花了大约 30 分钟下载并运行我的第一份工作。

我知道你问过你的 pre-commit 钩子,我不想听起来像一个推销员(Jenkins 是免费和开源的,我与该项目没有任何联系),但是做一些复杂的事情,比如checkstyle检查 pre -commit 钩子是自找麻烦。使用持续构建服务器只是处理此问题的更好方法。

于 2012-04-25T16:57:21.117 回答
0

一个提示。

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

也许您在树干和树枝之间有区别,例如:

主干:/tmp/12/code/file.java

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

于 2012-04-25T12:55:04.530 回答