3

誰かが何かを SVN リポジトリにコミットする前に、Java クラスがコメントされていることを確認したいと思います。そこで、次のワークフローを実現したいと思います。

  1. ユーザーがクラス内で何かを変更する
  2. ユーザーがクラスをコミットしたい
  3. リポジトリへのコミットを実行する前に、SVN などはクラスの前とメソッドの前にコメントがあるかどうかをチェックしpublicます (Java AutoDoc の場合)。
  4. コメントがある場合 => コミット、そうでない場合はエラー メッセージを返す

どうすればこれを理解できますか?pre-commit フックについて多くのことを見つけました。しかし、コミットメッセージ/コメントが設定されているかどうかを確認することがすべてでした。

誰かがこの問題の解決策を提供できれば、とても助かります。

4

1 に答える 1

1

はい、 CheckStyleを使用して実行できます。

まず、CheckStyle jar をダウンロードして、どこかにインストールします。次に、CheckStyle の新しいxml 構成ファイルを作成して、パブリック メソッド/クラスに 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 コメントがある場合にのみコミットが許可されます。

于 2014-02-26T05:16:17.697 に答える