检查是否在SVN Precommit挂钩中注释了Java类

时间:2014-02-15 10:27:02

标签: java svn pre-commit-hook autodoc

我想确保在有人向SVN存储库提交内容之前评论Java类。 所以我想实现以下工作流程:

  1. 用户更改了课程中的内容
  2. 用户想要提交课程
  3. 在执行对存储库的提交之前,SVN或其他东西检查在类之前和public方法之前是否有注释(对于Java AutoDoc)。
  4. 如果有评论=>提交,否则返回错误消息
  5. 我怎么能意识到这一点?我发现了许多关于预提交钩子的事情。但一切都是关于检查是否设置了提交消息/评论。

    如果有人能为这个问题提供解决方案,那将是非常好的和有用的。

1 个答案:

答案 0 :(得分:1)

是的,你可以使用CheckStyle来完成。

首先,下载CheckStyle jar,并将其安装在某处。 然后,为CheckStyle创建一个新的xml config file来检查你的公共方法/类是否有一些JavaDoc(你可以称之为 javadoc_check.xml ):

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
                    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name="Checker">
    <module name="TreeWalker">
        <module name="JavadocMethod">
            <property name="scope" value="public"/>
        </module>
        <module name="JavadocType">
            <property name="scope" value="public"/>
        </module>
    </module>
</module>

一旦完成,你就可以创建pre_commit钩子,就像那样:

#!/bin/bash

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

CHECKSTYLEJAR=/path/to/checkstyle-5.7/checkstyle-5.7-all.jar
CHECKSTYLECONFIG=/path/to/javadoc_check.xml

SVNLOOK=/usr/bin/svnlook
JAVA=/usr/bin/java

EXITSTATUS=0
ERRORMARKER=__ERROR_MARKER__

# Create temporary dir
TMPDIR=$(mktemp -d)

# Iterate on the files commited
while read changeline;
do
    # Get the filename
    file=${changeline:4}

    # Check if it's an Updated or Added java file
    if [[ $file == *.java && ($changeline == U* || $changeline == A*) ]] ; then
        # Get the file content in a temporary file
        $SVNLOOK cat -t "$TXN" "$REPOS" "$file" > $TMPDIR/${file##*/}

        echo -e "\n=> Checking $file"
        # Check the file with checkstyle
        ( $JAVA -jar $CHECKSTYLEJAR -c $CHECKSTYLECONFIG $TMPDIR/${file##*/} 2>&1 || echo "$ERRORMARKER" 1>&2 ) | sed -e "s{$TMPDIR/{{"

        # Delete the temporary file
        rm $TMPDIR/${file##*/}
    fi
done < <($SVNLOOK changed -t "$TXN" "$REPOS") 3>&2 2>&1 1>&3 | grep "$ERRORMARKER" && EXITSTATUS=1 # Check for errors

# Delete temporary dir
rmdir $TMPDIR

exit $EXITSTATUS

不要忘记更改CheckStyle jar和CheckStyle配置的路径。

下次您尝试在公共方法/类上提交没有JavaDoc注释的java文件时,提交将被取消,并且您将收到一条错误消息:

$ svn commit
Sending        test.java
Transmitting file data .svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:

=> Checking test.java
Starting audit...
test.java:9:1: Missing a Javadoc comment.
Audit done.

svn: E165001: Your commit message was left in a temporary file:
svn: E165001:    '/path/to/project/svn-commit.1.tmp'
$

如果你提交了多个文件,那么将检查所有文件,只有当所有修改/添加的java文件都有JavaDoc注释时才会授权提交。