Проверьте, комментируется ли класс Java в хуке SVN Precommit

Я хочу убедиться, что Java-класс закомментирован, прежде чем кто-то что-то сделает в SVN-репозитории. Поэтому я хочу реализовать следующий рабочий процесс:

  1. Пользователь меняет что-то в классе
  2. Пользователь хочет зафиксировать класс
  3. Перед выполнением фиксации в хранилище SVN или что-то еще проверяет, есть ли комментарии перед классом и перед public методы (для Java AutoDoc).
  4. Если есть комментарии => Подтвердить, В противном случае вернуть сообщение об ошибке

Как я могу это понять? Я много узнал о хуках предварительной фиксации. Но все было о проверке, если установлено сообщение коммита / комментарий.

Было бы очень приятно и полезно, если бы кто-то мог предоставить решение этой проблемы.

1 ответ

Решение

Да, вы можете сделать это, используя CheckStyle.

Сначала скачайте флягу CheckStyle и установите ее где-нибудь. Затем создайте новый конфигурационный файл xml для CheckStyle, чтобы проверить, есть ли в ваших открытых методах / классах какой-то 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 hook, вот так:

#!/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 и конфигурации CheckStyle.

В следующий раз, когда вы попытаетесь зафиксировать файл Java без комментариев JavaDoc для открытого метода / класса, фиксация будет отменена, и вы получите сообщение об ошибке:

$ 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.

Другие вопросы по тегам